Tensorflow项目实战——句子分类(Sentence Classification)

该项目基于Tensorflow实现句子分类,利用词向量层降低输入维度并增加语义信息。数据集为MR电影评论,通过预处理、随机打乱、构建卷积网络结构、使用Adam优化器和预训练的Word2Vec词向量提升模型性能。实验证明,使用预训练词向量能显著提高验证集的准确率。
摘要由CSDN通过智能技术生成

项目来源Github

数据集:MR: 一句话的电影评论。分类涉及检测积极/消极的评论(Pang and Lee, 2005)。

关键概念embedding-layer词向量层

参考:博文1    博文2: 对论文进行了详细的翻译

在输入层,每一个单词用一个实数向量表示,这个向量被称为"词向量"(word embedding)。词向量可以形象地理解为将词汇表嵌入到一个固定维度的实数空间里,将单词编号转化为词向量主要有两大作用。

1. 降低输入维度。如果不使用词向量层,而直接将单词以one-hot vector的形式输入CNN,那么输入的维度大小将与词汇表大小相同,假设训练集中的单词个数(vocab_size)是8000,那么对应的one-hot vecotr也是8000,那么输入矩阵的大小将是8000x8000。如果使用词向量层,将设embedding_size=128,那么输入的矩阵则缩小为8000x128;

2.增加语义信息。简单的单词编号是不包含语义信息的,两个单词之间编号相近,并不意味着他们的含义有任何关联,而词向量将洗漱的编号转化为稠密的向量表示,这使得词向量有可能包含更为丰富的信息,在自然语言应用中学习得到的词向量通常会将含义相近的词赋予取值相近的词向量。使得上层的网络可以更容易地抓住相似单词之间的共性。

3.在没有大量监督数据集的情况下,使用从非监督神经语言模型训练得到的词向量进行初始化是用来提升结果的普遍方法。我们使用公用的、下哦那个10亿Google 新闻数据中训练出来的Word2vec词向量。此向量的维度是300并且是采用连续的词袋架构(Mikolov et al., 2013)训练出来的。没有出现在预训练词向量中的单词随机初始化。

Tensorflow实现embedding层:

with tf.variable_scope("Embedding-layer"):
        embedding_weight=tf.get_variable("weight",
                         initializer=tf.random_uniform((vocab_size,embedding_size),minval=-1.0,maxval=1.0))
        #根据张量input_x 来将[vocab_size,embedding_size]进行embedding
        #input_x的维度是[Batch_size,最长句子的单词数]
        wordVector=tf.nn.embedding_lookup(embedding_weight,input_x)
        #经过tf.nn.embedding_lookup后 wordVector的维度 [Batch_size,最长句子的单词数,embedding_size]        
        wordVec_expanded=tf.expand_dims(wordVector,-1)
        #原来是二维的现在变成三维的了,在最后一维加入一维

主要步骤

1)对MR数据,进行预处理,借助python 的re.sub 和正则表达式,将每个句子格式化(去掉特殊符号,分隔标点符号等)

2)随机打乱数据,并且需要自行将数据集划分为测试集和验证集(MNIST等tensorflow自带的已经划分好了)

# 随机打乱数据顺序(x 和 y 必须使用同一个shuffle_indices)
np.random.seed(10)
shuffle_indices = np.random.permutation(np.arange(len(y)))
x_shuffled = x[shuffle_indices]
y_shuffled = y[shuffle_indices]
# 划分训练数据和验证数据集
#选了90%作为测试数据 10%作为验证数据
sample_index = -1 * int(VALIDATION_PERCENTAGE * float(len(y)))
#[:sample_index]从0到倒数第|sample_index|个为测试数据
#[sample_index:]从倒数第|sample_index|到末尾为验证数据
x_train, x_dev = x_shuffled[:sample_index], x_shuffled[sample_index:] 
y_train, y_dev = y_shuffled[:sample_index], y_shuffled[sample_index:]

3)设计向前传播网络结构:

  embedding-layer  —— conv1 卷积层{卷积层使用三个尺寸大小不同的过滤器,通过并联的方式进行卷积,类似Inception-v3} ———最大池化层—— dropout层(只在训练时)———全连接层输出

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 文本分类 #### 数据预处理 要求训练集和测试集分开存储,对于中文的数据必须先分词,对分词后的词用空格符分开,并且将标签连接到每条数据的尾部,标签和句子用分隔符\分开。具体的如下: * 今天 的 天气 真好\积极 #### 文件结构介绍 * config文件:配置各种模型的配置参数 * data:存放训练集和测试集 * ckpt_model:存放checkpoint模型文件 * data_helpers:提供数据处理的方法 * pb_model:存放pb模型文件 * outputs:存放vocab,word_to_index, label_to_index, 处理后的数据 * models:存放模型代码 * trainers:存放训练代码 * predictors:存放预测代码 #### 训练模型 * python train.py --config_path="config/textcnn_config.json" #### 预测模型 * 预测代码都在predictors/predict.py中,初始化Predictor对象,调用predict方法即可。 #### 模型的配置参数详述 ##### textcnn:基于textcnn的文本分类 * model_name:模型名称 * epochs:全样本迭代次数 * checkpoint_every:迭代多少步保存一次模型文件 * eval_every:迭代多少步验证一次模型 * learning_rate:学习速率 * optimization:优化算法 * embedding_size:embedding层大小 * num_filters:卷积核的数量 * filter_sizes:卷积核的尺寸 * batch_size:批样本大小 * sequence_length:序列长度 * vocab_size:词汇表大小 * num_classes:样本的类别数,二分类时置为1,多分类时置为实际类别数 * keep_prob:保留神经元的比例 * l2_reg_lambda:L2正则化的系数,主要对全连接层的参数正则化 * max_grad_norm:梯度阶段临界值 * train_data:训练数据的存储路径 * eval_data:验证数据的存储路径 * stop_word:停用词表的存储路径 * output_path:输出路径,用来存储vocab,处理后的训练数据,验证数据 * word_vectors_path:词向量的路径 * ckpt_model_path:checkpoint 模型的存储路径 * pb_model_path:pb 模型的存储路径 ##### bilstm:基于bilstm的文本分类 * model_name:模型名称 * epochs:全样本迭代次数 * checkpoint_every:迭代多少步保存一次模型文件 * eval_every:迭代多少步验证一次模型 * learning_rate:学习速率 * optimization:优化算法 * embedding_size:embedding层大小 * hidden_sizes:lstm的隐层大小,列表对象,支持多层lstm,只要在列表中添加相应的层对应的隐层大小 * batch_size:批样本大小 * sequence_length:序列长度 * vocab_size:词汇表大小 * num_classes:样本的类别数,二分类时置为1,多分类时置为实际类别数 * keep_prob:保留神经元的比例 * l2_reg_lambda:L2正则化的系数,主要对全连接层的参数正则化 * max_grad_norm:梯度阶段临界值 * train_data:训练数据的存储路径 * eval_data:验证数据的存储路径 * stop_word:停用词表的存储路径 * output_path:输出路径,用来存储vocab,处理后的训练数据,验证数据 * word_vectors_path:词向量的路径 * ckpt_model_path:checkpoint 模型的存储路径 * pb_model_path:pb 模型的存储路径 ##### bilstm atten:基于bilstm + attention 的文本分类 * model_name:模型名称 * epochs:全样本迭代次数 * checkpoint_every:迭代多少步保存一次模型文件 * eval_every:迭代多少步验证一次模型 * learning_rate:学习速率 * optimization:优化算法 * embedding_size:embedding层大小 * hidd

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值