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