我是靠谱客的博主 纯情棒棒糖,最近开发中收集的这篇文章主要介绍解决keras中使用了tensorflow的函数后,导致在input或者output等地方出现的Tensor报错的问题问题代码1:问题代码2:,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

参考1:使用Keras实现Tensor的相乘和相加代码 对lambda讲的比较通俗易懂

参考2:AttributeError: ‘Tensor’ object has no attribute ‘_keras_history’ 这篇文章让我关注到了我的代码中的问题所在,比较有针对性地去寻找错误在哪里。

其实本文的标题也可以写作:

如何对tensorflow的矩阵-、矩阵*以及batch_dot用lambda包装。

昨天写模型,在Model(input, output)后遇到了两个错误(其实算是一个错误):

1. Output tensors to a Model must be Keras  tensors.
2. AttributeError: 'Tensor' object has no attribute '_keras_history'

折腾了很久,发现这两个错误是由以下代码引起的:
(这两处单独运行都不会报什么错,shape方面也没有错,但是一旦有了输入输出就会出错,这也是为什么找错找了这么久的原因…)

问题代码1:

all_tensor = concatenate([tensor1- tensor2, tensor1* tensor2], axis=-1)

原因:
在tensorflow中,直接这样tensor相互乘、相互减不会有问题,但是keras里面的keras.layers.concatenate()不支持这样,如果想要对张量进行乘或者减,需要使用lambda进行包装。

修改:

concat1 = Lambda(lambda x : x[0] - x[1])([tensor1,tensor2])
concat2 = Lambda(lambda x : x[0] * x[1])([tensor1,tensor2])
all_tensor = concatenate([tensor1, tensor2, concat1, concat2], axis=-1)# None MAX_HISTORY 4*256

修改后运行成功。

问题代码2:

# input1的shape[None 1 8] ; input2的shape[None, 8, 256]
rep = keras.backend.batch_dot(input_1, input_2)# [None 1 256]

原因:
keras.backend.batch_dot,还是用到了tensorflow的函数,因此也需要用lambda进行包装。

修改:

rep =Lambda(lambda x : K.batch_dot(x[0],x[1]))([input_1, input_2])

其中x对应的就是这排代码末尾([input_1, input_2]),x[0]取的是input_1,x[1]取的是 input_2。
lambda是不支持多参数的,即不能写lambda x,y : f(x,y)

最后

以上就是纯情棒棒糖为你收集整理的解决keras中使用了tensorflow的函数后,导致在input或者output等地方出现的Tensor报错的问题问题代码1:问题代码2:的全部内容,希望文章能够帮你解决解决keras中使用了tensorflow的函数后,导致在input或者output等地方出现的Tensor报错的问题问题代码1:问题代码2:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(364)

评论列表共有 0 条评论

立即
投稿
返回
顶部