CNN(卷積神經網路)在文字分類任務中具有良好的特徵提取能力、位置不變性、引數共享和處理大規模資料的上風,能夠有效地學習文字的區域性和全域性特徵,進步模型機能和泛化能力,所以本文將以CNN實現文字分類。

CNN對文字分類的支援:
特徵提取:CNN能夠有效地提取文字中的區域性特徵。卷積層透過應用多個卷積核來捕捉不同大小的n-gram特徵,從而能夠識別關鍵詞、短語和句子結構等重要資訊。
位置不變性:對於文字分類任務,特徵的位置通常是不重要的。CNN中的池化層(如全域性最大池化)能夠儲存特徵的最明顯資訊,同時忽略其具體位置,這對於處理可變長度的文字輸入非常有匡助。
引數共享:CNN中的卷積核在整個輸入上共享引數,這意味著相同的特徵可以在不同位置進行識別。這種引數共享能夠極大地減少模型的引數目,降低過擬合的風險,並加快模型的練習速度。
處理大規模資料:CNN可以高效地處理大規模的文字資料。因為卷積和池化操縱的區域性性質,CNN在處理文字序列時具有較小的計算複雜度和記憶體消耗,使得它能夠適應大規模的文字分類任務。
上下文建模:透過使用多個卷積核和不同的大小,CNN可以捕獲不同標準的上下文資訊。這有助於進步模型對文字的理解能力,並能夠捕獲更長範圍的依靠關係。
實現步驟
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
這些庫包括NumPy用於資料處理,TensorFlow用於構建和練習模型,以及Keras中的各種層和模型類。
2.設定隨機種子:
np.random.seed(42)
設定隨機種子,可以確保每次執行程式碼時天生的隨機數是相同的,以便結果可重現。
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])
CNN(卷積神經網路)在文字分類任務中具有良好的特徵提取能力、位置不變性、引數共享和處理大規模資料的上風,能夠有效地學習文字的區域性和全域性特徵,進步模型機能和泛化能力,所以本文將以CNN實現文字分類。

CNN對文字分類的支援:
特徵提取:CNN能夠有效地提取文字中的區域性特徵。卷積層透過應用多個卷積核來捕捉不同大小的n-gram特徵,從而能夠識別關鍵詞、短語和句子結構等重要資訊。
位置不變性:對於文字分類任務,特徵的位置通常是不重要的。CNN中的池化層(如全域性最大池化)能夠儲存特徵的最明顯資訊,同時忽略其具體位置,這對於處理可變長度的文字輸入非常有匡助。
引數共享:CNN中的卷積核在整個輸入上共享引數,這意味著相同的特徵可以在不同位置進行識別。這種引數共享能夠極大地減少模型的引數目,降低過擬合的風險,並加快模型的練習速度。
處理大規模資料:CNN可以高效地處理大規模的文字資料。因為卷積和池化操縱的區域性性質,CNN在處理文字序列時具有較小的計算複雜度和記憶體消耗,使得它能夠適應大規模的文字分類任務。
上下文建模:透過使用多個卷積核和不同的大小,CNN可以捕獲不同標準的上下文資訊。這有助於進步模型對文字的理解能力,並能夠捕獲更長範圍的依靠關係。
實現步驟
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
這些庫包括NumPy用於資料處理,TensorFlow用於構建和練習模型,以及Keras中的各種層和模型類。
2.設定隨機種子:
np.random.seed(42)
設定隨機種子,可以確保每次執行程式碼時天生的隨機數是相同的,以便結果可重現。
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])
CNN(卷積神經網路)在文字分類任務中具有良好的特徵提取能力、位置不變性、引數共享和處理大規模資料的上風,能夠有效地學習文字的區域性和全域性特徵,進步模型機能和泛化能力,所以本文將以CNN實現文字分類。

CNN對文字分類的支援:
特徵提取:CNN能夠有效地提取文字中的區域性特徵。卷積層透過應用多個卷積核來捕捉不同大小的n-gram特徵,從而能夠識別關鍵詞、短語和句子結構等重要資訊。
位置不變性:對於文字分類任務,特徵的位置通常是不重要的。CNN中的池化層(如全域性最大池化)能夠儲存特徵的最明顯資訊,同時忽略其具體位置,這對於處理可變長度的文字輸入非常有匡助。
引數共享:CNN中的卷積核在整個輸入上共享引數,這意味著相同的特徵可以在不同位置進行識別。這種引數共享能夠極大地減少模型的引數目,降低過擬合的風險,並加快模型的練習速度。
處理大規模資料:CNN可以高效地處理大規模的文字資料。因為卷積和池化操縱的區域性性質,CNN在處理文字序列時具有較小的計算複雜度和記憶體消耗,使得它能夠適應大規模的文字分類任務。
上下文建模:透過使用多個卷積核和不同的大小,CNN可以捕獲不同標準的上下文資訊。這有助於進步模型對文字的理解能力,並能夠捕獲更長範圍的依靠關係。
實現步驟
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
這些庫包括NumPy用於資料處理,TensorFlow用於構建和練習模型,以及Keras中的各種層和模型類。
2.設定隨機種子:
np.random.seed(42)
設定隨機種子,可以確保每次執行程式碼時天生的隨機數是相同的,以便結果可重現。
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])
CNN(卷積神經網路)在文字分類任務中具有良好的特徵提取能力、位置不變性、引數共享和處理大規模資料的上風,能夠有效地學習文字的區域性和全域性特徵,進步模型機能和泛化能力,所以本文將以CNN實現文字分類。

CNN對文字分類的支援:
特徵提取:CNN能夠有效地提取文字中的區域性特徵。卷積層透過應用多個卷積核來捕捉不同大小的n-gram特徵,從而能夠識別關鍵詞、短語和句子結構等重要資訊。
位置不變性:對於文字分類任務,特徵的位置通常是不重要的。CNN中的池化層(如全域性最大池化)能夠儲存特徵的最明顯資訊,同時忽略其具體位置,這對於處理可變長度的文字輸入非常有匡助。
引數共享:CNN中的卷積核在整個輸入上共享引數,這意味著相同的特徵可以在不同位置進行識別。這種引數共享能夠極大地減少模型的引數目,降低過擬合的風險,並加快模型的練習速度。
處理大規模資料:CNN可以高效地處理大規模的文字資料。因為卷積和池化操縱的區域性性質,CNN在處理文字序列時具有較小的計算複雜度和記憶體消耗,使得它能夠適應大規模的文字分類任務。
上下文建模:透過使用多個卷積核和不同的大小,CNN可以捕獲不同標準的上下文資訊。這有助於進步模型對文字的理解能力,並能夠捕獲更長範圍的依靠關係。
實現步驟
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
這些庫包括NumPy用於資料處理,TensorFlow用於構建和練習模型,以及Keras中的各種層和模型類。
2.設定隨機種子:
np.random.seed(42)
設定隨機種子,可以確保每次執行程式碼時天生的隨機數是相同的,以便結果可重現。
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])
CNN(卷積神經網路)在文字分類任務中具有良好的特徵提取能力、位置不變性、引數共享和處理大規模資料的上風,能夠有效地學習文字的區域性和全域性特徵,進步模型機能和泛化能力,所以本文將以CNN實現文字分類。

CNN對文字分類的支援:
特徵提取:CNN能夠有效地提取文字中的區域性特徵。卷積層透過應用多個卷積核來捕捉不同大小的n-gram特徵,從而能夠識別關鍵詞、短語和句子結構等重要資訊。
位置不變性:對於文字分類任務,特徵的位置通常是不重要的。CNN中的池化層(如全域性最大池化)能夠儲存特徵的最明顯資訊,同時忽略其具體位置,這對於處理可變長度的文字輸入非常有匡助。
引數共享:CNN中的卷積核在整個輸入上共享引數,這意味著相同的特徵可以在不同位置進行識別。這種引數共享能夠極大地減少模型的引數目,降低過擬合的風險,並加快模型的練習速度。
處理大規模資料:CNN可以高效地處理大規模的文字資料。因為卷積和池化操縱的區域性性質,CNN在處理文字序列時具有較小的計算複雜度和記憶體消耗,使得它能夠適應大規模的文字分類任務。
上下文建模:透過使用多個卷積核和不同的大小,CNN可以捕獲不同標準的上下文資訊。這有助於進步模型對文字的理解能力,並能夠捕獲更長範圍的依靠關係。
實現步驟
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
這些庫包括NumPy用於資料處理,TensorFlow用於構建和練習模型,以及Keras中的各種層和模型類。
2.設定隨機種子:
np.random.seed(42)
設定隨機種子,可以確保每次執行程式碼時天生的隨機數是相同的,以便結果可重現。
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])