2017-10-22 3 views
0

저는 다른 많은 사람들이 사용하고있는 비교적 간단한 Keras 모델을 가지고 있습니다. 그 간단한 형태로, 그것은 다음과 같다 : n,m,p 어떤 임의의 크기이다Keras Dropout 레이어가 작동하지 않는 것 같습니다.

model = Sequential() 
model.add(Dense(n, activation="relu")) 
model.add(Dropout(dropout)) 
model.add(Dense(m, activation="relu")) 
model.add(Dropout(dropout)) 
model.add(Dense(p)) 

dropout이 강하 속도이다. 나는이 같은 모델을 훈련한다

   model.compile(loss='mae', optimizer='adam') 

       lossHistory = keras.callbacks.History() 
       model.fit_generator(train_generator, 
            steps_per_epoch=steps_per_epoch, 
            epochs=epochs, 
            validation_data=valid_generator, 
            validation_steps=validation_steps, 
            callbacks = [lossHistory]) 

아무것도 미치지 않는다. 문제는 dropout 매개 변수가 아무 효과가없는 것 같습니다. 내가 말하는 이유는 내가 사용하는 드롭 아웃 값 (0.1,0.2, ..., 0.95를 시도 했음)에 관계없이 나는 많은 초과 피팅을 얻고 있다는 것입니다.

따라서 문제를 진단하기 위해 극한 값 (dropout = 0 및 1)을 사용하려고했습니다. 나는 탈락 수가 나타내는 것을 오해하고 있을지도 모르지만,이 값들 중 하나는 모든 것이 빠져 나가게하여 모델을 근본적으로 변형 할 수 없게 만든다 (일정한 출력을 리턴해야하기 때문에).

1/20 [>.............................] - ETA: 178s - loss: 0.2134 
2/20 [==>...........................] - ETA: 102s - loss: 0.2295 
3/20 [===>..........................] - ETA: 76s - loss: 0.2368 

이 불가능합니다 같은

1/20 [>.............................] - ETA: 139s - loss: 0.9623 
2/20 [==>...........................] - ETA: 87s - loss: 0.7758 
3/20 [===>..........................] - ETA: 68s - loss: 0.6146 

다음 1의 드롭 아웃 값으로, 교육은 같습니다처럼 그러나 .... 0의 드롭 아웃 값 훈련 보인다. 내가 뭘 여기 놓친거야? 그냥 기록, model.summary의 조각()에 대한

를 반환 ... 드롭 아웃 내 Tensorflow 모델에서 나를 위해 매우 유용했다,하지만 뭔가 내가 Keras에 구현하고 방법에있어 문제점으로 나타납니다
dense_1 (Dense)    (None, 50)    550  
_________________________________________________________________ 
dropout_1 (Dropout)   (None, 50)    0   
_________________________________________________________________ 
dense_2 (Dense)    (None, 1)     51   

그래서 내가 실제로 그 모델에 드롭 아웃 레이어가있는 것 같습니다. (실수로 모델에서 제외 된 바보 같은 버그가 아닙니다.)

답변

2

드롭 아웃을 0 또는 1로 설정하면 소스 코드에서 the layer definition에 따라 누락 레이어가 무시됩니다.

def call(self, inputs, training=None): 
    if 0. < self.rate < 1.: 
     noise_shape = self._get_noise_shape(inputs) 

     def dropped_inputs(): 
      return K.dropout(inputs, self.rate, noise_shape, 
          seed=self.seed) 
     return K.in_train_phase(dropped_inputs, inputs, 
           training=training) 
    return inputs 
+0

위의 예에서 드롭 아웃 사용법이 올바른지 여부와 같은 질문의 일반적인 정신이 아닙니다. –

+0

예, 죄송합니다. kera의 백엔드 정의에서 좀 더 자세히 살펴보면,'K.dropout()'은 [그냥'tf.nn.dropout()'을 호출합니다.] (https://github.com/fchollet/keras/blob/ master/keras/backend/tensorflow_backend.py), 나는 kera의 dropout layer를 두개의 모델에서 성공적으로 사용했기 때문에 "그것이 나에게 효과가있다"고 말할 것이다. 데이터가 충분한 지 확인하거나 기능 엔지니어링에 시간을 할애하고 데이터를 시각화하고 일부 잡음을 제거 할 수 있는지 확인해야 할 수도 있습니다. –

관련 문제