我正在尝试使用Keras Dot,并有以下错误。你能解释一下我做错了什么吗?
x1 = Input(shape=(2,4))
x2 = Input(shape=(4,))
y1 = dot([x1,x2], axes = (2,1))
modelA = Model(inputs=[x1, x2], outputs=y1)
a1 = np.arange(16).reshape(2,2,4)
a2 = np.array( [1,2,3,4] )
modelA.predict([a1,a2])
---->
ValueError: Error when checking : expected input_40 to have shape (None, 4) but
got array with shape (4, 1)发布于 2019-07-08 06:26:12
我对凯拉斯也很陌生。下面是我在玩Dot操作后得出的结论。
首先,输入层的shape参数不包括批量大小。在您的代码中,x2 = Input(shape=(4,)),所以x2期望输入数据为(None,4),(None指批处理大小),但是a2是np.array([1,2,3,4]),形状是(1,4),因此出现了错误消息。要消除错误,需要将batch_size维度添加到a2中。
但是还有另一个问题,根据Dot的文档,我认为x1和x2应该具有相同的批处理大小:
如果应用于形状的两个张量a和b的列表(batch_size,n),输出将是形状张量(batch_size,1),其中每个条目i将是ai和bi之间的点积。
因此,我手动匹配a1和a2的批处理大小,而a1的批处理大小为2,因此a2需要为np.array([[1,2,3,4],[1,2,3,4]])。
现在你可以得到你渴望的结果:
[[ 20. 60.] [100. 140.]]
对于像我这样的初学者来说,还有几个词,x1的形状是(batch_size,2,4),x2的形状是(batch_size,4),它们似乎不兼容。现在是“轴”参数起作用的时候了。在OP的代码中,axes=(2,1)的意思是点x1的第三轴(0-索引,它是长度为4的轴),和x2的第二轴(也是长度为4)。所以会是0,1,2,3dot1,2,3,4=20,4,5,6,7dot1,2,3,4=60 .
https://stackoverflow.com/questions/50897701
复制相似问题