IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> stack overflow 问题分类 -> 正文阅读

[人工智能]stack overflow 问题分类

本教程的目的是带领大家学会如何给 stack overflow 上的问题进行打标签

首先我们需要导入要用到的函数库

import matplotlib.pyplot as plt
import os
import re
import shutil
import string
?
import numpy as np
import tensorflow as tf
?
from tensorflow.keras import layers
from tensorflow.keras import losses
from tensorflow.keras import preprocessing
from tensorflow.keras.layers.experimental.preprocessing import TextVectorization

接下来我们看下 stack overflow 数据集,该数据集有 4 个类别标签,分别是 csharp、java、javascript、python ,每个类别有 2000 个样本,数据集下载地址: http://storage.googleapis.com/download.tensorflow.org/data/stack_overflow_16k.tar.gz

下一步是加载数据集,我们用的是 tf.keras.preprocessing.text_dataset_from_directory() ,要求的数据存放结构如下图所示

main_directory/
...class_a/
......a_text_1.txt
......a_text_2.txt
...class_b/
......b_text_1.txt
......b_text_2.txt

在开始训练前,我们需要把数据集划分成训练集、验证集、测试集,不过我们看下目录可以发现,已经存在训练集和测试集,那么还缺验证集,这个可以用validation_split 从训练集里划分出来,代码如下所示

batch_size = 32
seed = 42
?
raw_train_ds = tf.keras.preprocessing.text_dataset_from_directory(
 ?  'stack_overflow/train',
 ?  batch_size=batch_size,
 ?  validation_split=0.2,
 ?  subset='training',
 ?  seed=seed
)
?
raw_val_ds = tf.keras.preprocessing.text_dataset_from_directory(
 ?  'stack_overflow/train',
 ?  batch_size=batch_size,
 ?  validation_split=0.2,
 ?  subset='validation',
 ?  seed=seed
)
?
raw_test_ds = tf.keras.preprocessing.text_dataset_from_directory(
 ?  'stack_overflow/test',
 ?  batch_size=batch_size
)

在开始训练之前我们还需要对数据进行一些处理,可以通过调用 tf.keras.layers.experimental.preprocessing.TextVectorization 来进行数据的 standardize , tokenize , and vectorize

standardize: 用于移除 remove punctuation or HTML elements

tokenize: 把 strings 切分成 tokens

vectorize: 把 tokens 转化成 numbers ,然后可以送入神经网络

def custom_standardization(input_data):
 ?  lowercase = tf.strings.lower(input_data)
 ?  stripped_html = tf.strings.regex_replace(lowercase, '<br />', ' ')
 ?  return tf.strings.regex_replace(stripped_html,
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?  '[%s]' % re.escape(string.punctuation),
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?  '')
?
max_features = 10000
sequence_length = 125
?
vectorize_layer = TextVectorization(
 ?  standardize=custom_standardization,
 ?  max_tokens=max_features,
 ?  output_mode='int',
 ?  output_sequence_length=sequence_length
)
?
train_text = raw_train_ds.map(lambda x, y: x)
vectorize_layer.adapt(train_text)
?
def vectorize_text(text, label):
 ?  text = tf.expand_dims(text, -1)
 ?  return vectorize_layer(text), label

我们可以一起看下处理过后的数据长什么样子,如下图所示

到这一步,我们还需要对数据进行最后一步处理,然后就可以开始训练了

train_ds = raw_train_ds.map(vectorize_text)
val_ds = raw_val_ds.map(vectorize_text)
test_ds = raw_test_ds.map(vectorize_text)
?
AUTOTUNE = tf.data.experimental.AUTOTUNE
?
train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
test_ds = test_ds.cache().prefetch(buffer_size=AUTOTUNE)

接下来我们开始搭建模型

embedding_dim = 16
?
model = tf.keras.Sequential([
 ?  layers.Embedding(max_features + 1, embedding_dim),
 ?  layers.Dropout(0.2),
 ?  layers.GlobalAveragePooling1D(),
 ?  layers.Dropout(0.2),
 ?  layers.Dense(4)
])
?
model.summary()
?
model.compile(loss=losses.SparseCategoricalCrossentropy(from_logits=True),
 ? ? ? ? ? ?  optimizer='adam',
 ? ? ? ? ? ?  metrics=['accuracy'])

开始模型训练

epochs = 20
history = model.fit(
 ?  train_ds,
 ?  validation_data=val_ds,
 ?  epochs=epochs
)

绘制训练结果图

history_dict = history.history
history_dict.keys()
?
acc = history_dict['accuracy']
val_acc = history_dict['val_accuracy']
loss = history_dict['loss']
val_loss = history_dict['val_loss']
?
epochs = range(1, len(acc) + 1)
?
# "bo" is for "blue dot"
plt.plot(epochs, loss, 'bo', label='Training loss')
# b is for "solid blue line"
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
?
plt.show()
?
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
?
plt.show()

我们来分析下,上面的两个图,第一个图反应的是训练损失值和验证损失值的曲线,我们发现模型过拟合了,针对这种情况我们可以用tf.keras.callbacks.EarlyStopping 来处理,只要在模型的验证损失值不再下降的地方,停止训练就好

训练完模型之后,我们可以对样本进行预测,比如 examples 里面有 3 个样本,分别截取自 stack overflow 数据集,关于预测效果,大家可以自行测试

代码地址: https://codechina.csdn.net/csdn_codechina/enterprise_technology/-/blob/master/text_classification.ipynb

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:10:48  更:2021-07-22 14:12:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 16:53:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码