我正在尝试为视频输入的模型训练实施VGG感知损失。 我实现了感知损失,就像问题AttributeError: 'Tensor' object has no attribute '_keras_history'中的建议一样:
我的mainModel如下图所示: Graph of mainModel
输入大小为(bathsize, frame_num, row, col, channel)
。我希望得到中间帧的感知损失,即frame_num/2
。
所以,我实现了以下lossModel:
lossModel = VGG19(weights='imagenet')
lossModel = Model(inputs=lossModel.input,outputs=lossModel.get_layer('block3_conv4').output)
lossOut = lossModel(mainModel.output[:,frame_num/2])
fullModel = Model(mainModel.input,lossOut)
但我在第fullModel = Model(mainModel.input, lossOut)
行中遇到了错误消息:
顺便说一下,我使用的keras版本是'2.0.9'。attributeError:'Tensor'对象没有属性'_keras_history'
有人可以帮我吗?
非常感谢!!
答案 0 :(得分:3)
这大多数时候都意味着你要在图层之外进行计算。
keras模型需要由keras层组成。不允许在图层外执行操作。
完成所有计算并将其放入Lambda
图层:https://keras.io/layers/core/#lambda
此处,mainModel.output[:,frame_num/2]
是图层外的操作。
将其转移到Lambda图层:
lossModel = VGG19(weights='imagenet')
lossModel = Model(inputs=lossModel.input,outputs=lossModel.get_layer('block3_conv4').output)
#you must connect lossmodel and mainmodel somewhere!!!
output = lossModel(mainModel.output)
output = Lambda(lambda x: x[:,frame_num/2])(output)
fullModel = Model(mainModel.input, output)