CNN文字分類實現文字分類案例解析(附例項原始碼)

首頁 > 科技

CNN文字分類實現文字分類案例解析(附例項原始碼)

來源:電視劇雜談 釋出時間:2023-05-18 18:14

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])

上一篇:河池市人民醫... 下一篇:大學生如何學...
猜你喜歡
熱門閱讀
同類推薦