Я не понимаю, как ведет себя Керас, когда существует Dropout - PullRequest
0 голосов
/ 16 января 2020

Я построил нейронную сеть с Dropout, используя Keras в Python. Я хочу узнать, как эта сеть обновляет вес. Для простоты были подготовлены только одни обучающие данные.

Я обучил модель в следующих условиях: (1): модель, которая не включает слой Dropout (2): модель, которая включает слой Dropout и имеет ключевое слово training = False (выпадение игнорируется на этапе прогнозирования) (3): модель, которая включает в себя слой Dropout и устанавливает ключевое слово training = True (выпадение также используется на этапе прогнозирования)

(хочу использовать (3) для оценки неопределенности прогнозируемого значения.)

После того, как модель завершила фазу обучения, я посмотрел количество обновлений веса в модели. В частности, я показываю исходный код и результаты выполнения.

[Программа]

drrate = 0.5

sample_x = np.array([[10]])
sample_y = np.array([1])

# Model
input_layer = Input(shape=(1,))
dence = input_layer
dence = Dropout(drrate)(dence, training=False) # In Condition (1), this line doesn't use.
dence = Dense(2,
                kernel_initializer= wi.glorot_normal(seed=0),
                bias_initializer= wi.glorot_normal(seed=1)
                )(dence)
dence = Activation("sigmoid")(dence)
dence = Dense( 1 ,
                kernel_initializer= wi.glorot_normal(seed=2),
                bias_initializer= wi.glorot_normal(seed=3)
              )(dence)
dence = Activation("linear")(dence)

model = Model(inputs=input_layer, outputs=dence)
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.summary()

model.fit(sample_x, sample_y)
weights = model.get_weights()
print("-----------Training-----------")
print(weights)
print("w11 : ", (weights[0][0][0] - w_11) )
print("w12 : ", (weights[0][0][1] - w_12) )
print("w21 : ", (weights[2][0][0] - w_21) )
print("w22 : ", (weights[2][1][0] - w_22) )

print("b11 : ", (weights[1][0] - b_11) )
print("b12 : ", (weights[1][1] - b_12) )
print("b21 : ", (weights[3][0] - b_21) )

[Результат] Мы провели несколько симуляций и суммировали их результаты. (Результат показывает «количество обновлений» веса.)

(Condition : 1)
・Pattern - 1
w11 :  0.00074356794
w12 :  0.00074353814
w21 :  -0.00073981285
w22 :  -0.0007440895
b11 :  0.00073862076
b12 :  0.00073826313
b21 :  -0.0007441044


(Condition : 2)
・Pattern - 1
w11 :  0.00074356794
w12 :  0.00074353814
w21 :  -0.00073981285
w22 :  -0.0007440895
b11 :  0.00073862076
b12 :  0.00073826313
b21 :  -0.0007441044

・Pattern - 2
w11 :  0.0009992719
w12 :  0.0009991974
w21 :  -0.0009942055
w22 :  -0.0009999275
b11 :  0.0009925961
b12 :  0.0009920597
b21 :  -0.0009999275

(Condition : 3)
・Pattern - 1
w11 :  0.0009864867
w12 :  0.0009983182
w21 :  -0.0008209944
w22 :  -0.0009999424
b11 :  0.0007850528
b12 :  0.0009675026
b21 :  -0.0009999275

・Pattern - 2
w11 :  0.0
w12 :  0.0
w21 :  0.0009999871
w22 :  0.0009999871
b11 :  -0.0009999275
b12 :  -0.0009996891
b21 :  0.0010000467

・Pattern - 3
w11 :  0.0007340908
w12 :  0.0007428825
w21 :  -0.0006109476
w22 :  -0.0007440895
b11 :  0.0005841851
b12 :  0.0007199049
b21 :  -0.0007441044

Результаты показали, что:

amount Количество обновлений корректируется при включении Dropout

・ Способ коррекции различается в зависимости от того, является ли обучение Истинным или Ложным.

Однако у меня есть следующие вопросы:

・ Почему в условии 2 нет «шаблона, количество обновлений которого равно 0» ?

・ Почему вы получаете результаты 3 шаблонов вместо 2 шаблонов в условии 3?

・ Почему условие 3 не дает тот же результат, что и условия 1 и 2?

Я не понимаю, как ведет себя Керас, когда существует Dropout. Помоги мне.

...