使用keras拟合模型时,我遇到了nans,并且想调试每层的输出。
代码有一个输入 in1 ,该输入经过多个层,在最后一层中,我将元素与另一个输入 in2 相乘,然后进行预测。输入 in2 是稀疏的,用于掩蔽(行类似于 [0 0 0 1 0 0 1 1 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 )。
我尝试打印如下所示的每一层的输出,直到第7层都可以使用:
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:您必须使用dtype float和形状[?,1000]的占位符张量'in2'输入值
我不知道如何在 K.function 中提供 in2 ,也不能将 in2_matrix 提供给 get_layer_output2
(我已经检查了 in1_matrix , in2_matrix 和 label_matrix 。它们看起来都很好,没有nans或inf。Label数组没有全为零的行或列。)'
我是Keras的新手,任何有关如何调试nans的想法,甚至带有用于打印渐变的回调方法,都将不胜感激。还请让我知道层的构成方式是否有问题。
答案 0 :(得分:0)
如果打印出mdl.layers[8]
,您会发现它是Input层,我想您想获得mdl.layers[9]
的输出,它是Multiply层。您可以这样
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])