Python 添加Lambda层后无法合并keras模型

Python 添加Lambda层后无法合并keras模型,python,machine-learning,neural-network,keras,keras-layer,Python,Machine Learning,Neural Network,Keras,Keras Layer,我有一个3个keras模型的列表,每个模型的输出形状为(无,2)。我还有一个通用的keras基础模型,可以生成它们的输入。我的目标是组合这4个模型,但只从列表中的每个模型中获取第一个输出(因此最终输出应该是shape(None,3)。当我尝试使用Lambda层从每个模型中提取第一个输出时,就会出现问题 如果我省略Lambda步骤并简单地按如下方式组合模型,它将创建一个模型,该模型使用shape(None,6)提供正确的输出: 当我第一次使用Lambda层从每个模型中提取第一个值时,就会出现问题:

我有一个3个keras模型的列表,每个模型的输出形状为
(无,2)
。我还有一个通用的keras基础模型,可以生成它们的输入。我的目标是组合这4个模型,但只从列表中的每个模型中获取第一个输出(因此最终输出应该是shape
(None,3)
。当我尝试使用Lambda层从每个模型中提取第一个输出时,就会出现问题

如果我省略Lambda步骤并简单地按如下方式组合模型,它将创建一个模型,该模型使用shape
(None,6)
提供正确的输出:

当我第一次使用Lambda层从每个模型中提取第一个值时,就会出现问题:

>>> print([m.output_shape for m in models])
[(None, 2), (None, 2), (None, 2)]
>>> for m in models:
        m.add(Lambda(lambda x: x[0], output_shape=(1,)))
>>> print([m.output_shape for m in models])
[(None, 1), (None, 1), (None, 1)]
>>> sequentials = [Sequential([base_model, m]) for m in models]
>>> print([s.output_shape for s in sequentials])
[(None, 1), (None, 1), (None, 1)]
>>> output = merge([s.output for s in sequentials],
                   output_shape=(len(sequentials),), mode='concat')
>>> combined = Model(base_model.layers[0].input, output=output)
>>> print(combined.output_shape)
(None, 3)
>>> combined.predict(X)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-4f4ed3bd605d> in <module>()
----> 1 ann.combined.predict(X)

./.virtualenvs/py3/lib/python3.4/site-packages/keras/engine/training.py in predict(self, x, batch_size, verbose)
   1217         f = self.predict_function
   1218         return self._predict_loop(f, ins,
-> 1219                                   batch_size=batch_size, verbose=verbose)
   1220
   1221     def train_on_batch(self, x, y,

./.virtualenvs/py3/lib/python3.4/site-packages/keras/engine/training.py in _predict_loop(self, f, ins, batch_size, verbose)
    904
    905             for i, batch_out in enumerate(batch_outs):
--> 906                 outs[i][batch_start:batch_end] = batch_out
    907             if verbose == 1:
    908                 progbar.update(batch_end)

ValueError: could not broadcast input array from shape (6) into shape (1)

但是我想知道如何在合并之前应用它。

问题在于
Lambda
切片中有点不一致。虽然输出的
形状
没有考虑到
批次
维度,但是应该记住,提供给
Lambda
层的
张量也有这个ad附加尺寸。这就是以下行导致错误的原因:

m.add(Lambda(lambda x: x[0], output_shape=(1,)))
这应改为:

m.add(Lambda(lambda x: x[:,:1], output_shape=(1,))) 
注意以下切片方式:

m.add(Lambda(Lambda x:x[:,0],输出形状=(1,)))


当它改变张量的维数时,你会在某个时刻编译模型吗?不确定它是否会改变任何东西,但它只是一个想法,模型都是从文件中加载的(它们在保存之前被编译和训练)。尝试
m.add(Lambda(Lambda x:x[:,0],output_shape=(1,))
@MarcinMożejko您很接近。这将错误更改为
ValueError:无法将输入数组从形状(3)广播到形状(1)
。如果我使用
lambda x:x[,:1]
,它将成功运行。既然您让我走上了正确的方向,请随意发布答案(最好有解释)我会接受的。谢谢!啊,对了。我认为
m.add(Lambda(Lambda x:x[:,[0]),output_shape=(1,))
也应该可以正常工作。
m.add(Lambda(lambda x: x[0], output_shape=(1,)))
m.add(Lambda(lambda x: x[:,:1], output_shape=(1,)))