"""文本分类,RNN模型"""
def __init__(self):
# 三个待输入的数据
self.x = tf.placeholder(tf.int32, [None, config.max_seq_length], name='x')
self.y = tf.placeholder(tf.float32, [None, config.lables], name='y')
self.keep_prob = tf.placeholder(tf.float32, name='keep_prob')
self.rnn()
def rnn(self):
"""rnn模型"""
def lstm_cell(): # lstm核
return tf.contrib.rnn.BasicLSTMCell(config.lstm_hidden_size, state_is_tuple=True)
def dropout(): # 为每一个rnn核后面加一个dropout层
cell = lstm_cell()
return tf.contrib.rnn.DropoutWrapper(cell, config.keep_prob)
# 词向量映射
with tf.name_scope("embedding"):
embedding = tf.get_variable('embedding', [config.vocab_size, config.embedding_dim])
embedding_inputs = tf.nn.embedding_lookup(embedding, self.x)
with tf.name_scope("rnn"):
# 多层rnn网络
cells = [dropout() for _ in range(3)]
rnn_cell = tf.contrib.rnn.MultiRNNCell(cells, state_is_tuple=True)
_outputs, _ = tf.nn.dynamic_rnn(cell=rnn_cell, inputs=embedding_inputs, dtype=tf.float32)
# _outputs [batch_size, n_step, lstm_hidden_size]
last = _outputs[:, -1, :] # 取最后一个时序输出作为结果
with tf.name_scope("score"):
# 全连接层,后面接dropout以及relu激活
fc = tf.layers.dense(last, config.lstm_hidden_size, name='fc1')
fc = tf.contrib.layers.dropout(fc, config.keep_prob)
fc = tf.nn.relu(fc)
# 分类器
self.logits = tf.layers.dense(fc, config.lables, name='fc2')
self.y_pred_cls = tf.argmax(tf.nn.softmax(self.logits), 1) # 预测类别
with tf.name_scope("optimize"):
# 损失函数,交叉熵
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=self.logits, labels=self.y)
self.loss = tf.reduce_mean(cross_entropy)
# 优化器
self.train_op = tf.train.AdamOptimizer(learning_rate=config.learning_rate).minimize(self.loss)
with tf.name_scope("accuracy"):
# 准确率
correct_pred = tf.equal(tf.argmax(self.y, 1), self.y_pred_cls)
self.accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
NLP分类常用模型(二):rnn多层 tf.nn.dynamic_rnn()+ 全连接tf.layers.dense()
最新推荐文章于 2024-04-26 11:40:55 发布