TensorFlow之文本分类算法-6

1 前言

2 收集数据

3 探索数据

4 选择模型

5 准备数据

6 模型-构建训练评估

构建输出层

构建n-gram模型

构建序列模型

GloVe(英文全称是Global Vectors for Word Representation)是一个全球化的英语语境的单词表示的向量集,其使用非监督类型的机器学习算法生成(GloVe在后续章节中详细描述)。

IMDb数据集合与GloVe数据集合的来源不一样,因此,机器学习过程需要进行一些上下文环境的优化与调整才能在不同向量空间中实行相互融合,其调整步骤如下所示:

步骤1:

在第一次运行机器学习的过程中,先不使用嵌入层的向量空间参与学习,也就是,保持权重不变,其他层保持正常学习,在第一次运行机器学习过程中,让权重这些初始值先达到一个比较好的状态,在第二次运行机器学习的过程中,使用嵌入层的向量空间参与到整个神经网络的学习,第二次运行机器学习对整个神经网络的权重进行较好的调整,该过程被称之嵌入层的微调(小幅度的调优)。

步骤2:

步骤1的嵌入层的微调能够取得更好的准确度,但是该过程也大幅度地消耗更多的计算资源。实践证明,只要学习的样本足够多,使用其他的机器学习方式也能取得与嵌入层微调相同的准确度,其他机器学习方式能大幅度地降低计算资源的消耗。

监督型机器学习

监督型机器学习模型训练的数据包括两个部分,特征数据集(问题)以及每个特征对应的标签数据集(答案),该学习方式类似于从一系列的问题以及问题对应的答案中学习,通过机器学习之后,系统掌握了问题与答案之间的映射关系,并将这些问题与答案进行归类为某一个主题,当系统接收到全新的问题的时候,则从这些主题中寻找答案。

非监督型机器学习

非监督型机器学习模型训练的数据只包括一个部分,特征数据集,其学习的目的是从这些未被标签化的特征数据集中进行归类(聚类)于类似的分组。例如,对不同属性的音乐进行分类,然后,将分类所得的音乐集合推送给用户(推荐服务)。

半监督型机器学习

半监督型机器学习模型的数据包括两个部分,特征数据集以及一部分特征数据集对应的标签数据集,由于标签不全,需要通过机器学习推断其他未被标签化的特征数据集,标签推断完成之后,再进行全面的监督型机器学习。

实践证明,通过对比不同的序列化机器学习模型(CNN, sepCNN, RNN (LSTM & GRU), CNN-RNN),sepCNN(在后续章节中详细描述)模型是效率最高的模型,其学习表现比其他模型更加优秀,sepCNN模型(四层)的代码如下所示:

训练模型

训练模型是对前面章节中构建的模型进行训练,训练涉及到的步骤是根据模型的当前状态做出预测,计算预测的准确率,根据预测的准确率更新以及调整神经网络中的权重、参数,从而最小化模型预测的错误,最终使得构建的模型的预测更加准确,训练过程中不断重复这些预测与分析的过程,直到模型达到收敛的效果而结束训练模型的过程,该过程涉及到三个关键参数如下所示:

  •  统计数据(Metric),用于测量模型的表现的优秀程度,在机器学习中使用准确度作为统计数据。

  • 损失函数(Loss function),用于计算一个训练过程中的损失值,然后,调整神经网络的权重,最终,让损失值最小化,对于分类问题,使用交叉熵(cross-entropy)损失函数最适合。

  • 优化器(Optimizer),该函数用于根据损失函数的输出确定如何更新神经网络的权重,例如,Adam优化方法(在后续章节中详细描述)。

这些参数的对照信息如下所示:

如上所示,learning parameter是学习参数类型,Value是学习参数对应的名称。

在训练流程中,主要使用模型的fit函数,根据训练数据集的规模,训练的大部分计算时间都消耗在fit函数中。在训练过程的每次迭代中,从训练数据集中提取batch_size大小的数据样本进行训练,在该次迭代中,使用损失函数计算损失值,根据损失值更新神经网络中的权重值。在训练过程中,经过多次的迭代,训练数据集已经根据batch_size大小处理了所有的批次,则该次训练过程完成,该过程被称之为一次epoch。在每次epoch完成时,使用测试数据集验证该次epoch的训练效果如何,经过多次epoch的训练,验证的训练效果的准确度达标以及准确度达到稳定的状态,则停止训练。训练的超级参数如下所示:

如上所示,Training hyperparameter是超级参数的名称,Value是超级参数对应的值。

Keras技术框架使用前面所述的调优参数以及超级参数的代码如下所示:

7 参数调优

机器学习过程中需要根据实际的需求为模型选择一些超级参数用于定义以及训练。这些参数调整建议如下所示:

模型的层数(Number of layers in the model

神经网络的层数决定其复杂度,层数太多则容易产生训练过多而过度拟合,层数太少则容易产生训练不足,对于MLPs类型的文本分类模型,层数保持在1层、2层、3层,有些场景用2层最合适,对于sepCNNs类型的文本分类模型,层数保持在4层、6层,有些场景用4层最合适

每层的单元数(Number of units per layer

单元是用于数据样本的信息转换,第一层的单元数是由特征数确定,随后的层的单元数是由前一层的输出、具体的扩展或者具体的收缩而确定,为了最小化每层信息在转换过程中信息的丢失,单元数保持的建议值是[8, 16, 32, 64],其中32或者64的单元数表现更优秀

删除比率(Dropout rate

该处理层是用于防止过度拟合,删除一部分比较随机的特征数据,建议范围是0.2–0.5

学习速率(Learning rate

该参数主要用于在多次迭代之间的权重值的变化的速率,保持低学习速率是比较好的设置,但是模型会执行更多的迭代,建议设置值是1e-4,如果训练过程非常缓慢,则建议提升该设置值,如果模型不训练,则建议降低该设置值

sepCNN模型涉及到的超级参数的调整如下所示:

核心大小(Kernel size

卷积的窗口大小,建议值是3或者5   

嵌入层的维度(Embedding dimensions

用于标识嵌入向量空间的大小,每个单词的向量集合的大小,建议值是50–300,GloVe类型的嵌入向量空间的大小,建议值是200

8 部署模型

将训练好模型部署到具体的运行环境中,运行环境包括公用云、私有云、容器云。具体部署方式参考云计算提供商的环境部署说明。

(未完待续)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 文本分类 #### 数据预处理 要求训练集和测试集分开存储,对于中文的数据必须先分词,对分词后的词用空格符分开,并且将标签连接到每条数据的尾部,标签和句子用分隔符\分开。具体的如下: * 今天 的 天气 真好\积极 #### 文件结构介绍 * 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
实现端到端的K-means算法集成的文本分类,可以分为以下几个步骤: 1. 数据准备:准备文本数据集,并将文本转换为向量表示。可以使用词袋模型或者TF-IDF模型将文本转换为向量表示。 2. K-means聚类:使用TensorFlow实现K-means聚类算法,并将文本向量作为输入进行聚类。聚类的结果可以作为文本分类的特征向量。 3. 分类模型:使用TensorFlow实现分类模型,可以使用神经网络模型或者其他机器学习模型。将聚类得到的特征向量作为输入,训练分类模型。 4. 集成:将K-means聚类和分类模型集成起来,形成端到端的文本分类系统。 下面是一个简单的代码示例: ```python import tensorflow as tf from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.datasets import fetch_20newsgroups from sklearn.cluster import KMeans from sklearn.metrics import accuracy_score # 数据准备 newsgroups_train = fetch_20newsgroups(subset='train') tfidf = TfidfVectorizer(stop_words='english') X = tfidf.fit_transform(newsgroups_train.data) # K-means聚类 kmeans = KMeans(n_clusters=20, init='k-means++', max_iter=100, n_init=1) kmeans.fit(X) X_clusters = kmeans.predict(X) # 分类模型 model = tf.keras.Sequential([ tf.keras.layers.Input(shape=(20,)), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(20, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 集成 model.fit(X_clusters, newsgroups_train.target, epochs=10) ``` 在上面的代码中,我们使用20个类别的新闻数据集作为示例数据集,首先使用TF-IDF模型将文本转换为向量表示,然后使用K-means聚类算法将文本向量聚类成20个簇,得到聚类结果作为分类的特征向量。然后使用一个简单的神经网络作为分类模型,将聚类结果作为输入进行训练,最后得到一个端到端的文本分类系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangys2006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值