TensorFlow变量形状分配

时间:2018-05-14 20:22:20

标签: tensorflow

我正在尝试创建一个变量,然后尝试使用我的卷积层的值来分配它。

然而它拒绝是因为即使我在创建变量时通过了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)]]

有人可以帮忙解决这个问题吗?

1 个答案:

答案 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]的向量,这正是分配操作所抱怨的形状。

故事的道德:如果可以的话,通过名称声明参数通常会减少错误。 :)