字元級CNN分類模型的實現
上次發了一條字元級分類模型的推文 讀 - Character-level Convolutional Networks for Text Classification
這次是對字元級CNN分類論文進行了程式碼實現: 1509.01626 Character-level Convolutional Networks for Text Classification
專案環境:
- Python3.6
- Anaconda+Pipenv管理
使用
# 下載程式碼 git clone https://github.com/howie6879/char_cnn_text_classification.git # 利用anaconda建立Python3.6環境 conda create -n python36 python=3.6 # 進入專案 cd char_cnn_text_classification # --python 後面的路徑是上面conda建立的路徑地址 pipenv install --python~/anaconda3/envs/python36/bin/python3.6 # 如果出錯 否則跳過這段 pipenv run pip install pip==18.0 # 安裝依賴 具體以來可檢視Pipenv檔案 pipenv install # 進入程式碼目錄 cd char_cnn_text_classification
模型
模型結構和論文中介紹的一樣:

論文中設計了 large
和 small
兩種卷積網路,分別對應不同大小的資料集,且都由6個卷積層和3個全連線層共9層神經網路組成
對於英文資料,如果資料集不大,可以考慮使用包含大小寫的字母表
資料集
ag_news_csv:新聞資料
對於英文資料,包含在 [ag_news_csv] (char_cnn_text_classification/datasets/ag_news_csv)資料夾裡面,資訊如下:
- 訓練集:120000
- 測試集:7600
- 類別:4
資料集處理類 [DataUtils] (char_cnn_text_classification/utils/data_utils.py),這裡以訓練集 shape
為例:
- Input例項:(120000, 1014)
- Label:(120000, 4)
配置
關於配置,請參考 [Config] (char_cnn_text_classification/config/config.py)類:
# 字母表 alphabet = "abcdefghijklmnopqrstuvwxyz0123456789-,;.!?:'\"/\\|_@#$%^&*~`+-=<>()[]{}" alphabet_size = len(alphabet) # 輸入大小,即論文中的l0 input_size = 1014 # 訓練集類別 num_of_classes = 4 batch_size = 128 epochs = 1000 checkpoint_every = 100 evaluate_every = 100 # 啟用函式的 threshold 值 threshold = 1e-6 # 防止過擬合 dropout保留比例 dropout_p = 0.5 # 損失函式 loss = 'categorical_crossentropy' # 優化器 rmsprop adam optimizer = 'adam'
訓練
配置好環境之後,可以直接進行訓練:
python run_model.py
可以在測試集分出20000條作為驗證集進行訓練
Data loaded from datasets/ag_news_csv/train.csv CharCNN model built success: ...... Training Started ===> Train on 100000 samples, validate on 20000 samples Epoch 1/10 ...... 100000/100000 [==============================] - 4338s 43ms/step - loss: 0.9999 - acc: 0.5329 - val_loss: 0.6755 - val_acc: 0.7290 Epoch 2/10 ...... 100000/100000 [==============================] - 4265s 43ms/step - loss: 0.5044 - acc: 0.8204 - val_loss: 0.4582 - val_acc: 0.8405 Epoch 3/10 ...... 100000/100000 [==============================] - 4268s 43ms/step - loss: 0.3593 - acc: 0.8799 - val_loss: 0.4177 - val_acc: 0.8522 ......
迭代了三輪,就達到了論文中所說的效果 0.8522
準確率和誤差圖示:


可以看到,迭代6、7輪後的結果挺不錯,也可以利用 Tensorboard
進行視覺化:
tensorboard --logdir=char_cnn_text_classification/logs
測試
char_cnn_model.model.evaluate(test_inputs, test_labels, batch_size=Config.batch_size, verbose=1)
可以得到結果輸出:
128/7600[..............................] - ETA: 1:51 ...... 7600/7600 [==============================] - 110s 15ms/step [0.41680785787732977, 0.8789473684210526]
其中:
- loss: 0.41
- acc: 0.8789
說明
感謝論文作者 Xiang Zhang, Junbo Zhao, Yann LeCun
,以及下面這些開源專案:
- GitHub - mhjabreel/CharCNN
- GitHub - mhjabreel/CharCnn_Keras: The implementation of text classification using character level convoultion neural networks using Keras
本文由howie6879 創作,採用 知識共享署名4.0 國際許可協議進行許可,轉載請註明出處!
重新整理可載入文末評論