我有一个custom layer
,在此自定义图层的一行中,我确实这样:
out = tf.Variable(tf.zeros(shape=tf.shape(tf_a1), dtype=tf.float32))
运行代码时,我收到此错误:
ValueError:initial_value必须具有指定的形状: Tensor(“ lambda_1 / zeros_2:0”,shape =(?, 20),dtype = float32)
我搜索了一下,发现可以使用validate_shape=False
所以我将代码更改为:
out = tf.Variable(tf.zeros(shape=tf.shape(tf_a1), dtype=tf.float32), validate_shape=False)
然后引发此错误:
ValueError:输入0与层转发器不兼容:预期 ndim = 2,找到的ndim = None
更新1
当我尝试这个时:
out = tf.Variable(tf.zeros_like(tf_a1, dtype=tf.float32))
它再次引发错误:
initial_value必须具有指定的形状: Tensor(“ lambda_1 / zeros_like:0”,shape =(?, 20),dtype = float32)
此外,当我像这样明确给出它时:
out = tf.Variable(tf.zeros(shape=(BATCH_SIZE, LATENT_SIZE), dtype=tf.float32))
它会引发此错误:
ValueError:操作具有
None
用于渐变。请确定 您所有的操作都定义了渐变(即 可区分的)。不带渐变的常见操作:K.argmax,K.round, 埃瓦尔。
以防万一,该模型可以帮助您找出错误的来源:
这是lambda层,其中只需稍微改变一下矩阵即可:
def score_cooccurance(tf_a1):
N = tf.shape(tf_a1)[0]
n = 2
input_tf = tf.concat([tf_a1, tf.zeros((1, tf_a1.shape[1]), tf_a1.dtype)], axis=0)
tf_a2 = tf.sort(sent_wids, axis=1)
first_col_change = tf.zeros([tf_a2.shape[0], 1], dtype=tf.int32)
last_cols_change = tf.cast(tf.equal(tf_a2[:, 1:], tf_a2[:, :-1]), tf.int32)
change_bool = tf.concat([first_col_change, last_cols_change], axis=-1)
not_change_bool = 1 - change_bool
tf_a2_changed = tf_a2 * not_change_bool + change_bool * N #here
idx = tf.where(tf.count_nonzero(tf.gather(input_tf, tf_a2_changed, axis=0), axis=1) >= n)
y, x = idx[:, 0], idx[:, 1]
rows_tf = tf.gather(tf_a2, y, axis=0)
columns_tf = tf.cast(x[:, None], tf.int32)
out = tf.Variable(tf.zeros(shape=(BATCH_SIZE, LATENT_SIZE), dtype=tf.float32))
rows_tf = tf.reshape(rows_tf, shape=[-1, 1])
columns_tf = tf.reshape(
tf.tile(columns_tf, multiples=[1, tf.shape(tf_a2)[1]]),
shape=[-1, 1])
sparse_indices = tf.reshape(
tf.concat([rows_tf, columns_tf], axis=-1),
shape=[-1, 2])
v = tf.gather_nd(input_tf, sparse_indices)
v = tf.reshape(v, [-1, tf.shape(tf_a2)[1]])
scatter = tf.scatter_nd_update(out, tf.cast(sparse_indices, tf.int32), tf.reshape(v, shape=[-1]))
return scatter
实际上,当我打印出out
的形状时,它也会打印出<unknown>
。
任何想法或技巧如何解决?
我正在使用tensorflow 1.13.
感谢您的帮助:)
答案 0 :(得分:0)
因此,在我的情况下,解决方法是删除tf.variable
和仅有的tf.zeros
。
在这种情况下,tf.scater_nd_update
会引发错误,因为它无法应用于tensors
。
似乎有tensor_scatter_nd_update
我以前不知道。因此我也更改了该行,现在代码可以正常工作,尽管我没有得到错误的主要原因。我只是将其更改为这种方式,以使其成功运行。
out = tf.zeros(shape=tf.shape(tf_a1), dtype=tf.float32)
scatter = tf.tensor_scatter_update(out, tf.cast(sparse_indices, tf.int32), tf.reshape(v, shape=[-1]))
感谢@Daniel Moller指出了可训练变量的概念...:)