Keras AttributeError: 'Tensor' object has no attribute '_keras_history'解决方法

Keras AttributeError: 'Tensor' object has no attribute '_keras_history'解决方法


在做吴恩达深度学习第四课第二周编程作业时,在搭50层resnet框架时出现了这个问题。
源代码如下:

    # output layer
    X = Flatten()(X)
    X = Dense(classes, activation='softmax', name='fc' + str(classes), kernel_initializer = glorot_uniform(seed=0))(X)

    # Create model
    model = Model(inputs = X_input, outputs = X, name='ResNet50')

错误如下:

AttributeError: 'Tensor' object has no attribute '_keras_history'

错误原因是keras的数据类型和tensorflow的数据类型不同,两者不能够混用。根据一些博客的解决方法,是通过keras的Lambda层来将output转换为keras类型。但是由于之前做过的操作过多,导致转换时需要改变很多变量,所以并不是很适合现在这种情况。

通过调试发现,主要原因是出在了函数的返回值上面。在其中一个convolutional_block函数的最后,我之前是这样写的:

    # Final step: Add shortcut value to main path, and pass it through a RELU activation (≈2 lines)
    X = X_shortcut + X;
    X = Activation('relu')(X)
    
    ### END CODE HERE ###
    
    return X

其中计算X的时候,我是直接进行加和的,由于X和X_short是tensor类型,这样就会默认调用tensorflow的加和函数,导致最后的结果还是tensor类型。解决方法就是使用keras自带的求和层Add(),改正后的代码如下:

    # Final step: Add shortcut value to main path, and pass it through a RELU activation (≈2 lines)
    X = Add()([X_shortcut,X])
    X = Activation('relu')(X)
    
    ### END CODE HERE ###
    
    return X

将另外的函数也做类似修改,在最后返回值前调用keras层进行运算,最后完美解决问题。

所以在遇到类似问题的时候,我们除了强制转换数据类型,其实也可以试着在函数返回值上面做文章。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值