我創建了幾個簡單的模型,主要基於一些教程。從我所做的事情來看,我覺得模型很難重用,我覺得我需要用類來創建一些結構來封裝模型。張量流模型的設計模式
構建tensorflow模型的「標準」方法是什麼?有沒有任何編碼習慣/最佳做法呢?
我創建了幾個簡單的模型,主要基於一些教程。從我所做的事情來看,我覺得模型很難重用,我覺得我需要用類來創建一些結構來封裝模型。張量流模型的設計模式
構建tensorflow模型的「標準」方法是什麼?有沒有任何編碼習慣/最佳做法呢?
在整個Tensorflow例子和教程用於結構模型代碼的突出圖案,以向上分割模型分成三個功能:
inference(inputs, ...)
它建立這增加了在頂部的損失模型loss(logits, ...)
在logitstrain(loss, ...)
這增加了訓練OPS當創建一個模型FO [R訓練,您的代碼會是這個樣子:
inputs = tf.placeholder(...)
logits = mymodel.inference(inputs, ...)
loss = mymodel.loss(logits, ...)
train = mymodel.train(loss, ...)
這種模式用於CIFAR-10教程例如(code,tutorial)。
可能偶然發現的一件事是,您不能在inference
和loss
函數之間共享(Python)變量。但這並不是一個大問題,因爲Tensorflow爲這個用例提供了Graph collections,使得設計更加簡潔(因爲它可以讓你按邏輯分組)。主要用途之一,因爲這是正規化:
如果您使用的是layers
模塊(例如tf.layers.conv2d
)你已經擁有你所需要的,因爲所有的正規化處罰將被默認添加(source)到集合tf.GraphKeys.REGULARIZATION_LOSSES
。例如,當你這樣做:
conv1 = tf.layers.conv2d(
inputs,
filters=96,
kernel_size=11,
strides=4,
activation=tf.nn.relu,
kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
kernel_regularizer=tf.contrib.layers.l2_regularizer(),
name='conv1')
你的損失可能是這樣的,那麼:
def loss(logits, labels):
softmax_loss = tf.losses.softmax_cross_entropy(
onehot_labels=labels,
logits=logits)
regularization_loss = tf.add_n(tf.get_collection(
tf.GraphKeys.REGULARIZATION_LOSSES)))
return tf.add(softmax_loss, regularization_loss)
如果你不使用層模塊,你將不得不手動(就像在填充集合鏈接的源代碼片段)。基本上你想要的處罰添加到使用tf.add_to_collection
集合:
tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, reg_penalty)
有了這個,你可以計算出,包括正規化的處罰,就像上面的損失。
這是一個很好的模式,但這裏有一個問題。如果我們有正規化術語作爲損失的一部分,它將不起作用。 –
有一個很好的方法來使用Graph Collections來做這件事,我更新了答案。 – thertweck
這個問題不是太寬泛。在谷歌Tensorflow和它會很好,如果有人從那裏分享他們的約定結構模型。 –