我正在使用Tensorflow训练多层卷积网络。我对两层没有任何问题。对于第三层,当我定义权重时,它给出了错误必须完全定义新变量的形状,但相反是(?,128)。 我看到了这个SOF link并使用了 reuse = True ,但错误仍然存在。任何帮助都会非常有帮助。
以下是我的代码:
with tf.variable_scope('local3') as scope:
reshape = tf.reshape(pool2, shape=[batch_size, -1])
dim = reshape.get_shape()[1].value
weights = tf.get_variable('weights',
shape=[dim,128],
dtype=tf.float32,
initializer=tf.truncated_normal_initializer(stddev=0.005,dtype=tf.float32))
biases = tf.get_variable('biases',
shape=[128],
dtype=tf.float32,
initializer=tf.constant_initializer(0.1))
local3 = tf.nn.relu(tf.matmul(reshape, weights) + biases, name=scope.name)
此处 batch_size为32 且 pool2为shape =(?,14,14,16)的张量。
注意:当我在函数中执行它时,此代码有效。为什么?
答案 0 :(得分:0)
未完全定义权重的形状,Tensorflow变量不允许这样做。
在运行会话之前无法计算dim
因为它取决于pool2
的形状,这在第一维上未定义。
如果pool2
的实际形状为(batch_size,14,14,16),我建议您对代码进行以下更改(未经测试):
import numpy as np
with tf.variable_scope('local3') as scope:
dim = np.prod(pool2.get_shape()[1:]).value
reshape = tf.reshape(pool2, shape=[-1, dim])
weights = tf.get_variable('weights',
shape=[dim, 128],
dtype=tf.float32,
initializer=tf.truncated_normal_initializer(stddev=0.005,dtype=tf.float32))
biases = tf.get_variable('biases',
shape=[128],
dtype=tf.float32,
initializer=tf.constant_initializer(0.1))
local3 = tf.nn.relu(tf.matmul(reshape, weights) + biases, name=scope.name)
dim
现在 14 * 14 * 16 而不是?,因此您的权重现在具有完全定义的形状。此外,您可以在运行之间更改batch_size
,而无需重建计算图,因为batch_size
不再用于定义张量形状。
答案 1 :(得分:0)
在使用tensorflow == 1.9.0时出现此类错误尝试将其升级到tensorflow == 1.11.0对我有用!