Я построил нейронную сеть с 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. Помоги мне.