我正在尝试构建一个具有可变批量大小,可变整形和可变重量形状的图形。我正在使用tensorflow 1.3.0。
使用下面的代码, tf.get_variable 会抛出 TypeError:int()参数必须是字符串或数字,而不是'Tensor'。 pool2 在代码中的其他位置定义。
# declare placeholder for variable batch size
images_ph = tf.placeholder(tf.float32, shape=[None, 64, 64, 1])
# code for 2 layers of convolution, normalization and max pooling
# reshape to perform, one matrix multiply
reshape = tf.reshape(pool2, [tf.shape(images_ph)[0], -1])
dim = tf.shape(reshape)[1]
var = tf.get_variable('name', [dim, 384], validate_shape=False)
我还尝试用 dim 替换“正确”类型,如下所示:
dim = reshape.get_shape()[1]
dim 等于无并抛出 ValueError:必须完全定义新变量(local3 / xpto)的形状,而是(?) ,384)。
答案 0 :(得分:1)
get_variable
的第二个参数采用整数或字符串,但正如错误所示,您已经给它一个张量[dim, 384]
。
请参阅:https://www.tensorflow.org/api_docs/python/tf/get_variable
答案 1 :(得分:0)
tf.shape
会返回一个张量,因此[dim, 384]
中的 dim 是张量;这是一个需要的int。
尝试dim = reshape.get_shape().as_list()[1]
#output属于int类型
答案 2 :(得分:0)
感谢大家尝试提供帮助。
鉴于我将 pool2 的输出展平以仅执行一个matmul,解决方案是明确计算重塑的第二维的长度。这是在第1行和第2行计算的,其中第一行的 [1:] 偏移量来自变量批量大小。
我无法使用重塑形状,未指定所有尺寸。
pool2_shapes = pool2.get_shape().as_list()[1:]
pool2_features_length = reduce(lambda x, y: x*y, pool2_shapes)
reshape = tf.reshape(pool2, [tf.shape(images)[0], pool2_features_length])