我正在尝试创建一个变量,然后尝试使用我的卷积层的值来分配它。
然而它拒绝是因为即使我在创建变量时通过了validate_shape=False
,它也说形状不相等。
卷积形状为[32,20,20,3]
。如何将其传递给变量?
conv = tf.layers.conv2d_transpose(conv, filters=3, kernel_size=3, strides=(2,2), padding='same',activation=tf.nn.relu) # TO ASSIGN LATER
g=tf.Variable(([32,20,20]),dtype=tf.float32,validate_shape=False)#THE VARIABLE
loss = tf.reduce_mean(tf.square(conv))
opt = tf.train.AdamOptimizer().minimize(loss)
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(1000):
_, xx,inp,output,target = sess.run([opt, loss,x,conv,y])#
print(xx)
print("subtraction result:",output[0]-target[0])
g=g.assign(conv)
print(g.eval())
我收到此错误:
InvalidArgumentError: Assign requires shapes of both tensors to match. lhs shape= [3] rhs shape= [32,20,20,3]
[[Node: Assign_7 = Assign[T=DT_FLOAT, use_locking=false, validate_shape=true, _device="/job:localhost/replica:0/task:0/device:CPU:0"](Variable_9, conv2d_transpose_98/Relu)]]
有人可以帮忙解决这个问题吗?
答案 0 :(得分:1)
我想你想要:
import numpy as np
import tensorflow as tf
g = tf.Variable(initial_value=np.zeros((32,20,20,3)), expected_shape=(32,20,20,3), dtype=tf.float32)
如果您打印g
,现在可以获得正确的形状:
<tf.Variable 'Variable_3:0' shape=(32, 20, 20, 3) dtype=float32_ref>
你做的是这个:
g = tf.Variable(initial_value=(32,20,20), dtype=tf.float32, valid_shape=False)
如果没有声明expected_shape
您违反了位置参数,则根据以下文档,tf.Variable
的第一个参数为initial_value
:
__init__(
initial_value=None,
trainable=True,
collections=None,
validate_shape=True,
caching_device=None,
name=None,
variable_def=None,
dtype=None,
expected_shape=None,
import_scope=None,
constraint=None
)
您声明的initial_value
形状将是一个长度为[3]
的向量,这正是分配操作所抱怨的形状。
故事的道德:如果可以的话,通过名称声明参数通常会减少错误。 :)