Keras使用标量乘以层输出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keras使用标量乘以层输出相关的知识,希望对你有一定的参考价值。

我有一个图层输出我想要乘以标量。我可以用lambda图层做到这一点,即

sc_mult = Lambda(lambda x: x * 2)(layer)

哪个工作正常。但是如果我想为每个例子使用不同的标量,我会尝试将它们作为第二个输入提供形状(例子,1)

input_scalar = Input(shape = (1L,))

因此我的lambda层变成了

sc_mult = Lambda(lambda x: x * input_scalar)(layer)

但是现在这在火车时间会引发错误。注意,32是批量大小,128是图层输入(和输出)的维度 - 图层输入乘以标量是(batch_size x 32(前一层中的过滤器)x 128(空间暗淡)x 128 (空间昏暗))。

GpuElemwise. Input dimension mis-match. Input 5 (indices start at 0) has shape[2] == 32, but the output's size on that axis is 128.

我假设我没有通过输入层提供正确的形状,但无法解决原因。

答案

不确定回答旧问题是否有用,但也许其他人遇到了同样的问题。

问题确实是标量的形状与输入(或x)的形状。你应该使用np.reshape重新塑造你的标量,使其具有与你所乘的矩阵一样多的维度,例如:

from keras import *
from keras.layers import *
import numpy as np

# inputs
X = np.ones((32,32,128,128))
s = np.arange(32).reshape(-1,1,1,1) # 1 different scalar per batch example, reshaped
print(X.shape, s.shape)

# model
input_X = Input(shape=(32,128,128))
input_scalar = Input(shape = (1,1,1))
sc_mult = Lambda(lambda x: x * input_scalar)(input_X)
model = Model(inputs=[input_X, input_scalar], outputs=sc_mult)

out = model.predict([X,s])
out

现在out[0,:,:,:]全是零,out[1,:,:,:]是全部,out[31,:,:,:]都是31s,等等。

以上是关于Keras使用标量乘以层输出的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 中使用标量常数来衡量隐藏的标量输出

将元组乘以标量

keras 的指标返回啥值?标量还是张量?

用标量角张量创建变换矩阵

使用 keras ResNet50 模型进行二进制分类的输出层

将 RGB 图像数组乘以标量后使用 plt.imshow 获取黑色图