Luk*_*dio 10 lambda theano keras
我有一个图层输出我想要乘以标量.我可以用lambda图层做到这一点,即
sc_mult = Lambda(lambda x: x * 2)(layer)
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.但是如果我想为每个例子使用不同的标量,我会尝试将它们作为第二个输入提供形状(例子,1)
input_scalar = Input(shape = (1L,))
Run Code Online (Sandbox Code Playgroud)
因此我的lambda层变成了
sc_mult = Lambda(lambda x: x * input_scalar)(layer)
Run Code Online (Sandbox Code Playgroud)
但是现在这在火车时间会引发错误.注意,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.
Run Code Online (Sandbox Code Playgroud)
我假设我没有通过输入层输入正确的形状,但无法解决原因.
小智 6
不确定回答一个老问题是否有用,但也许其他人遇到了同样的问题。
问题确实是标量的形状与输入(或 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
Run Code Online (Sandbox Code Playgroud)
现在全out[0,:,:,:]是零,全out[1,:,:,:]是 1,全out[31,:,:,:]是31s,等等。
| 归档时间: |
|
| 查看次数: |
4771 次 |
| 最近记录: |