2017-04-24 150 views
9

我創建了幾個簡單的模型,主要基於一些教程。從我所做的事情來看,我覺得模型很難重用,我覺得我需要用類來創建一些結構來封裝模型。張量流模型的設計模式

構建tensorflow模型的「標準」方法是什麼?有沒有任何編碼習慣/最佳做法呢?

+0

這個問題不是太寬泛。在谷歌Tensorflow和它會很好,如果有人從那裏分享他們的約定結構模型。 –

回答

3

在整個Tensorflow例子和教程用於結構模型代碼的突出圖案,以向上分割模型分成三個功能:

  • inference(inputs, ...)它建立這增加了在頂部的損失模型
  • loss(logits, ...)在logits
  • train(loss, ...)這增加了訓練OPS

當創建一個模型FO [R訓練,您的代碼會是這個樣子:

inputs = tf.placeholder(...) 
logits = mymodel.inference(inputs, ...) 
loss = mymodel.loss(logits, ...) 
train = mymodel.train(loss, ...) 

這種模式用於CIFAR-10教程例如(codetutorial)。

可能偶然發現的一件事是,您不能在inferenceloss函數之間共享(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) 

有了這個,你可以計算出,包括正規化的處罰,就像上面的損失。

+0

這是一個很好的模式,但這裏有一個問題。如果我們有正規化術語作爲損失的一部分,它將不起作用。 –

+0

有一個很好的方法來使用Graph Collections來做這件事,我更新了答案。 – thertweck