LSTM层状态的反向传播

时间:2019-07-18 13:54:17

标签: keras lstm

我们有两个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。评估。”

0 个答案:

没有答案