添加具有不同大小输入和输出的Keras Lambda图层时的广播问题

时间:2017-06-29 16:09:03

标签: keras keras-layer

我搜索过并发现了类似的问题,但似乎没有一个问题与我所面临的问题相同。我正在尝试使用Theano后端(两者都是最新的)实现与Keras的神经网络,其中涉及一个Lambda层,它采用一层的一维输出,并将其转换为一个n维向量与1- d输出重复n次。

我似乎遇到的问题是,在Lambda层,Keras似乎期望输入与我指定的输出形状具有相同的尺寸:

x=Input(shape=(2,))
V1=Dense(1)(x)
V2=Lambda(lambda B : B[0,0]*K.ones((3,)),output_shape=(3,))(V1)
model=Model(inputs=x,outputs=V2)
rms = RMSprop()
model.compile(loss='mse', optimizer=rms)
model.predict(np.array([1,2]).reshape((1,2)))

给出了这个错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-40a7e91d5963> in <module>()
----> 1 model.predict(np.array([1,2]).reshape((1,2)))

/Users/user/anaconda/envs/py35/lib/python3.5/site-packages/keras/engine    /training.py in predict(self, x, batch_size, verbose)
   1504         f = self.predict_function
   1505         return self._predict_loop(f, ins,
-> 1506                                   batch_size=batch_size, verbose=verbose)
   1507 
   1508     def train_on_batch(self, x, y,

/Users/user/anaconda/envs/py35/lib/python3.5/site-packages/keras/engine/training.py in _predict_loop(self, f, ins, batch_size, verbose)
   1137 
   1138             for i, batch_out in enumerate(batch_outs):
-> 1139                 outs[i][batch_start:batch_end] = batch_out
   1140             if verbose == 1:
   1141                 progbar.update(batch_end)

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

我知道还有其他方法可以尝试这样做(K.repeat_elements),但这也给了我有关广播的错误消息。请注意,即使我删除了B[0,0]*(因此Lambda图层根本不依赖于B),问题仍然存在。如果我将(3,)K.ones中的output_shape更改为(1,),那么它似乎可以正常工作。

据我所知,Lambda图层应该能够处理不同维度的输入/输出对,这是正确的吗?

1 个答案:

答案 0 :(得分:0)

output_shape中,您不会考虑批量大小。所以这是正确的:(3,)

但在张量中,批量大小不会被忽略。表达式结果中至少需要两个维度:(Batch_size,3)。

另外,不要使用张量元素,使用整个张量。我还没有发现使用单独元素很重要或有用的情况(因为你应该对整个批次执行完全相同的操作)

我建议您使用K.repeat_elements(B, rep=3, axis=-1)