张量流模型的设计模式

Kon*_*tov 12 tensorflow

我创建了几个简单的模型,主要是基于一些教程.从我所做的,我觉得模型很难重用,我觉得我需要用类来创建一些结构来封装模型.

构建张量流模型的"标准"方法是什么?是否有任何编码约定/最佳实践?

the*_*eck 5

在整个 Tensorflow 示例和教程中,构建模型代码的突出模式是将模型拆分为三个函数:

  • inference(inputs, ...) 建立模型
  • loss(logits, ...) 这增加了对数之上的损失
  • train(loss, ...) 这增加了训练操作

创建用于训练的模型时,您的代码将如下所示:

inputs = tf.placeholder(...)
logits = mymodel.inference(inputs, ...)
loss = mymodel.loss(logits, ...)
train = mymodel.train(loss, ...)
Run Code Online (Sandbox Code Playgroud)

例如,此模式用于 CIFAR-10 教程(代码教程)。

人们可能会遇到的一件事是,您不能在inferenceloss函数之间共享(Python)变量。不过,这不是什么大问题,因为 Tensorflow 为这个用例提供了Graph 集合,从而使设计更加简洁(因为它使您可以逻辑地对事物进行分组)。一个主要用例是正则化:

如果您正在使用该layers模块(例如tf.layers.conv2d),您已经拥有了您需要的东西,因为默认情况下所有正则化惩罚都将被添加到()集合中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')
Run Code Online (Sandbox Code Playgroud)

您的损失可能如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

如果您不使用图层模块,则必须手动填充集合(就像在链接的源代码片段中一样)。基本上你想使用以下方法将惩罚添加到集合中tf.add_to_collection

tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, reg_penalty)
Run Code Online (Sandbox Code Playgroud)

有了这个,您可以像上面一样计算损失,包括正则化惩罚。