我创建了几个简单的模型,主要基于一些教程。从我所做的事情来看,我觉得模型很难重用,我觉得我需要用类来创建一些结构来封装模型。张量流模型的设计模式
构建tensorflow模型的“标准”方法是什么?有没有任何编码习惯/最佳做法呢?
我创建了几个简单的模型,主要基于一些教程。从我所做的事情来看,我觉得模型很难重用,我觉得我需要用类来创建一些结构来封装模型。张量流模型的设计模式
构建tensorflow模型的“标准”方法是什么?有没有任何编码习惯/最佳做法呢?
在整个Tensorflow例子和教程用于结构模型代码的突出图案,以向上分割模型分成三个功能:
inference(inputs, ...)
它建立这增加了在顶部的损失模型loss(logits, ...)
在logitstrain(loss, ...)
这增加了训练OPS当创建一个模型FO [R训练,您的代码会是这个样子:
inputs = tf.placeholder(...)
logits = mymodel.inference(inputs, ...)
loss = mymodel.loss(logits, ...)
train = mymodel.train(loss, ...)
这种模式用于CIFAR-10教程例如(code,tutorial)。
可能偶然发现的一件事是,您不能在inference
和loss
函数之间共享(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)
有了这个,你可以计算出,包括正规化的处罚,就像上面的损失。
这是一个很好的模式,但这里有一个问题。如果我们有正规化术语作为损失的一部分,它将不起作用。 –
有一个很好的方法来使用Graph Collections来做这件事,我更新了答案。 – thertweck
这个问题不是太宽泛。在谷歌Tensorflow和它会很好,如果有人从那里分享他们的约定结构模型。 –