1. 概述
在情感分析的应⽤领域,例如判断某⼀句话是positive或者是negative的案例中,咱们可以通过传统的standard neuro network来作为解决⽅案,但是传统的神经⽹络在应⽤的时候是不能获取前后⽂字之间的关系的,不能获取到整个句⼦的⼀个整体的意思,只能通过每⼀个词的意思来最终决定⼀句话的情感,这显然是不合理的,导致的结果就是训练出来的模型质量可能不是很⾼。那么这⾥就需要⽤到LSTM来解决这个问题了,LSTM能够很好的表达出句⼦中词的关系,能将句⼦当做⼀个整体来看待,⽽不是⼀个个单独的词。所以这⼀节主要讲⼀下如何应⽤LSTM来做句⼦的情感分析的应⽤,这⾥主要包括2部分内容,第⼀部分是设计整个LSTM的⽹络结构,第⼆步是⽤代码是实现这个⽹络。
2. 结构设计
⾸先咱们知道应⽤的⽬的是根据句⼦的内容来判断情感的,那么咱们就可以很明确的知道这是⼀个Sequence model, 其次这个Sequence Model还是⼀个Many-To-One的结构。那么这⾥我为了提⾼咱们应⽤的复杂度,我选⽤了⼀个2层的LSTM layer, 就是将第⼀层的每⼀个LSTM cell 的输出作为第⼆层的每⼀个相应的LSTM cell的输⼊。听起来挺抽象的,实际咱们通过下⾯的图可以很清楚的看出它的整体结构(注意:下⾯的图,我省略了LSTM的memory cell,没有画出来)。实际的应⽤中,咱们很少会有⼤于3层的LSTMlayer,因为它计算所需要的资源是⾮常⼤的。其实在这个例⼦中,⼀层的LSTM layer其实是⾜够的,我这⾥只是为了演⽰2层layer,所以故意这样处理的,下⾯咱们看⼀下结构图吧
⾸先第⼀步还是要将所有的Word经过embedding layer, 然后再将这些features带⼊到LSTM layer中。第⼀层的LSTM layer每⼀个time step的输出都需要作为第⼆步的输⼊,所以在下⾯的代码中,第⼀层的LSTM的return_sequences需要设置成true;⽽第⼆层中只需要最后⼀个time step的输出,所以return_sequences设置成false。因为咱们这是的a, c设置的dimension都⽐较⼤,所以每⼀步都经过⼀个dropout layer让它按照⼀定的⽐例丢弃⼀部分信息,否则咱们的计算成本太⾼了。既然它的结构咱们已经设计出来了,那接下来咱们看看它的代码实现过程吧。
3.神经⽹络结构的代码实现
上⾯的代码咱们已经设计出来咱们对于这个应⽤的⽹络结构,接下来就是代码实现的过程,这⾥咱们应⽤了Keras的Functional API来搭建⽹络结构,咱们直接看⼀下代码吧,这⾥我只展⽰这个神经⽹络的构建代码:
def Sentiment_Model(input_shape): \"\"\"
Function creating the Emojify-v2 model's graph.
Arguments:
input_shape -- shape of the input, usually (max_len,)
Returns:
model -- a model instance in Keras \"\"\"
# Define sentence_indices as the input of the graph.
# It should be of shape input_shape and dtype 'int32' (as it contains indices, which are integers). sentence_sequences = Input(input_shape, dtype='int32') # Propagate sentence_indices through your embedding layer # (See additional hints in the instructions).
embeddings = Keras.Embedding(sentence_sequences)
# Propagate the embeddings through an LSTM layer with 128-dimensional hidden state # The returned output should be a batch of sequences. X = LSTM(128, return_sequences = True)(embeddings) # Add dropout with a probability of 0.5 X = Dropout(0.5)(X)
# Propagate X trough another LSTM layer with 128-dimensional hidden state # The returned output should be a single hidden state, not a batch of sequences. X = LSTM(128, return_sequences=False)(X) # Add dropout with a probability of 0.5
X = Dropout(0.5)(X)
# Propagate X through a Dense layer with 5 units X = Dense(5)(X)
# Add a softmax activation X = Activation('softmax')(X)
# Create Model instance which converts sentence_indices into X. model = Model(inputs=sentence_sequences, outputs=X)
return model
⾸先第⼀步上⾯的model要定义⼀个Input, 它的shape就是⼀句话的长度;后⾯的embedding layer, Dropout layer和LSTM layer都是按照上⾯的结构来实现的。具体⾥⾯的细节,我在代码中的注释已经写得⾮常清楚了。主要有⼏个细节部分需要注意⼀下,第⼀个是hidden state的dimension;第⼆个是return_sequence的参数,如果⼤家对
return_sequence和return_state的参数不理解,有疑问,我推荐⼤家看⼀下这个博客,解释的⾮常到位, ;第三个就是上⾯的Input_shape是省略batch_size参数的;⾄于这个model的fitting, evaluation等其他过程和其他的model都是⼀样的,这⾥我就不展开来说了,最核⼼的就是上⾯的这个结构的构建。
4. 总结
这⾥主要讲述了⼀个Many-to-One结构的LSTM的⼀般应⽤,这⾥主要是⽤⼀个情感分析的例⼦来演⽰,但是它的应⽤⾮常⼴泛的。这⾥的重点是对LSTM 的Many-to-One结构的理解,其次是对于多层LSTM layer的应⽤和理解。⾄于⽤TensorFlow来实现这个神经⽹络的部分,主要是对LSTM 中的⼀些参数的设置要理解就⾏了,其他的都很简单。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo8.com 版权所有 湘ICP备2023022238号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务