必须完全定义新变量的形状,而是(?,128)

时间:2017-09-11 10:08:24

标签: python tensorflow

我正在使用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)的张量。

注意:当我在函数中执行它时,此代码有效。为什么?

2 个答案:

答案 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对我有用!