Tensorflow 2.0自定义层在31个输入时崩溃,但在33个输入时还好



我正在研究一个非常简单的自定义层,它输出一个可训练的变量,但忽略输入:

import tensorflow as tf
inputs  = tf.random.normal(shape=[500,1])
class MyLayer(tf.keras.Model):
def __init__(self):
super(MyLayer, self).__init__()
def build(self, input_shape):
print( "Input shape", input_shape)
self.kernel = tf.Variable( [-1.0] )
def call(self, input):
print( " Call", input.shape )
return self.kernel
model = MyLayer()
model.predict( inputs[:33] )
model = MyLayer()
model.predict( inputs[:31] )

第一个model.prpredict调用成功并返回一个33长度的数组。但第二个呼叫崩溃了并显示错误消息:ValueError:预期的批次大小与模型输出批次大小不匹配。输出形状=(1,(,预期输出形状=形状(31,(

为什么第一个调用成功,而第二个调用失败?

顺便说一句,如果我将调用定义中的"return self.kernel"替换为"return input*0.0+self.kerne",那么一切都会按预期进行,但我认为应该可以在不需要乘以零的情况下完成这一操作,这似乎是不必要的。

我正在尝试实现一个层,其中输出是可训练的,但不依赖于输入。

如有任何见解,我们将不胜感激。谢谢

我发现的解决此问题以便处理批处理的一种方法是使用tensorflow.map_fn,即沿批处理轴映射值。可以通过更改return语句来管理它。

return tf.map_fn( lambda x: self.kernel, input, dtype=tensorflow.float32 )

相关内容

最新更新