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

添加不同大小输入和输出的Keras Lambda层时的广播问题,keras,keras-layer,Keras,Keras Layer,我搜索并发现了类似的问题,但没有一个问题与我所面临的问题相同。我正在尝试使用Theano后端(都是最新版本)实现Keras的神经网络,它涉及一个Lambda层,该层获取一个层的一维输出,并将其转换为一个n维向量,一维输出重复n次 我似乎遇到的问题是,在Lambda层,Keras似乎期望输入与我指定的输出形状具有相同的维度: x=Input(shape=(2,)) V1=Dense(1)(x) V2=Lambda(lambda B : B[0,0]*K.ones((3,)),output_shap

我搜索并发现了类似的问题,但没有一个问题与我所面临的问题相同。我正在尝试使用Theano后端(都是最新版本)实现Keras的神经网络,它涉及一个Lambda层,该层获取一个层的一维输出,并将其转换为一个n维向量,一维输出重复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)
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
---->1模型。预测(np。数组([1,2])。重塑((1,2)))
/预测中的Users/user/anaconda/envs/py35/lib/python3.5/site-packages/keras/engine/training.py(self,x,批量大小,详细)
1504 f=自预测函数
1505返回自循环(f,ins,
->1506批次大小=批次大小,详细=详细)
1507
1508 def系列在批次上(自身、x、y、,
/Users/user/anaconda/envs/py35/lib/python3.5/site-packages/keras/engine/training.py in\u predict\u循环(self、f、ins、批大小、详细)
1137
1138对于i,批输出在枚举中(批输出):
->1139输出[i][批处理开始:批处理结束]=批处理输出
1140如果详细==1:
1141程序条更新(批处理结束)
ValueError:无法将输入数组从形状(3)广播到形状(1)
我知道还有其他方法可以尝试这样做(
K.repeat_elements
),但这也给了我有关广播的错误消息。注意,即使我删除
B[0,0]*
(这样Lambda层根本不依赖
B
),问题仍然存在。如果我更改
(3,)
K.one
输出_形
(1,)
中,它似乎可以工作


从我所理解的,lambda层应该能够处理不同维度的输入/输出对,这是正确的吗?

< P> <代码> OutPuthStult,您不考虑批次大小。所以这是正确的:<代码>(3)< <代码> < /P> 但在张量中,批大小是不可忽略的。表达式的结果至少需要两个维度:(batch_size,3)

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


我建议您使用
K.repeat\u元素(B,rep=3,axis=-1)

非常有帮助,谢谢。我想让我感到困惑的是,在
输出形状中,批量大小占据元组中的第二个位置,而在定义lambda函数中的
K.one
张量时,批量大小位于第一个位置。你能告诉我为什么吗?记住这一点,你的sugg估计有效(在重塑
K.repeat\u元素
tensor之后)。谢谢!不,批大小总是占据第一位。我不知道为什么
(3,)
中有逗号,但它并不意味着任何有用的东西。当只有一个维度时,您只需使用该逗号。如果您有(无,3),则将其定义为(3,)。如果您有(没有,3, 4),将它定义为(3,4)。-它可能只是一个符号问题,也许有必要至少有一个逗号来创建元组。当答案是对的,请考虑将它标记为:)-这帮助其他用户在搜索答案时。