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

当你的model各层的维度都对上了,最后马上就要输出了,忽然来这个错,我的心里是崩溃的。那么具体的原因是什么呢?

具体而言,就是我们在用keras训练的模型过程中出了叛徒啦!!!

AttributeError:'Tensor' object has no attribute '_keras_history'_第1张图片(我卡卡西早已看穿一切)

废话不多说,这个问题的主要原因是我们使用了tensorflow的一些函数导致的,比如我们可能会用tf.XXXX函数做一些处理。而tensorflow的函数处理过后的tensor叫做tf.tensor,keras处理过后的tensor叫做keras.tensor。在网上查到的一个比较详细的回答如下

AttributeError:'Tensor' object has no attribute '_keras_history'_第2张图片

解决方法人家给提了三个,第一个就是说你别整tf的函数,直接用keras.backend的函数,出来的就是咱自己人:keras.tensor。

第二个方法说的是我们可以用Lambda层把tf的函数包住,这样出来的tensor还是keras.tensor,因为Lambda层就是keras.layers中的层,而这个层就是处理这种不需要参数,只需要数据变化的事物的,所以我们有问题尽管找到。第三个方法,我还查了一下,哦!Designate(指定)keras function,哎和第一个差不多,就是告你别用tensorflow的函数。

我在这里就不介绍第一个和第三个了,因为我们也不知道你用的是什么函数,是吧,我就只说Lambda层的方法。

例如,我们想要使用

from keras import backend as K
x = K.tf.image.resize_bilinear(x,size=(input_shape[1],input_shape[2]))

我们可以用Lambda层包住,变成:

x = Lambda(lambda x: K.tf.image.resize_bilinear(x,size=(input_shape[1],input_shape[2])))(x)

这样的话生成的tensor就是keras.tensor了,什么?你不信?那你可以用下面这个函数测试一下:

print(K.is_keras_tensor(x))

哦,最后再提一下,上面提到的那个例子resize_bilinear用于修改大小时候只限定传入的tensor是(batchsize,H,W,channel)这样的channel_last样式,如果需要了解更多调整大小的函数,可以移步这里:(tensor调整大小的一些函数)

你可能感兴趣的:(Debug之路,tf.tensor,keras.tensor)