2017-04-24 127 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