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层(只在训练时)———全连接层输出

### 文本分类 #### 数据预处理 要求训练集和测试集分开存储,对于中文的数据必须先分词,对分词后的词用空格符分开,并且将标签连接到每条数据的尾部,标签和句子用分隔符\分开。具体的如下: * 今天 的 天气 真好\积极 #### 文件结构介绍 * 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
### 回答1: 卷积神经网络 (Convolutional Neural Networks, CNN) 是一种常用于文本分类的深度学习模型。它通过卷积和池化层来提取文本中的特征,并使用全连接层来进行分类。 CNN 的一个优点是能够处理变长的输入,并且不需要对文本进行预处理。 ### 回答2: 卷积神经网络是一种深度学习方法,用于对文本进行分类。在训练过程中,这种网络可以自动学习输入数据的特征表示。卷积神经网络中的卷积层可以识别输入中的局部模式,这些局部模式组合起来形成更高级别的特征,最终帮助分类器确定类别。对于文本分类问题,卷积神经网络的输入是文本的词嵌入向量,可以从先验知识中自动学习特征。 在一些文本分类任务中,卷积神经网络已经取得了很好的表现。文本分类任务通常被分为两种类型:二元分类和多分类。二元分类任务是指将数据分为两类,例如垃圾邮件和非垃圾邮件。多类分类任务是指将数据分为多类,例如新闻分类。在这两种任务中,卷积神经网络都能够进行有效的分类。 对于二元分类任务,卷积神经网络可以使用一个输出节点,并使用 sigmoid 激活函数将输入映射到 0 到 1 之间的概率。对于多分类任务,卷积神经网络可以使用多个输出节点,每个节点对应一个类别,并使用 softmax 激活函数将输入映射到 0 到 1 之间,并且所有输出节点的和为 1。 要训练卷积神经网络进行文本分类,需要对模型进行三个主要的训练步骤。首先,需要构建词嵌入矩阵,该矩阵将文本中的每个词都映射到一个向量。然后,需要将文本数据转换为卷积神经网络所需的格式。最后,需要对模型进行训练,并根据测试数据进行评估。 总之,卷积神经网络已经被证明是一种强大的工具,可以用于文本分类等任务。在处理文本数据时,卷积神经网络可以自动学习输入数据的特征表示,并使用这些特征来确定文本的类别。 ### 回答3: 卷积神经网络(CNN)是一种深度学习模型,它在图像识别、计算机视觉和自然语言处理中表现出色。最近几年,CNN 在句子分类中也获得了很大的成功。 CNN 句子分类模型的输入是一个序列,输出是类别标签。与传统的 RNN 模型不同之处在于,CNN 可以使每个神经元只能捕获一个固定大小的区域的特征,从而加快模型的训练和降低了模型的复杂度。 CNN 句子分类模型的基本架构包括词嵌入层、卷积层、池化层和全连接层。词嵌入层将输入的文本转化为向量表示。卷积层通过滑动窗口对输入的序列进行卷积操作,提取出局部特征。池化层在每个滑动窗口上提取出一个最大值或平均值,进一步降低维度。最后,全连接层将提取出的特征传递到输出层进行分类。 CNN 句子分类模型的优点在于它可以处理不定长的文本序列,并在仅有少量特征的情况下表现出色。但是,CNN 模型的缺点在于不善于处理长期依赖关系,例如情感分析中的Irony识别。为了解决这个问题,可以引入 RNN 或 Transformer 等模型。 总的来说,CNN 模型为句子分类问题提供了一个简单有效的解决方案。在实践中,需要根据具体的任务选择合适的模型结构和参数设置,才能取得最佳效果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值