web-dev-qa-db-ja.com

Kerasはスカラーでレイヤー出力を乗算します

スカラーを掛けたいレイヤー出力があります。私はラムダレイヤーでこれを行うことができます

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.

入力レイヤーを介して正しい形状をフィードしていないと思いますが、その理由を理解できません。

10
Luke_radio

古い質問に答えるのが役立つかどうかはわかりませんが、他の誰かが同じ問題に遭遇した可能性があります。

問題は確かに、スカラーの形状と入力(または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,:,:,:]はすべて31sなどになります。

5
Torec