Python Keras-将张量形状用于K.zeros形状

Python Keras-将张量形状用于K.zeros形状,python,tensorflow,neural-network,keras,keras-2,Python,Tensorflow,Neural Network,Keras,Keras 2,我正在使用自定义softmax功能。我试图使用张量的形状x作为新的零张量的形状元素。因为它不是int,所以无法执行 def custom_softmax(x): sh = K.shape(x) ... xc = K.zeros((sh[0] * 16 * 16, 1)) ... 我尝试的下一个选择是计算张量,它应该有效,但不能 def custom_softmax(x): sh = K.shape(x) sess = K.get_se

我正在使用自定义
softmax
功能。我试图使用张量的形状
x
作为新的零张量的形状元素。因为它不是int,所以无法执行

def custom_softmax(x):
    sh = K.shape(x)
    ...      
    xc = K.zeros((sh[0] * 16 * 16, 1))
    ...
我尝试的下一个选择是计算张量,它应该有效,但不能

def custom_softmax(x):
    sh = K.shape(x)
    sess = K.get_session()
    ...      
    xc = K.zeros((sh[0].eval(session=sess) * 16 * 16, 1))
    ...
这给了我错误

tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'image_part_input' with dtype float

这是完全不可理解的,因为它引用了不正确的主网络输入。当我在
K.zeros
中硬编码形状值时,网络工作。还有其他解决方案吗?

我用
Tensorflow
解决了我的问题,而不是@Yu Yang建议的
Keras
。我使用了
tf.fill
函数代替
K.zeros
函数,该函数可以接受张量作为形状

def custom_softmax(x):
    sh = K.shape(x)
    ...      
    xc = tf.fill(tf.stack([sh[0] * 16 * 16, 1]), 0.0)
    ...

我用
Tensorflow
解决了我的问题,而不是@Yu-Yang建议的
Keras
。我使用了
tf.fill
函数代替
K.zeros
函数,该函数可以接受张量作为形状

def custom_softmax(x):
    sh = K.shape(x)
    ...      
    xc = tf.fill(tf.stack([sh[0] * 16 * 16, 1]), 0.0)
    ...

你能提供更多的上下文吗?例如,
sh[0]
是批次大小,还是
None
(表示它可以是任何值),还是一个固定的超参数?@Yu-Yang
sh
是具有四个值的张量
[批次大小、高度、宽度、通道]
。它是通过
sh=K.shape(x)
收集的,正如您在我问题的代码中看到的那样
sh[0]
在本例中是int,表示
batch\u size
,但仍然是Keras张量,因为
sh
是Keras张量。如果是批量大小,为什么不将其作为函数的参数提供?您正在处理需要非固定批量的问题吗?如果您将此自定义softmax功能用作损失,可能会有所帮助。如果您在
Lambda
层中使用它,您可以使用类似
Lambda(自定义\u softmax,参数={'batch\u size':batch\u size})
的东西来传递它。虽然不是纯Keras,但我认为您可以尝试类似
tf.fill(tf.stack([sh[0]*16*16,1]),0.0)
(尽管我还没有测试过)的东西,您能提供更多的上下文吗?例如,
sh[0]
是批次大小,还是
None
(表示它可以是任何值),还是一个固定的超参数?@Yu-Yang
sh
是具有四个值的张量
[批次大小、高度、宽度、通道]
。它是通过
sh=K.shape(x)
收集的,正如您在我问题的代码中看到的那样
sh[0]
在本例中是int,表示
batch\u size
,但仍然是Keras张量,因为
sh
是Keras张量。如果是批量大小,为什么不将其作为函数的参数提供?您正在处理需要非固定批量的问题吗?如果您将此自定义softmax功能用作损失,可能会有所帮助。如果您在
Lambda
层中使用它,您可以使用
Lambda(自定义\u softmax,参数={'batch\u size':batch\u size})
之类的东西传递它。虽然不是纯Keras,但我认为您可以尝试类似
tf.fill(tf.stack([sh[0]*16*16,1]),0.0)
(尽管我还没有测试过)