我搜索过并发现了类似的问题,但似乎没有一个问题与我所面临的问题相同。我正在尝试使用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图层应该能够处理不同维度的输入/输出对,这是正确的吗?
答案 0 :(得分:0)
在output_shape
中,您不会考虑批量大小。所以这是正确的:(3,)
但在张量中,批量大小不会被忽略。表达式结果中至少需要两个维度:(Batch_size,3)。
另外,不要使用张量元素,使用整个张量。我还没有发现使用单独元素很重要或有用的情况(因为你应该对整个批次执行完全相同的操作)
我建议您使用K.repeat_elements(B, rep=3, axis=-1)