Отладка вывода слоев keras во время тренировки - PullRequest
0 голосов
/ 11 октября 2019

При подгонке модели с использованием 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 с обратными вызовами даже для печати градиентов, была бы признательна,Пожалуйста, дайте мне знать, если что-то не так с составом слоев.

1 Ответ

0 голосов
/ 11 октября 2019

Если вы распечатаете mdl.layers[8], вы обнаружите, что это входной слой, я думаю, вы хотите получить результат mdl.layers[9], то есть Multiply layer. Вы можете получить вот так,

get_layer_output2 = K.function([mdl.layers[0].input, mdl.layers[8].input],[mdl.layers[9].output])
layer_output2 = get_layer_output2([in1_matrix, in2_matrix])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...