注意模型对于命名实体识别的效果不佳

时间:2020-08-12 11:48:14

标签: tensorflow keras lstm

我想开发一个具有神经网络的命名实体识别系统,首先我使用了简单的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')

0 个答案:

没有答案