tensorflow模型的设计模式

tensorflow模型的设计模式,tensorflow,Tensorflow,我创建了几个简单的模型,主要基于一些教程。从我所做的工作来看,我觉得模型很难重用,我觉得我需要创建一些带有类的结构来封装模型 构建tensorflow模型的“标准”方法是什么?是否有任何编码约定/最佳实践?在整个Tensorflow示例和教程中,构建模型代码的突出模式是将模型分成三个功能: 推理(输入,…)它构建了模型 loss(logits,…)它将损失添加到logits之上 训练(丢失)增加训练操作 创建培训模型时,您的代码如下所示: inputs = tf.placeholder(..

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


构建tensorflow模型的“标准”方法是什么?是否有任何编码约定/最佳实践?

在整个Tensorflow示例和教程中,构建模型代码的突出模式是将模型分成三个功能:

  • 推理(输入,…)
    它构建了模型
  • loss(logits,…)
    它将损失添加到logits之上
  • 训练(丢失)
    增加训练操作
创建培训模型时,您的代码如下所示:

inputs = tf.placeholder(...)
logits = mymodel.inference(inputs, ...)
loss = mymodel.loss(logits, ...)
train = mymodel.train(loss, ...)
此模式用于CIFAR-10教程,例如(,)

有一件事可能会让人绊倒,那就是您不能在
推断
丢失
函数之间共享(Python)变量。不过这并不是一个大问题,因为Tensorflow正好提供了这个用例,使得设计更加简洁(因为它使您能够逻辑地对您的事物进行分组)。这方面的一个主要用例是正则化:

如果您正在使用
layers
模块(例如
tf.layers.conv2d
),您已经拥有了所需的内容,因为默认情况下,所有正则化惩罚都将()添加到集合
tf.GraphKeys.regulation\u loss
。例如,执行此操作时:

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)
如果不使用“层”模块,则必须手动填充集合(就像链接的源代码片段中一样)。基本上,您希望使用以下方法将惩罚添加到集合中:


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

我认为这张图片是有用的,这里显示的所有模型类型也可以在TenfsorFlow中编码


这是一个不错的模式,但这里有一个问题。如果我们有一个正则化项作为损失的一部分,它将不起作用。有一种很好的方法可以使用图形集合来实现这一点,我更新了答案。问题并不太广泛。谷歌的Tensorflow,如果有人能分享他们构建模型的惯例,那就太好了。我认为本主题中的设计模式指的是将源代码组织成可重用的片段。而不是现在设计神经网络的结构
tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, reg_penalty)