我们有两个LSTM层,即firstLayer和secondLayer。 secondLayer,从firstLayer的单元状态复制其单元状态。
secondLayer的输入始终为常数,为零。
问题在于反向传播。渐变不会通过firstLayer的输出反向传播,因为输出不会输入到secondLayer中。
但是,渐变应该在状态中反向传播。 (因为我们将firstLayer的状态提供给secondLayer。)
我们试图实现这一目标。但似乎渐变无法在单元状态中反向传播。
该如何解决?
我们在初始化firstLayer时试图获取firstLayer的状态。 然后,我们尝试使用实例secondLayer的“状态”变量来分配secondLayer的权重。
def grad(w1,w2):
input_img=Input(shape=(3,40,40,1),name="input")
#firstLayer
x1,h1,c1 = ConvLSTM2D(filters=w1,kernel_size=(4,4),strides=(1,1),padding="same",name="firstLayer",return_sequences=True,return_state=True)(input_img)
#secondLayer
secondLayer = ConvLSTM2D(filters=w2,kernel_size=(4,4),strides=(1,1),padding="same",name="secondLayer",return_sequences=True)
zerosTensor=Lambda(lambda x: K.zeros_like(x, dtype=np.float32))(x1)
secondLayer.states[0]=h1
secondLayer.states[1]=c1
y1= secondLayer(zerosTensor)
model= Model(input_img, outputs=y1)
return model
我们认为不会进行反向传播的原因是因为我们收到以下错误:
“ ValueError:操作具有None
的渐变。请确保所有操作都定义了渐变(即可区分)。不带渐变的常见操作:K.argmax,K.round,K。评估。”