在训练过程中调试keras层的输出

时间:2019-10-11 19:41:03

标签: python-3.x tensorflow machine-learning keras deep-learning

使用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的想法,甚至带有用于打印渐变的回调方法,都将不胜感激。还请让我知道层的构成方式是否有问题。

1 个答案:

答案 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])