[[211015]] 現在、TensorFlow のメジャーバージョンは 1.3 にアップグレードされ、多くのネットワーク層のより高度なカプセル化と実装が実現され、さらに Keras などの優れた高レベルフレームワークも統合され、使いやすさが大幅に向上しました。初期の基盤コードと比較すると、今日の実装はより簡潔でエレガントになっています。 この記事は、中国語データセットでの TensorFlow の簡略化された実装です。文字レベルの CNN と RNN を使用して中国語のテキストを分類し、良好な結果を達成しています。 データセット この記事では、Tsinghua NLP Group が提供する THUCNews ニューステキスト分類データセットのサブセットを使用します (元のデータセットには約 740,000 件のドキュメントが含まれており、トレーニングには長い時間がかかります)。 THUCTC: 効率的な中国語テキスト分類ツールキットからデータセットをダウンロードしてください。データ プロバイダーのオープン ソース契約に従ってください。 このトレーニングでは 10 個のカテゴリが使用され、各カテゴリには 6,500 個のデータ ポイントがありました。 カテゴリーは次のとおりです。 スポーツ、金融、不動産、住宅、教育、テクノロジー、ファッション、時事問題、ゲーム、エンターテイメント このサブセットはここからダウンロードできます: リンク: http://pan.baidu.com/s/1bpq9Eub パスワード: ycyw データセットは次のように分割されます。 - トレーニングセット: 5000*10
- 検証セット: 500*10
- テストセット: 1000*10
元のデータセットからサブセットを生成するプロセスについては、ヘルパーの下の 2 つのスクリプトを参照してください。このうち、copy_data.sh は各カテゴリから 6500 個のファイルをコピーするために使用され、cnews_group.py は複数のファイルを 1 つのファイルに統合するために使用されています。ファイルを実行すると、次の 3 つのデータ ファイルが取得されます。 - cnews.train.txt: トレーニング セット (50,000 項目)
- cnews.val.txt: 検証セット (5000 項目)
- cnews.test.txt: テストセット (10000 項目)
前処理 data/cnews_loader.py はデータ前処理ファイルです。 - read_file(): ファイルデータを読み取ります。
- build_vocab(): 文字レベルの表現を使用して語彙を構築します。この関数は語彙を保存し、毎回繰り返し処理されないようにしています。
- read_vocab(): 前のステップで保存された語彙を読み取り、それを {word:id} 表現に変換します。
- read_category(): カテゴリディレクトリを修正し、{category: id} 表現に変換します。
- to_words(): id で表されるデータをテキストに変換します。
- preocess_file(): データセットをテキストから固定長の ID シーケンス表現に変換します。
- batch_iter(): ニューラル ネットワークのトレーニング用にシャッフルされたデータ バッチを準備します。
データの前処理後のデータ形式は次のようになります。 CNN 畳み込みニューラルネットワーク 構成項目 CNN の設定可能なパラメータは、以下の cnn_model.py に示されています。 - クラス TCNNConfig(オブジェクト):
- 「 CNN 構成パラメータ」
-
- embedding_dim = 64 # 単語ベクトルの次元
- seq_length = 600 # シーケンスの長さ
- num_classes = 10 # カテゴリの数
- num_filters = 128 # 畳み込みカーネルの数
- kernel_size = 5 # 畳み込みカーネルのサイズ
- vocab_size = 5000 # 小さな語彙
-
- hidden_dim = 128 #完全結合層ニューロン
-
- dropout_keep_prob = 0.5 # ドロップアウト保持率
- learning_rate = 1e-3 # 学習率
-
- batch_size = 64 # バッチあたりのトレーニングサイズ
- num_epochs = 10 # 反復回数の合計
-
- print_per_batch = 100 # 数ラウンドごとに結果を出力します
- save_per_batch = 10 # テンソルボードに保存するラウンド数
CNNモデル 詳細については、cnn_model.py の実装を参照してください。 一般的な構造は次のとおりです。 トレーニングと検証 トレーニングを開始するには、python run_cnn.py train を実行します。 以前にトレーニングしたことがある場合は、TensorBoard で複数のトレーニング結果が重複しないように、tensorboard/textcnn を削除してください。 - CNN モデルを構成しています...
- TensorBoardとSaver を設定しています...
- トレーニングおよび検証データを読み込んでいます...
- 使用時間: 0:00:14
- トレーニングと評価...
- エポック: 1
- 反復: 0、列車損失: 2.3、列車精度: 10.94%、値損失: 2.3、値精度: 8.92%、時間: 0:00:01 *
- 反復: 100、列車損失: 0.88、列車精度: 73.44%、値損失: 1.2、値精度: 68.46%、時間: 0:00:04 *
- 反復: 200、列車損失: 0.38、列車精度: 92.19%、値損失: 0.75、値精度: 77.32%、時間: 0:00:07 *
- 反復: 300、列車損失: 0.22、列車精度: 92.19%、値損失: 0.46、値精度: 87.08%、時間: 0:00:09 *
- 反復: 400、列車損失: 0.24、列車精度: 90.62%、値損失: 0.4、値精度: 88.62%、時間: 0:00:12 *
- 反復: 500、列車損失: 0.16、列車精度: 96.88%、値損失: 0.36、値精度: 90.38%、時間: 0:00:15 *
- 反復: 600、列車損失: 0.084、列車精度: 96.88%、値損失: 0.35、値精度: 91.36%、時間: 0:00:17 *
- 反復: 700、列車損失: 0.21、列車精度: 93.75%、値損失: 0.26、値精度: 92.58%、時間: 0:00:20 *
- エポック: 2
- 反復: 800、列車損失: 0.07、列車精度: 98.44%、値損失: 0.24、値精度: 94.12%、時間: 0:00:23 *
- 反復: 900、列車損失: 0.092、列車精度: 96.88%、値損失: 0.27、値精度: 92.86%、時間: 0:00:25
- 反復: 1000、列車損失: 0.17、列車精度: 95.31%、値損失: 0.28、値精度: 92.82%、時間: 0:00:28
- 反復: 1100、列車損失: 0.2、列車精度: 93.75%、値損失: 0.23、値精度: 93.26%、時間: 0:00:31
- 反復: 1200、列車損失: 0.081、列車精度: 98.44%、値損失: 0.25、値精度: 92.96%、時間: 0:00:33
- 反復: 1300、列車損失: 0.052、列車精度: 100.00%、値損失: 0.24、値精度: 93.58%、時間: 0:00:36
- 反復: 1400、列車損失: 0.1、列車精度: 95.31%、値損失: 0.22、値精度: 94.12%、時間: 0:00:39
- 反復: 1500、列車損失: 0.12、列車精度: 98.44%、値損失: 0.23、値精度: 93.58%、時間: 0:00:41
- エポック: 3
- 反復: 1600、列車損失: 0.1、列車精度: 96.88%、値損失: 0.26、値精度: 92.34%、時間: 0:00:44
- 反復: 1700、列車損失: 0.018、列車精度: 100.00%、値損失: 0.22、値精度: 93.46%、時間: 0:00:47
- 反復: 1800、列車損失: 0.036、列車精度: 100.00%、値損失: 0.28、値精度: 92.72%、時間: 0:00:50
- 長時間最適化されず、自動停止します...
検証セットでの最良の結果は 94.12% で、アルゴリズムはわずか 3 回の反復後に停止しました。 精度と誤差は図に示されています。 テスト テスト セットをテストするには、python run_cnn.py test を実行します。 - CNN モデルを構成しています...
- テストデータを読み込んでいます...
- テスト中...
- テスト損失: 0.14、テスト精度: 96.04%
- 精度、再現率、 F1 スコア...
- 精度再現率 F1スコア サポート
-
- スポーツ 0.99 0.99 0.99 1000
- 金融 0.96 0.99 0.97 1000
- 不動産 1.00 1.00 1.00 1000
- ホーム 0.95 0.91 0.93 1000
- 教育 0.95 0.89 0.92 1000
- テクノロジー 0.94 0.97 0.95 1000
- ファッション 0.95 0.97 0.96 1000
- 時事 0.94 0.94 0.94 1000
- ゲーム 0.97 0.96 0.97 1000
- エンターテイメント 0.95 0.98 0.97 1000
-
- 平均/ 合計 0.96 0.96 0.96 10000
-
- 混同マトリックス...
- [[991 0 0 0 2 1 0 4 1 1]
- [ 0 992 0 0 2 1 0 5 0 0 ]
- [ 0 1 996 0 1 1 0 0 0 1 ]
- [ 0 14 0 912 7 15 9 29 3 11 ]
- [ 2 9 0 12 892 22 18 21 10 14 ]
- [ 0 0 0 10 1 968 4 3 12 2 ]
- [ 1 0 0 9 4 4 971 0 2 9]
- [ 1 16 0 4 18 12 1 941 1 6 ]
- [ 2 4 1 5 4 5 10 1 962 6 ]
- [ 1 0 1 6 4 3 5 0 1 979]]
- 使用時間: 0:00:05
テスト セットの精度は 96.04% に達し、各カテゴリの精度、再現率、f1 スコアは 0.9 を超えました。 混同行列からも分類効果が非常に優れていることがわかります。 RNN リカレント ニューラル ネットワーク 構成項目 RNN の設定可能なパラメータは、rnn_model.py に以下のように示されています。 - クラスTRNNConfig(オブジェクト):
- "" "RNN 構成パラメータ" ""
-
- # モデルパラメータ
- embedding_dim = 64 # 単語ベクトルの次元
- seq_length = 600 # シーケンスの長さ
- num_classes = 10 # カテゴリの数
- vocab_size = 5000 # 小さな語彙
-
- num_layers = 2 # 隠し層の数
- hidden_dim = 128 # 隠れ層ニューロン
- rnn = 'gru' # lstm または gru
-
- dropout_keep_prob = 0.8 # ドロップアウト保持率
- learning_rate = 1e-3 # 学習率
-
- batch_size = 128 # バッチあたりのトレーニングサイズ
- num_epochs = 10 # 反復回数の合計
-
- print_per_batch = 100 # 数ラウンドごとに結果を出力します
- save_per_batch = 10 # テンソルボードに保存するラウンド数
RNN モデル 詳細については、rnn_model.py の実装を参照してください。 一般的な構造は次のとおりです。 トレーニングと検証 この部分のコードは run_cnn.py と非常に似ていますが、モデルといくつかのディレクトリのみを少し変更する必要があります。 トレーニングを開始するには、python run_rnn.py train を実行します。 以前にトレーニングしたことがある場合は、TensorBoard で複数のトレーニング結果が重複しないように、tensorboard/textrnn を削除してください。 - RNN モデルを構成しています...
- TensorBoardとSaver を設定しています...
- トレーニングおよび検証データを読み込んでいます...
- 使用時間: 0:00:14
- トレーニングと評価...
- エポック: 1
- 反復: 0、列車損失: 2.3、列車精度: 8.59%、値損失: 2.3、値精度: 11.96%、時間: 0:00:08 *
- 反復: 100、列車損失: 0.95、列車精度: 64.06%、値損失: 1.3、値精度: 53.06%、時間: 0:01:15 *
- 反復: 200、列車損失: 0.61、列車精度: 79.69%、値損失: 0.94、値精度: 69.88%、時間: 0:02:22 *
- 反復: 300、列車損失: 0.49、列車精度: 85.16%、値損失: 0.63、値精度: 81.44%、時間: 0:03:29 *
- エポック: 2
- 反復: 400、列車損失: 0.23、列車精度: 92.97%、値損失: 0.6、値精度: 82.86%、時間: 0:04:36 *
- 反復: 500、列車損失: 0.27、列車精度: 92.97%、値損失: 0.47、値精度: 86.72%、時間: 0:05:43 *
- 反復: 600、列車損失: 0.13、列車精度: 98.44%、値損失: 0.43、値精度: 87.46%、時間: 0:06:50 *
- 反復: 700、列車損失: 0.24、列車精度: 91.41%、値損失: 0.46、値精度: 87.12%、時間: 0:07:57
- エポック: 3
- 反復: 800、列車損失: 0.11、列車精度: 96.09%、値損失: 0.49、値精度: 87.02%、時間: 0:09:03
- 反復: 900、列車損失: 0.15、列車精度: 96.09%、値損失: 0.55、値精度: 85.86%、時間: 0:10:10
- 反復: 1000、列車損失: 0.17、列車精度: 96.09%、値損失: 0.43、値精度: 89.44%、時間: 0:11:18 *
- 反復: 1100、列車損失: 0.25、列車精度: 93.75%、値損失: 0.42、値精度: 88.98%、時間: 0:12:25
- エポック: 4
- 反復: 1200、列車損失: 0.14、列車精度: 96.09%、値損失: 0.39、値精度: 89.82%、時間: 0:13:32 *
- 反復: 1300、列車損失: 0.2、列車精度: 96.09%、値損失: 0.43、値精度: 88.68%、時間: 0:14:38
- 反復: 1400、列車損失: 0.012、列車精度: 100.00%、値損失: 0.37、値精度: 90.58%、時間: 0:15:45 *
- 反復: 1500、列車損失: 0.15、列車精度: 96.88%、値損失: 0.39、値精度: 90.58%、時間: 0:16:52
- エポック: 5
- 反復: 1600、列車損失: 0.075、列車精度: 97.66%、値損失: 0.41、値精度: 89.90%、時間: 0:17:59
- 反復: 1700、列車損失: 0.042、列車精度: 98.44%、値損失: 0.41、値精度: 90.08%、時間: 0:19:06
- 反復: 1800、列車損失: 0.08、列車精度: 97.66%、値損失: 0.38、値精度: 91.36%、時間: 0:20:13 *
- 反復: 1900、列車損失: 0.089、列車精度: 98.44%、値損失: 0.39、値精度: 90.18%、時間: 0:21:20
- エポック: 6
- 反復: 2000、列車損失: 0.092、列車精度: 96.88%、値損失: 0.36、値精度: 91.42%、時間: 0:22:27 *
- 反復: 2100、列車損失: 0.062、列車精度: 98.44%、値損失: 0.39、値精度: 90.56%、時間: 0:23:34
- 反復: 2200、列車損失: 0.053、列車精度: 98.44%、値損失: 0.39、値精度: 90.02%、時間: 0:24:41
- 反復: 2300、列車損失: 0.12、列車精度: 96.09%、値損失: 0.37、値精度: 90.84%、時間: 0:25:48
- エポック: 7
- 反復: 2400、列車損失: 0.014、列車精度: 100.00%、値損失: 0.41、値精度: 90.38%、時間: 0:26:55
- 反復: 2500、列車損失: 0.14、列車精度: 96.88%、値損失: 0.37、値精度: 91.22%、時間: 0:28:01
- 反復: 2600、列車損失: 0.11、列車精度: 96.88%、値損失: 0.43、値精度: 89.76%、時間: 0:29:08
- 反復: 2700、列車損失: 0.089、列車精度: 97.66%、値損失: 0.37、値精度: 91.18%、時間: 0:30:15
- エポック: 8
- 反復: 2800、列車損失: 0.0081、列車精度: 100.00%、値損失: 0.44、値精度: 90.66%、時間: 0:31:22
- 反復: 2900、列車損失: 0.017、列車精度: 100.00%、値損失: 0.44、値精度: 89.62%、時間: 0:32:29
- 反復: 3000、列車損失: 0.061、列車精度: 96.88%、値損失: 0.43、値精度: 90.04%、時間: 0:33:36
- 長時間最適化されず、自動停止します...
検証セットでの最高の結果は 91.42% で、8 ラウンドの反復後に停止しました。速度は CNN よりもはるかに遅いです。 精度と誤差は図に示されています。 テスト python run_rnn.py test を実行して、テスト セットでテストを実行します。 - テスト中...
- テスト損失: 0.21、テスト精度: 94.22%
- 精度、再現率、 F1 スコア...
- 精度再現率 F1スコア サポート
-
- スポーツ 0.99 0.99 0.99 1000
- 金融 0.91 0.99 0.95 1000
- 不動産 1.00 1.00 1.00 1000
- ホーム 0.97 0.73 0.83 1000
- 教育 0.91 0.92 0.91 1000
- テクノロジー 0.93 0.96 0.94 1000
- ファッション 0.89 0.97 0.93 1000
- 時事 0.93 0.93 0.93 1000
- ゲーム 0.95 0.97 0.96 1000
- エンターテイメント 0.97 0.96 0.97 1000
-
- 平均/ 合計 0.94 0.94 0.94 10000
-
- 混同マトリックス...
- [[988 0 0 0 4 0 2 0 5 1]
- [ 0 9 9 0 1 1 1 1 0 6 0 0 ]
- [ 0 2 996 1 1 0 0 0 0 0 ]
- [ 2 71 1 731 51 20 88 28 3 5 ]
- [ 1 3 0 7 918 23 4 31 9 4 ]
- [ 1 3 0 3 0 964 3 5 21 0 ]
- [ 1 0 1 7 1 3 972 0 6 9]
- [ 0 16 0 0 22 26 0 931 2 3]
- [ 2 3 0 0 2 2 12 0 972 7 ]
- [ 0 3 1 1 7 3 11 5 9 960]]
- 使用時間: 0:00:33
テスト セットの精度は 94.22% に達し、ホーム カテゴリを除く各カテゴリの精度、再現率、f1 スコアは 0.9 を超えました。 混同行列から、分類効果が非常に優れていることがわかります。 2 つのモデルを比較すると、家庭用家具の分類のパフォーマンスを除いて、他のカテゴリでの RNN のパフォーマンスは CNN とそれほど変わらないことがわかります。 パラメータをさらに調整することで、より良い結果を得ることもできます。 |