Coggle 30 Days of ML(23年7月)任务七:训练TextCNN模型
任务七:使用Word2Vec词向量,搭建TextCNN模型进行训练和预测
说明:在这个任务中,你将使用Word2Vec词向量,搭建TextCNN模型进行文本分类的训练和预测,通过卷积神经网络来进行文本分类。
实践步骤:
准备Word2Vec词向量模型和相应的训练数据集。
构建TextCNN模型,包括卷积层、池化层、全连接层等。
将Word2Vec词向量应用到模型中,作为词特征的输入。
使用训练数据集对TextCNN模型进行训练。
使用训练好的TextCNN模型对测试数据集进行预测
导入训练好的Word2Vec模型
由于上一部分我们已经训练好了我们的模型,所以这一部分我们直接导入即可
# 准备Word2Vec词向量模型和训练数据集 word2vec_model = Word2Vec.load("word2vec.model")
在数据分析的时候,我们已经发现,词语的数量是不一的,所以首先我们先对数据进行处理,将文本序列转化为词向量表示,并且填充为长度为200
# 获取Word2Vec词向量的维度 embedding_dim = word2vec_model.vector_size # 转换训练数据集的文本序列为词向量表示,并进行填充 train_sequences = [] for text in train_data: sequence = [word2vec_model.wv[word] for word in text if word in word2vec_model.wv] padded_sequence = pad_sequences([sequence], maxlen=max_length, padding='post', truncating='post')[0] train_sequences.append(padded_sequence) # 转换测试数据集的文本序列为词向量表示,并进行填充 test_sequences = [] for text in test_data: sequence = [word2vec_model.wv[word] for word in text if word in word2vec_model.wv] padded_sequence = pad_sequences([sequence], maxlen=max_length, padding='post', truncating='post')[0] test_sequences.append(padded_sequence)
构建TextCNN模型
接下来我们就开始构建一下TextCNN模型,包括卷积层、池化层、全连接层等,这样我们就初步得到一个非常简单的模型了
# 构建TextCNN模型 model = tf.keras.Sequential() model.add(layers.Conv1D(128, 5, activation='relu', input_shape=(max_length, embedding_dim))) model.add(layers.GlobalMaxPooling1D()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(num_classes, activation='softmax'))
训练模型
接下来我们就可以开始训练我们的模型了,这里使用了SGD优化器进行操作,在训练之前,我们还需要把训练数据集的标签转换为one-hot编码
# 设置优化器和学习率 optimizer = optimizers.SGD(learning_rate=0.1) # 使用SGD优化器,并设置学习率为0.1 # 编译模型 model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy']) # 转换训练数据集的标签为one-hot编码 train_labels = tf.keras.utils.to_categorical(train_labels) # 训练模型 model.fit(np.array(train_sequences), train_labels, epochs=5, batch_size=32)
Epoch 1/5 438/438 [==============================] - 5s 6ms/step - loss: 0.4385 - accuracy: 0.8454 Epoch 2/5 438/438 [==============================] - 2s 5ms/step - loss: 0.4309 - accuracy: 0.8454 Epoch 3/5 438/438 [==============================] - 3s 6ms/step - loss: 0.4308 - accuracy: 0.8454 Epoch 4/5 438/438 [==============================] - 2s 6ms/step - loss: 0.4307 - accuracy: 0.8454 Epoch 5/5 438/438 [==============================] - 2s 6ms/step - loss: 0.4309 - accuracy: 0.8454
可能是模型太简单了,所以可以看到,通过训练以后,准确率也没有较大的提升,还可以继续改进
预测与提交
最后使用训练好的TextCNN模型对测试数据集进行预测,得到csv数据以后进行提交
# 预测测试数据集的分类结果 predictions = model.predict(np.array(test_sequences)) predicted_labels = predictions.argmax(axis=1) # 读取提交样例文件 submit = pd.read_csv('ChatGPT/sample_submit.csv') submit = submit.sort_values(by='name') # 将预测结果赋值给提交文件的label列 submit['label'] = predicted_labels # 保存提交文件 submit.to_csv('ChatGPT/textcnn.csv', index=None)
总结
这个TextCNN模型太过于简单,所以以至于可能没有学习到很多的数据,接下来可以进行调参和设置合理的模型结构,以期得到更好的结果,再接再厉,加油!!!