tensorflow - 如何更改 tensorflow.layers.dense() 层的输入?
问题描述
在张量流中,layers.dense(inputs, units, activation) 实现了一个具有任意激活函数的多层感知器层。假设我像这样定义了我的密集层:
inputx = tf.placeholder(float, shape=[batch_size, input_size])
dense_layer = tf.layers.dense(inputx, 128, tf.nn.relu)
现在稍后我想给它一些其他输入,比如在从检查点恢复它之后,或者出于某种原因仅仅在同一个图中:
inputx_2 = tf.some_operation(whatever_thisdoes, shape = [batch_size_2, input_size])
inputx = tf.placeholder(float, shape=[batch_size, input_size])
dense_layer = tf.layers.dense(inputx, 128, tf.nn.relu)
我现在怎么能得到dense_layer,它可能已经预训练了权重来应用于inputx_2?(如果可能,不为 input_y 分配 inputx_2 的值?)使用不同的 batch_size(batch_size_2 而不是 batch_size)会导致任何麻烦吗?
解决方案
您可以使用 'name' 和 'reuse' 参数来实现此行为:
inputx = tf.placeholder(float, shape=[batch_size, input_size])
inputx_2 = tf.some_operation(whatever_thisdoes, shape = [batch_size_2, input_size])
dense_layer = tf.layers.dense(inputx, 128, tf.nn.relu, name='dense_layer')
dense_layer2 = tf.layers.dense(inputx_2, 128, tf.nn.relu, name='dense_layer', reuse=True)
由于“重用”属性,dense_layer 和dense_layer2 共享权重,但dense_layer 应用于input_x,dense_layer2 应用于inputx_2。
有不同的batch_size(batch_size_2而不是batch_size)会引起任何麻烦吗?
不,您可以轻松地验证这一点:
with tf.Session() as sess:
out = dense_layer.eval({inputx: np.ones([batch_size, input_size])})
out2 = dense_layer2.eval({inputx_2: np.ones([batch_size_2, input_size])})
assert np.array_equal(out[0,:], out2[0,:])
我建议您创建一个前向传递函数,以便为您的所有模型轻松重现此行为,例如:
def forward_pass(x, name='Model', reuse=False):
with tf.variable_scope(name, reuse=reuse):
x = tf.some_ops(x, ...)
...
return x
然后,您可以将任何张量传递给前向传递,在您的情况下:
out = forward_pass(inputx)
out2 = forward_pass(inputx_2, reuse=True)
推荐阅读
- cobol - 你能接受同一行 COBOL 上的两个输入吗?
- java - 我如何实现一个没有工具栏的汉堡图标?
- java - React Native Splash Screen 问题 - 修改 android 文件夹中的 xml 文件后
- java - 查看 int[][] 是否包含特定值
- python-3.x - 用ffmpeg切音频文件得到无持续时间python 3
- javascript - 将 mongodb 集合项添加到不和谐嵌入
- qt - 如何在 Windows 10 上为 Qt 设置 OpenSSL?
- c# - C# ODBC 插入 BLOB
- apache-spark - Spark 查询上的 Hive 因资源不足而挂起
- javascript - 在保留键值的同时将两个对象合并到数组中