【问题标题】:'attributeError: 'Tensor' object has no attribute '_keras_history' during implementing perceptual loss with pretrained VGG using keras'attributeError: 'Tensor' 对象在使用 keras 使用预训练 VGG 实现感知损失期间没有属性 '_keras_history'
【发布时间】:2017-12-19 12:40:26
【问题描述】:

我正在尝试为视频输入的模型训练实施 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) 行中遇到了错误消息:

attributeError: 'Tensor' 对象没有属性 '_keras_history'

顺便说一句,我使用的 keras 版本是 '2.0.9'。

谁能帮我解决这个问题?

非常感谢!!

【问题讨论】:

    标签: tensorflow deep-learning keras loss


    【解决方案1】:

    这在大多数情况下意味着您在层外进行计算。

    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)
    

    【讨论】:

    • 顺便说一句,我不认为我在层外进行计算。错误信息还有其他可能吗?
    • 这就是答案。确实是层外的操作。
    • 太棒了 :) -- 如果您认为这回答了您的问题,请将其标记为已回答 :)
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多