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层进行运算,最后完美解决问题。

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

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐