前言
- 實現步驟
-
- 1.安裝tensorflow
- 2.導入所需要的tensorflow庫和其它相關模塊
- 3.設置隨機種子
- 4.定義模型相關超參數
- 5.加載需要的數據集
- 6.對加載的文本內容進行填充和截斷
- 7.構建自己模型
- 8.訓練構建的模型
- 9.評估完成的模型
-
CNN(卷積神經網絡)在文本分類任務中具有良好的特征提取能力、位置不變性、參數共享和處理大規模數據的優勢,能夠有效地學習文本的局部和全局特征,提高模型性能和泛化能力,所以本文將以CNN實現文本分類。
CNN對文本分類的支持主要提現在:特征提取:CNN能夠有效地提取文本中的局部特征。卷積層通過應用多個卷積核來捕獲不同大小的n-gram特征,從而能夠識別關鍵詞、短語和句子結構等重要信息。
位置不變性:對于文本分類任務,特征的位置通常是不重要的。CNN中的池化層(如全局最大池化)能夠保留特征的最顯著信息,同時忽略其具體位置,這對于處理可變長度的文本輸入非常有幫助。
參數共享:CNN中的卷積核在整個輸入上共享參數,這意味著相同的特征可以在不同位置進行識別。這種參數共享能夠極大地減少模型的參數量,降低過擬合的風險,并加快模型的訓練速度。
處理大規模數據:CNN可以高效地處理大規模的文本數據。由于卷積和池化操作的局部性質,CNN在處理文本序列時具有較小的計算復雜度和內存消耗,使得它能夠適應大規模的文本分類任務。
上下文建模:通過使用多個卷積核和不同的大小,CNN可以捕捉不同尺度的上下文信息。這有助于提高模型對文本的理解能力,并能夠捕捉更長范圍的依賴關系。
實現步驟之前首先安裝完成tensorflow
- 使用這個代碼安裝的前提是你的深度學習已經環境存在
- 例如:conda、pytorch、cuda、cudnn等環境
-
conda create -n tf python=3.8 conda activate tf #tensorflow的安裝 pip install tensorflow-gpu -i https://pypi.douban.com/simple
一. 測試tensorflow是否安裝成功
-
有三種方法
-
方法一:
import tensorflow as tf
print(tf.__version__)
#輸出'2.0.0-alpha0'
print(tf.test.is_gpu_available())
#會輸出True,則證明安裝成功
#新版本的tf把tf.test.is_gpu_available()換成如下命令
import tensorflow as tf
tf.config.list_physical_devices('GPU')
- 方法二:
-
import tensorflow as tf with tf.device('/GPU:0'):a = tf.constant(3)
方法三:
-
#輸入python,進入python環境 import tensorflow as tf #查看tensorflow版本 print(tf.__version__) #輸出'2.0.0-alpha0' #測試GPU能否調用,先查看顯卡使用情況 import os os.system("nvidia-smi") #調用顯卡 @tf.function def f():pass f() #這時會打印好多日志 #再次查詢顯卡 os.system("nvidia-smi") 可以對比兩次使用情況
二、打開pycharm倒入你創建的tf環境,新建py文件開始構建代碼
-
1.導入所需的庫和模塊:
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Embedding, Conv1D, GlobalMaxPooling1D
其中提前安裝TensorFlow來用于構建和訓練模型,以及Keras中的各種層和模型類
2.設置隨機種子:
np.random.seed(42)
在CNN(卷積神經網絡)中設置隨機種子主要是為了保證實驗的可重復性。由于深度學習模型中涉及大量的隨機性,如權重的初始化、數據的打亂(shuffle)等,設置隨機種子可以使得每次實驗的隨機過程都保持一致,從而使得實驗結果可以復現
3.定義模型超參數:
max_features = 5000 # 詞匯表大小
max_length = 100 # 文本最大長度
embedding_dims = 50 # 詞嵌入維度
filters = 250 # 卷積核數量
kernel_size = 3 # 卷積核大小
hidden_dims = 250 # 全連接層神經元數量
batch_size = 32 # 批處理大小
epochs = 5 # 訓練迭代次數
超參數影響模型的結構和訓練過程,可自行調整。
4.加載數據集:
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.imdb.load_data(num_words=max_features)
示例中,使用的IMDB電影評論數據集,其中包含以數字表示的評論文本和相應的情感標簽(正面或負面),使用tf.keras.datasets.imdb.load_data函數可以方便地加載數據集,并指定num_words參數來限制詞匯表的大小。
5.對文本進行填充和截斷:
x_train = sequence.pad_sequences(x_train, maxlen=max_length)
x_test = sequence.pad_sequences(x_test, maxlen=max_length)
由于每條評論的長度可能不同,需要將它們統一到相同的長度。sequence.pad_sequences函數用于在文本序列前后進行填充或截斷,使它們具有相同的長度。
6.構建模型:
model = Sequential()
model.add(Embedding(max_features, embedding_dims, input_length=max_length))
model.add(Dropout(0.2))
model.add(Conv1D(filters, kernel_size, padding='valid', activation='relu', strides=1))
model.add(GlobalMaxPooling1D())
model.add(Dense(hidden_dims, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))
這個模型使用Sequential模型類構建,依次添加了嵌入層(Embedding)、卷積層(Conv1D)、全局最大池化層(GlobalMaxPooling1D)和兩個全連接層(Dense)。嵌入層將輸入的整數序列轉換為固定維度的詞嵌入表示,卷積層通過應用多個卷積核來提取特征,全局最大池化層獲取每個特征通道的最大值,而兩個全連接層用于分類任務。
7.編譯模型:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
在編譯模型之前,需要指定損失函數、優化器和評估指標。使用二元交叉熵作為損失函數,Adam優化器進行參數優化,并使用準確率作為評估指標。
8.訓練模型:
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test))
使用fit函數對模型進行訓練。需要傳入訓練數據、標簽,批處理大小、訓練迭代次數,并可以指定驗證集進行模型性能評估。
9.評估模型:
scores = model.evaluate(x_test, y_test, verbose=0)
print("Test accuracy:", scores[1])
使用evaluate函數評估模型在測試集上的性能,計算并打印出測試準確率。
完整代碼
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Embedding, Conv1D, GlobalMaxPooling1D# 設置隨機種子
np.random.seed(42)# 定義模型超參數
max_features = 5000 # 詞匯表大小
max_length = 100 # 文本最大長度
embedding_dims = 50 # 詞嵌入維度
filters = 250 # 卷積核數量
kernel_size = 3 # 卷積核大小
hidden_dims = 250 # 全連接層神經元數量
batch_size = 32 # 批處理大小
epochs = 5 # 訓練迭代次數# 加載數據集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.imdb.load_data(num_words=max_features)# 對文本進行填充和截斷,使其具有相同的長度
x_train = sequence.pad_sequences(x_train, maxlen=max_length)
x_test = sequence.pad_sequences(x_test, maxlen=max_length)# 構建模型
model = Sequential()
model.add(Embedding(max_features, embedding_dims, input_length=max_length))
model.add(Dropout(0.2))
model.add(Conv1D(filters, kernel_size, padding='valid', activation='relu', strides=1))
model.add(GlobalMaxPooling1D())
model.add(Dense(hidden_dims, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))# 編譯模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])# 訓練模型
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test))# 評估模型
scores = model.evaluate(x_test, y_test, verbose=0)
print("Test accuracy:", scores[1])