При подгонке модели с использованием keras я сталкиваюсь с nans и хочу отладить выходные данные каждого слоя.
Код имеет вход in1 , который проходит через несколько слоев, иво время последнего слоя я умножаю поэлементно на другой вход in2 , а затем делаю прогноз. Ввод in2 является разреженным и используется для маскировки (строка напоминает что-то вроде этого [0 0 0 1 0 0 1 0 1 0 ... 0] ). Матрица меток содержит строки с горячим кодированием. Входные данные in1 - это вектор реальных значений.
in1 = Input(shape=(27,), name='in1')
in2 = Input(shape=(1000,), name='in2')
# Hidden layers
hidden_1 = Dense(1024, activation='relu')(in1)
hidden_2 = Dense(512, activation='relu')(hidden_1)
hidden_3 = Dense(256, activation='relu')(hidden_2)
hidden_4 = Dense(10, activation='linear')(hidden_3)
final = Dense(1000, activation='linear')(hidden_4)
# Ensure we do not overflow when we exponentiate
final2 = Lambda(lambda x: x - K.max(x))(final)
#Masked soft-max using Lambda and merge-multiplication
exponentiate = Lambda(lambda x: K.exp(x))(final2)
masked = Multiply()([exponentiate, in2])
predicted = Lambda(lambda x: x / K.sum(x))(masked)
# Compile with categorical crossentropy and adam
mdl = Model(inputs=[in1, in2],outputs=predicted)
mdl.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
tensorboard = TensorBoard(log_dir="/Users/somepath/tmp/{}".format(time()), write_graph=True,
write_grads=True)
mdl.fit({'in1': in1_matrix, 'in2': in2_matrix},
label_matrix, epochs=1, batch_size=32, verbose=2, callbacks=[tensorboard])
Я хочу напечатать выходные данные каждого слоя, градиенты во время обучения и способ отправки вспомогательного ввода ( in2 ) во время отладки.
Я попытался напечатать вывод каждого слоя, как показано ниже, который работает до layer7:
get_layer_output = K.function([mdl.layers[0].input],[mdl.layers[7].output])
layer_output = get_layer_output([in1_matrix])
Но когда я добираюсь до слоя 8, я не могудобавить in2_matrix . Я получаю следующую ошибку при использовании следующего кода для печати.
get_layer_output2 = K.function([mdl.layers[0].input],[mdl.layers[8].output])
layer_output2 = get_layer_output2([in1_matrix])
Ошибка:
InvalidArgumentError: Вы должны передать значение для тензора-заполнителя 'in2' с помощью dtype float иshape [?, 1000]
Я не знаю, как предоставить in2 in K.function , а также in2_matrix get_layer_output2 .
(Я проверил in1_matrix , in2_matrix и label_matrix . Все они выглядят хорошо, без nans или inf. Массив Label не имеет ни строк, ни столбцов со всеми нулями.) '
Я новичок в Keras, любая идея о том, как отлаживать nans с обратными вызовами даже для печати градиентов, была бы признательна,Пожалуйста, дайте мне знать, если что-то не так с составом слоев.