我想开发一个具有神经网络的命名实体识别系统,首先我使用了简单的LSTM层,并且该模型基于Words作为标记,但我没有令人满意的准确性,
因此,我想到了一种基于字符作为标记的不同方法。 首先,我们将使用char生成训练数据。固定长度的序列(填充), 然后将其输入到Attention模型中,在该示例中,输出节点应等于单词或标签中的no,然后等于lstm和致密层, 所以基本上神经网络应该从字符中学习单词表示,这将在出现一些OOV或错误类型的单词时为我们提供帮助, 但是我实现的注意模型甚至比以前的lstm堆栈效果差。 那么这是实现问题还是其他问题?
注意力模型:
class Attention_Model():
def __init__(self,seq_length,units):
self.seq_length=seq_length
self.units=units
self.lstm=LSTM(units=units,return_sequences=True,return_state=True)
self.dense1=Dense(units=self.seq_length)
self.dense2=Dense(units=self.seq_length)
self.dense3=Dense(units=self.seq_length)
self.softmax=Softmax(axis=1)
self.outputs=[]
def get_lstm_s(self,seq_no):
input_lstm=tf.expand_dims(tf.reduce_sum(self.X*(self.alphas[:,:,seq_no:seq_no+1]),axis=1),axis=1)
a,b,c=self.lstm(input_lstm)
self.outputs.append(a)
#self.output[:,seq_no,:].assign(a[:,0,:])
return tf.concat([b,c],axis=-1)
def __call__(self,X):
self.X=X
for i in range(self.seq_length+1):
if i==0 :
s=tf.zeros(shape=(self.X.shape[0],2*self.units))
else :
s=self.get_lstm_s(i-1)
if(i==self.seq_length):
break
s=tf.expand_dims(s,axis=1)
s=tf.repeat(s,X.shape[1],axis=1)
concate_X=(tf.concat([tf.cast(self.X,tf.float64),tf.cast(s,tf.float64)],axis=-1))
self.alphas=self.softmax(self.dense1(self.dense2(self.dense3(concate_X))))
output=tf.transpose(tf.squeeze(tf.convert_to_tensor(self.outputs),[2]),[1,0,2])
self.outputs=[]
return output
模型架构:
# Defining all Layers...
embd=Embedding(input_dim=len(vocab),output_dim=100,name="embd")
lstm1=Bidirectional(LSTM(units=100,return_sequences=True,name="lstm1"),name="bd1")
lstm2=Bidirectional(LSTM(units=100,return_sequences=True,name="lstm2"),name="bd2")
# Attention Layers to make seq-length=21
# Developed by Gajesh Ladhar
attention_layer=Attention_Model(21,200)
lstm3=Bidirectional(LSTM(units=100,return_sequences=True,name="lstm3"),name="bd3")
dense1=Dense(units=150,name="dense1")
norm1=BatchNormalization()
act1=Activation('relu')
dense2=Dense(units=140,name="dense2")
norm2=BatchNormalization()
act2=Activation('relu')
dense3=Dense(units=130,name="dense3")
norm3=BatchNormalization()
act3=Activation('relu')
dense4=Dense(units=len(classes),name="dense4")
norm4=BatchNormalization()
output=Activation('softmax')