スカラーを掛けたいレイヤー出力があります。私はラムダレイヤーでこれを行うことができます
sc_mult = Lambda(lambda x: x * 2)(layer)
これは正常に動作します。ただし、例ごとに異なるスカラーを使用する場合は、これらを2番目の入力として形状とともに提供しようとします(例、1)
input_scalar = Input(shape = (1L,))
したがって、私のラムダレイヤーは
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,:,:,:]
はすべて1、out[31,:,:,:]
はすべて31
sなどになります。