首页 > 解决方案 > 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)]]

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

标签: tensorflow

解决方案


我想你想要:

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.Variableinitial_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]这正是分配操作所抱怨的形状。

故事的寓意:如果可以的话,按名称声明参数通常不会那么麻烦。:)


推荐阅读