Keras AttributeError: 'Tensor' object has no attribute '_keras_history'解决方法
Keras AttributeError: 'Tensor' object has no attribute '_keras_history'解决方法在做吴恩达深度学习第四课第二周编程作业时,在搭50层resnet框架时出现了这个问题。源代码如下:# output layerX = Flatten()(X)X = Dense(classes, activation...
·
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层进行运算,最后完美解决问题。
所以在遇到类似问题的时候,我们除了强制转换数据类型,其实也可以试着在函数返回值上面做文章。
更多推荐
已为社区贡献1条内容
所有评论(0)