我创建了几个简单的模型,主要是基于一些教程.从我所做的,我觉得模型很难重用,我觉得我需要用类来创建一些结构来封装模型.
构建张量流模型的"标准"方法是什么?是否有任何编码约定/最佳实践?
在整个 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)
人们可能会遇到的一件事是,您不能在inference
和loss
函数之间共享(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)
有了这个,您可以像上面一样计算损失,包括正则化惩罚。
归档时间: |
|
查看次数: |
2005 次 |
最近记录: |