Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用tensorflow'scatter\n应用动态形状`_Python_Python 3.x_Tensorflow - Fatal编程技术网

Python 如何使用tensorflow'scatter\n应用动态形状`

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

在tensorflow中,我如何将动态形状应用于
散布

当我使用带有动态形状的输入张量时,我得到以下错误:

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)