Использование TensorFlow Keras для обучения DNN. Почему погрешность точности при использовании Dropout - PullRequest
0 голосов
/ 07 января 2019

Я использую TensorFlow Keras для создания и установки Deep Neural Network (DNN). В литературе, которую я прочитал, меня поощряют использовать слои Dropout. Но когда я добавляю dropout слоев со значением 0.5, мой приличный прогресс в градиенте действует странно. В частности, точность обучения и точность валидации, по-видимому, ограничены жестким пределом.

Что это за эффект? Почему это происходит? Любые комментарии или отзывы будут оценены.

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dropout_1 (Dropout)          (None, 136)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 84)                11508     
_________________________________________________________________
dropout_2 (Dropout)          (None, 84)                0         
_________________________________________________________________
batch_normalization_1 (Batch (None, 84)                336       
_________________________________________________________________
dense_2 (Dense)              (None, 42)                3570      
_________________________________________________________________
batch_normalization_2 (Batch (None, 42)                168       
_________________________________________________________________
dropout_3 (Dropout)          (None, 42)                0         
_________________________________________________________________
dense_3 (Dense)              (None, 21)                903       
=================================================================
Total params: 16,485
Trainable params: 16,233
Non-trainable params: 252

matplotlib.pyplot Accuracy

Вот часть кода:

InputCount = 136
OutputCount = 21
H1_Count = 84
H2_Count = 42
H3_Count = 0
H4_Count = 0
initializer = 'he_normal'
activation = ['' ,'elu','elu','elu','elu']
dropout    = [0.5,0.5  ,0.5  ,0.5  ,0.5  ]
batch_norm = 1

optimizer = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
loss = 'mse' 

epochs = 500
batch_size = 10000  #Stochatic mini-batch size

model = Sequential()

if (dropout[0] > 0) :
    model.add(Dropout(dropout[0], input_shape=(InputCount,)) )
    model.add(Dense(H1_Count, activation=activation[1], kernel_initializer=initializer ))
    if (dropout[1] > 0) : model.add(Dropout(dropout[1]))
else :
    model.add(Dense(H1_Count, activation=activation[1], kernel_initializer=initializer, input_shape=(InputCount,) ))
    if (dropout[1] > 0) : model.add(Dropout(dropout[1]))

if (batch_norm == 1) : model.add(BatchNormalization())

if (H2_Count > 0) :
    model.add(Dense(H2_Count,activation=activation[2], kernel_initializer=initializer))
    if (batch_norm == 1) : model.add(BatchNormalization())
    if (dropout[2] > 0) : model.add(Dropout(dropout[2]))

if (H3_Count > 0) :
    model.add(Dense(H3_Count, activation=activation[3], kernel_initializer=initializer))
    if (batch_norm == 1) : model.add(BatchNormalization())
    if (dropout[3] > 0) : model.add(Dropout(dropout[3]))

if (H4_Count > 0) :
    model.add(Dense(H4_Count, activation=activation[4], kernel_initializer=initializer))
    if (batch_norm == 1) : model.add(BatchNormalization())
    if (dropout[4] > 0) : model.add(Dropout(dropout[4]))

model.add(Dense(OutputCount, activation='linear'))

model.summary()

1 Ответ

0 голосов
/ 07 января 2019

Dropout хорош как метод регуляризации. Но значение выпадающего типа является гиперпараметром, и вы должны настроить его.

То, что выпадает из системы, в основном отключает определенный процент нейронов, чтобы сеть могла видеть, какие нейроны, которые не выключены, подхватывают - если это бесполезная информация или нет. Каждый раз, когда случайным образом выключается другой набор нейронов.

Итак, я думаю, что проблема для вас - слишком высокий процент выключенных нейронов (50%). Уменьшите его до 20% -30%. Другая ошибка заключается в использовании выпадения до последнего слоя, а также первого слоя. Удалите эти 2 выпадающих слоя и уменьшите процент выпадения (коэффициент отсева), и все будет в порядке :)

...