Python 如何使用tensorflow'scatter\n应用动态形状`
在tensorflow中,我如何将动态形状应用于Python 如何使用tensorflow'scatter\n应用动态形状`,python,python-3.x,tensorflow,Python,Python 3.x,Tensorflow,在tensorflow中,我如何将动态形状应用于散布 当我使用带有动态形状的输入张量时,我得到以下错误: ValueError:无法将部分已知的张量形状转换为张量: (20,?) 这是我使用的函数。当张量具有静态形状时,它会工作。但对于动态形状(例如,(?,7)),它会失败 def tf_zero_pad_columns(tensor, columns_list, num_output_columns): assert(tensor.shape.as_list()[1] == len(c
散布
当我使用带有动态形状的输入张量时,我得到以下错误:
ValueError:无法将部分已知的张量形状转换为张量:
(20,?)
这是我使用的函数。当张量
具有静态形状时,它会工作。但对于动态形状(例如,(?,7)
),它会失败
def tf_zero_pad_columns(tensor, columns_list, num_output_columns):
assert(tensor.shape.as_list()[1] == len(columns_list))
assert(num_output_columns >= len(columns_list))
tensor = tf.transpose(tensor)
columns = tf.constant(np.array([columns_list]).T.astype('int32'))
shape=tf.TensorShape((num_output_columns, tensor.get_shape()[1]))
scattered = tf.scatter_nd(columns, tensor, shape=shape)
return tf.transpose(scattered)
我还尝试用-1
替换tensor.get_shape()[1]
,但这会在训练期间产生不同的错误:
InvalidArgumentError:维度-1必须大于等于0[[节点:
lambda_40/分散
编辑:
带有动态形状的输入示例(这会再现错误):
静态形状的输入示例:
import numpy as np
tensor_np = np.tile(range(7), (4, 1)) + np.array(range(4))[:, None]
tensor = tf.constant(tensor_np)
tf_zero_pad_columns(tensor, [11,12,13,4,5,6,7], 20)
输出为:
array([[0, 0, 0, 0, 3, 4, 5, 6, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 4, 5, 6, 7, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 5, 6, 7, 8, 0, 0, 0, 2, 3, 4, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, 3, 4, 5, 0, 0, 0, 0, 0, 0]])
这对我很有用:
def tf_zero_pad_columns(tensor, columns_list, num_output_columns):
assert(tensor.shape.as_list()[1] == len(columns_list))
assert(num_output_columns >= len(columns_list))
tensor = tf.transpose(tensor)
columns = tf.constant(np.array([columns_list]).T.astype('int32'))
tensor_shape = tf.shape(tensor)[1]
scattered = tf.scatter_nd(columns, tensor, shape=(num_output_columns, tensor_shape))
return tf.transpose(scattered)
你能提供一个输入和一个预期的输出吗?使用静态形状应该可以。我想看看这个函数应该是如何工作的,所以也许我会想到一个解决方案,它可以使用动态形状。@gorjan:我添加了预期的输入和输出,使用动态和静态形状。谢谢!让我知道我发布的解决方案是否能解决这个问题是你。
def tf_zero_pad_columns(tensor, columns_list, num_output_columns):
assert(tensor.shape.as_list()[1] == len(columns_list))
assert(num_output_columns >= len(columns_list))
tensor = tf.transpose(tensor)
columns = tf.constant(np.array([columns_list]).T.astype('int32'))
tensor_shape = tf.shape(tensor)[1]
scattered = tf.scatter_nd(columns, tensor, shape=(num_output_columns, tensor_shape))
return tf.transpose(scattered)