我正在使用Keras的后端功能来测试我在Keras中训练过的模型(条件可变自动编码器,可能不相关)。这是Keras文档中显示的示例代码。
get_3rd_layer_output = K.function([model.layers[0].input, K.learning_phase()],
[model.layers[3].output])
# output in test mode = 0
layer_output = get_3rd_layer_output([x, 0])[0]
# output in train mode = 1
layer_output = get_3rd_layer_output([x, 1])[0]
但是,当我尝试类似的操作时,我收到一条错误消息。我的代码如下:
vae_func = K.function([vae.get_layer(name='input_img').input, vae.get_layer(name='attributes').input, K.learning_phase()], [vae.get_layer(name='output_img').output])
test_reconstruction = vae_func([x_train, y_train, 0])[0]
回溯结束时显示以下奇怪的错误消息:
tensor_type = dtypes_module.as_dtype(tensor.dtype)
AttributeError: 'bool' object has no attribute 'dtype'
如果我排除了K.learning_phase()输入,则代码将运行,但它会在学习模式下运行,这意味着模型中的批处理归一化和辍学层的行为与训练阶段(而不是测试阶段)相同。极不理想的输出。无论我是否尝试将学习阶段设置为0或1,都会出现相同的错误。这样设置学习阶段的方法过时了吗?还是我在做错事?
编辑:经过进一步测试,我变得更加困惑。看来我的IPython控制台是引起问题的那个,当我在python终端中运行它时,代码运行没有问题。这样做的原因似乎是K.learning_phase()在IPython控制台中返回了一个布尔值,但是当它移到终端时它会返回一个布尔值 tensor 。
但是,此发现尚未解决问题。测试我的Keras函数的输出后,我发现无论通过0(测试模式)还是1(火车模式),函数的输出都不会保持不变,这表明它没有成功切换到测试模式。如果有人知道为什么,请回答。
编辑2:再一次,通过更多的测试,我意识到这也不是IPython的错。 K.learning_phase()返回一个布尔值的原因是因为我的模型训练代码中有一行K.set_learning_phase(True),这奇怪地使K.learning_phase()返回一个布尔值,而不是该布尔值的张量。但这并没有解决为什么测试模式不起作用的问题。