CNN模型和RNN模型在分类问题中的应用(Tensorflow实现)

更新时间:2023-05-12 02:26:36 阅读: 评论:0

CNN模型和RNN模型在分类问题中的应⽤(Tensorflow实现)
在这篇⽂章中,我们将实现⼀个卷积神经⽹络和⼀个循环神经⽹络语句分类模型。 本⽂提到的模型(rnn和cnn)在⼀系列⽂本分类任务(如情绪分析)中实现了良好的分类性能,并且由于模型简单,⽅便实现,成为了竞赛和实战中常⽤的baline。
,使⽤CNN做⽂本分类项⽬,start两千多。阅读这个,可以了解tensorflow构建项⽬的关键步骤,可以养成良好的代码习惯,这在初学者来说是很重要的。
,是我以CNN的源码基础,使⽤RNN做⽂本分类项⽬,实现了类似的分类性能。下⾯只讲解CNN,略过RNN,感兴趣的同学可以把RNN也clone下来⾃⼰跑⼀边。⾃⾏给出两个代码的性能⽐较。
数据处理
数据集是 Movie Review data from Rotten Tomatoes,也是原始⽂献中使⽤的数据集之⼀。 数据集包含,包含5331个积极的评论和5331个消极评论,正负向各占⼀半。 数据集不附带拆分的训练/测试集,因此我们只需将10%的数据⽤作 dev t。数据集过⼩容易过拟合,可以进⾏10交叉验证。在github项⽬中只是crude将数据集以9:1的⽐例拆为训练集和验证集。
步骤:
1. 加载两类数据
2. ⽂本数据清洗
3. 把每个句⼦填充到最⼤的句⼦长度,填充字符是,使得每个句⼦都包含59个单词。相同的长度有利于进⾏⾼效的批处理
4. 根据所有单词的词表,建⽴⼀个索引,⽤⼀个整数代表⼀个词,则每个句⼦由⼀个整数向量表⽰
# Load data
print("")
x_text, y = data_helpers.load_data_and_labels(FLAGS.positive_data_file, ative_data_file)
# Build vocabulary
max_document_length = max([len(x.split(" ")) for x in x_text])
vocab_processor = learn.preprocessing.VocabularyProcessor(max_document_length)
x = np.array(list(vocab_processor.fit_transform(x_text)))
# Randomly shuffle data
np.random.ed(10)
shuffle_indices = np.random.permutation(np.arange(len(y)))
x_shuffled = x[shuffle_indices]
y_shuffled = y[shuffle_indices]
# Split train/test t
# TODO: This is very crude, should u cross-validation
dev_sample_index = -1 * int(FLAGS.dev_sample_percentage * float(len(y)))
x_train, x_dev = x_shuffled[:dev_sample_index], x_shuffled[dev_sample_index:]
y_train, y_dev = y_shuffled[:dev_sample_index], y_shuffled[dev_sample_index:]
print("Vocabulary Size: {:d}".format(len(vocab_processor.vocabulary_)))
print("Train/Dev split: {:d}/{:d}".format(len(y_train), len(y_dev)))
模型构建
模型结构图为:
在github项⽬中,对该模型有适当的改变。第⼀层把词嵌⼊到低维向量;第⼆层使⽤多个不同⼤⼩的filter进⾏卷积(分别为3,4,5);第三层⽤max-pool把第⼆层多个filter的结果转换成⼀个长的特征向量
并加⼊dropout正规化;第四层⽤softmax进⾏分类。
# Embedding layer
with tf.device('/cpu:0'), tf.name_scope("embedding"):
lf.W = tf.Variable(
tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),
name="W")
# Create a convolution + maxpool layer for each filter size
pooled_outputs = []
for i, filter_size in enumerate(filter_sizes):
with tf.name_scope("conv-maxpool-%s" % filter_size):
# Convolution Layer
filter_shape = [filter_size, embedding_size, 1, num_filters]
W = tf.uncated_normal(filter_shape, stddev=0.1), name="W")
b = tf.stant(0.1, shape=[num_filters]), name="b")
conv = v2d(
W,
strides=[1, 1, 1, 1],
padding="VALID",
name="conv")
# Apply nonlinearity
h = bias_add(conv, b), name="relu")
# Maxpooling over the outputs
pooled = tf.nn.max_pool(
h,
ksize=[1, quence_length - filter_size + 1, 1, 1],
strides=[1, 1, 1, 1],
padding='VALID',
name="pool")
pooled_outputs.append(pooled)
# Combine all the pooled features
num_filters_total = num_filters * len(filter_sizes)
lf.h_pool = tf.concat(pooled_outputs, 3)
lf.h_pool_flat = tf.reshape(lf.h_pool, [-1, num_filters_total])
# Add dropout
with tf.name_scope("dropout"):
lf.h_drop = tf.nn.dropout(lf.h_pool_flat, lf.dropout_keep_prob)
# Final (unnormalized) scores and predictions
with tf.name_scope("output"):
W = tf.get_variable(
"W",
shape=[num_filters_total, num_class],
ib.layers.xavier_initializer())
b = tf.stant(0.1, shape=[num_class]), name="b")
l2_loss += tf.nn.l2_loss(W)
l2_loss += tf.nn.l2_loss(b)
lf.scores = tf.nn.xw_plus_b(lf.h_drop, W, b, name="scores")
lf.predictions = tf.argmax(lf.scores, 1, name="predictions")
模型训练
模型训练部分的代码都是固定的套路,熟悉以后⾮常⽅便写出来。
1. summaries汇总
tensorflow提供了各⽅⾯的汇总信息,⽅便跟踪和可视化训练和预测的过程。summaries是⼀个序列化的对象,通过SummaryWriter写⼊到光盘
2. checkpointing检查点
⽤于保存训练参数,⽅便选择最优的参数,使⽤tf.train.saver()进⾏保存
3. 变量初始化
ss.run(tf.initialize_all_variables()),⽤于初始化所有我们定义的变量,也可以对特定的变量⼿动调⽤初始化,如预训练好的词向量
4. 定义单⼀的训练步骤
定义⼀个函数⽤于模型评价、更新批量数据和更新模型参数
feed_dict中包含了我们在⽹络中定义的占位符的数据,必须要对所有的占位符进⾏赋值,否则会报错
train_op不返回结果,只是更新⽹络的参数
5. 训练循环
遍历数据并对每次遍历数据调⽤train_step函数,并定期打印模型评价和检查点
训练结果
这⾥上传博客中的两个结果图,上图为loss变化,下图为accuracy的变化。实际仿真结果和下图相同,在测试集上的准确率为0.6-0.7之间,效果并不是很好。原因如下:
1. 训练的指标不是平滑的,原因是我们每个批处理的数据过少
2. 训练集正确率过⾼,测试集正确率过低,过拟合。避免过拟合:更多的数据;更强的正规化;更少的模型参数。例如对最后⼀层的权重进⾏L2惩罚,使得正确率提升到76%,接近原始paper。

本文发布于:2023-05-12 02:26:36,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/593534.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模型   训练   数据   分类   实现
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图