Tensorflow 请注意LSTM Keras顶部

Tensorflow 请注意LSTM Keras顶部,tensorflow,keras,deep-learning,lstm,attention-model,Tensorflow,Keras,Deep Learning,Lstm,Attention Model,我正在使用Keras培训一个LSTM模型,并希望在其上增加关注。我对Keras很陌生,也很受关注。通过链接,我学会了如何在我的LSTM层上增加注意力,并制作了一个这样的模型 print('定义一个简单的Keras模型…') lstm_模型=顺序()#或图形 lstm_model.add(嵌入(输出尺寸=300,输入尺寸=n个符号,掩码尺寸=True, 权重=[嵌入权重],输入长度=输入长度) #添加输入长度 lstm_model.add(双向(lstm(300))) lstm_模型添加(辍学率(

我正在使用Keras培训一个LSTM模型,并希望在其上增加关注。我对Keras很陌生,也很受关注。通过链接,我学会了如何在我的LSTM层上增加注意力,并制作了一个这样的模型

print('定义一个简单的Keras模型…')
lstm_模型=顺序()#或图形
lstm_model.add(嵌入(输出尺寸=300,输入尺寸=n个符号,掩码尺寸=True,
权重=[嵌入权重],输入长度=输入长度)
#添加输入长度
lstm_model.add(双向(lstm(300)))
lstm_模型添加(辍学率(0.3))
lstm_model.add(密集型(1,激活='sigmoid'))
#计算每个步骤的重要性
注意=密集(1,激活='tanh')
注意=flatte()
注意=激活('softmax'))
注意=重复向量(64)
注意=排列([2,1])
sent_representation=keras.layers.Add()([lstm_模型,注意])
sent_表示法=λ(λxin:K.sum(xin,轴=-2),输出_形状=(64))(sent_表示法)
sent_representation.add(密集(1,activation='sigmoid'))
rms_prop=RMSprop(lr=0.001,rho=0.9,ε=None,衰减=0.0)
adam=adam(lr=0.001,β1=0.9,β2=0.999,ε=0,衰减=0.0,amsgrad=False)
打印('编译模型…')
sent\u representation.compile(loss='binary\u crossentropy',optimizer=adam,metrics=['accurity'])
#class_mode='binary')
早期停止=早期停止(监视器='val_loss',最小增量=0,耐心=0,
verbose=0,mode='auto')
打印(“火车…”)
发送表示。拟合(X列,y列,批次大小=批次大小,nb列=20,
验证\u数据=(X\u测试,y\u测试),回调=[earlyStopping])
输出将是0/1的情绪分析。为此,我添加了一个

sent_representation.add(密集(1,activation='sigmoid'))
让它给出一个二进制结果

这是我们在运行代码时遇到的错误:

错误:
文件“”,第18行,在
sent_representation=keras.layers.Add()([lstm_模型,注意])
文件“C:\Users\DuttaHritwik\Anaconda3\lib\site packages\keras\engine\topology.py”,第575行,在调用中__
self.assert\u输入\u兼容性(输入)
文件“C:\Users\DuttaHritwik\Anaconda3\lib\site packages\keras\engine\topology.py”,第448行,在assert\u input\u compatibility中
str(输入)+'。层的所有输入
ValueError:调用Layer add_1时使用的输入不是符号张量。收到的类型:。完整输入:[,]。层的所有输入都应该是张量。
你能看一下并告诉我们这里做错了什么吗?

keras.layers.Add()
采用张量,所以

sent_representation=keras.layers.Add()([lstm_模型,注意])

您正在将一个序列模型作为输入传递,并且得到一个错误。 将初始层从使用顺序模型更改为使用函数api

lstm_section = Embedding(output_dim=300,input_dim=n_symbols,mask_zero=True, weights=[embedding_weights],input_length=input_length)( input )
lstm_section = Bidirectional(LSTM(300)) ( lstm_section )
lstm_section = Dropout(0.3)( lstm_section ) 
lstm_section = Dense(1,activation='sigmoid')( lstm_section )
lstm_部分
是一个张量,可以替换Add()调用中的
lstm_模型

由于您使用的是函数式API而不是顺序API,因此还需要使用
your\u model=keras.models.model(输入、发送的\u表示)

还值得注意的是,链接中的注意力模型是倍数而不是加法,因此可能值得使用
keras.layers.Multiply()

编辑

只是注意到你的注意力部分也没有建立一个图表,因为你没有将每一层传递到下一层。应该是:

attention=Dense(1, activation='tanh')( lstm_section )
attention=Flatten()( attention )
attention=Activation('softmax')( attention )
attention=RepeatVector(64)( attention )
attention=Permute([2, 1])( attention )

我试着这样做:
sent\u representation=Add()([lstm\u section,attention])
但是出现了这个错误:
Layer Add\u 3是用一个不是符号张量的输入调用的。收到的类型:。完整输入:[,]。层的所有输入都应该是张量。
既然一个是张量,另一个不是张量,我也尝试了:
sent_表示=Add()([lstm_部分,lstm_部分])
sent_表示=Add()([attention,attention])
错误仍然存在。已编辑的解决问题的答案这是我现在得到的:
ValueError:Layer add_8是使用非符号张量的输入调用的。收到的类型:。完整输入:[,]。层的所有输入都应该是张量。
在我实现更改后,代码对我有效。您能编辑您的原始帖子并添加代码的当前状态吗?这里有一个简单的方法来增加注意: