20211011のTensorFlowに関する記事は1件です。

言語処理100本ノック(2020)-73: 確率的勾配降下法による学習(TensorFlow)

言語処理100本ノック 2020 (Rev2)の「第8章: ニューラルネット」の73本目「確率的勾配降下法による学習」記録です。いよいよ訓練が始まり、機械学習っぽくなってきました。ここまで来るとやったことがある内容でスラスラ解けるようになりました(Kerasがやってくれるし)。逆に改めてkerasではなく自分で計算すべきとも感じました。 記事「まとめ: 言語処理100本ノックで学べることと成果」に言語処理100本ノック 2015についてはまとめていますが、追加で差分の言語処理100本ノック 2020 (Rev2)についても更新します。 参考リンク リンク 備考 73_確率的勾配降下法による学習.ipynb 回答プログラムのGitHubリンク 言語処理100本ノック 2020 第8章: ニューラルネット (PyTorchだけど)解き方の参考 【言語処理100本ノック 2020】第8章: ニューラルネット (PyTorchだけど)解き方の参考 まとめ: 言語処理100本ノックで学べることと成果 言語処理100本ノックまとめ記事 【Keras入門(1)】単純なディープラーニングモデル定義 Keras入門 環境 後々GPUを使わないと厳しいので、Goolge Colaboratry使いました。Pythonやそのパッケージでより新しいバージョンありますが、新機能使っていないので、プリインストールされているものをそのまま使っています。 種類 バージョン 内容 Python 3.7.12 Google Colaboratoryのバージョン google 2.0.3 Google Driveのマウントに使用 tensorflow 2.6.0 ディープラーニングの主要処理 第8章: ニューラルネット 学習内容 深層学習フレームワークの使い方を学び,ニューラルネットワークに基づくカテゴリ分類を実装します. ノック内容 第6章で取り組んだニュース記事のカテゴリ分類を題材として,ニューラルネットワークでカテゴリ分類モデルを実装する.なお,この章ではPyTorch, TensorFlow, Chainerなどの機械学習プラットフォームを活用せよ. 73. 確率的勾配降下法による学習 確率的勾配降下法(SGD: Stochastic Gradient Descent)を用いて,行列$W$を学習せよ.なお,学習は適当な基準で終了させればよい(例えば「100エポックで終了」など). 回答 回答プログラム 73_確率的勾配降下法による学習.ipynb GitHubには確認用コードも含めていますが、ここには必要なものだけ載せています。 import tensorflow as tf from google.colab import drive drive.mount('/content/drive') BASE_PATH = '/content/drive/MyDrive/ColabNotebooks/ML/NLP100_2020/08.NeuralNetworks/' train_raw = tf.data.TFRecordDataset(BASE_PATH+'train.tfrecord') def _parse_function(example_proto): # 特徴の記述 feature_description = { 'title': tf.io.FixedLenFeature([], tf.string), 'category': tf.io.FixedLenFeature([], tf.string)} # 上記の記述を使って入力の tf.Example を処理 features = tf.io.parse_single_example(example_proto, feature_description) X = tf.io.decode_raw(features['title'], tf.float32) y = tf.io.decode_raw(features['category'], tf.int32) return X, y model = tf.keras.Sequential( [tf.keras.layers.Dense( 4, activation='softmax', use_bias=False, input_dim=300, kernel_initializer='random_uniform') ]) model.compile(loss="categorical_crossentropy", optimizer="sgd") train_ds = train_raw.map(_parse_function).shuffle(1000).batch(64) model.fit(train_ds, epochs=100) 回答解説 モデル定義 kerasでSequentialモデルを定義します。 model = tf.keras.Sequential( [tf.keras.layers.Dense( 4, activation='softmax', use_bias=False, input_dim=300, kernel_initializer='random_uniform') ]) model.compile(loss="categorical_crossentropy", optimizer="sgd") model.summary() summary関数でモデル内容を出力。300次元×4クラスで1200の学習可能なパラメータ(行列W)があることがわかります。基本的なkerasの使い方は記事「【Keras入門(1)】単純なディープラーニングモデル定義」に書きました。 結果 Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 4) 1200 ================================================================= Total params: 1,200 Trainable params: 1,200 Non-trainable params: 0 データセット設定 バッチサイズを64にしてデータセットを作ります。shuffleについては記事「TensorFlowのDataset.shuffleのbuffer_size」を見て理解しました。データセット全件をシャッフルしたかったのですが、TFrecord形式のデータから件数を取得する方法が、少し調べただけだとよくわからず、1000件シャッフルにしています。 train_ds = train_raw.map(_parse_function).shuffle(1000).batch(64) print(train_ds) 結果 <BatchDataset shapes: ((None, None), (None, None)), types: (tf.float32, tf.int32)> 訓練実行 100エポック訓練をまわします。Google ColaboratoryでGPU使って2分半程度かかります。 %%time model.fit(train_ds, epochs=100) Lossが0.45くらいまで下がりました。そんな良くない結果です。後のノックで改善していくので結果は気にしないようにしました。 結果 Epoch 1/100 167/167 [==============================] - 5s 6ms/step - loss: 1.2911 Epoch 2/100 167/167 [==============================] - 1s 6ms/step - loss: 1.1737 中略 Epoch 99/100 167/167 [==============================] - 1s 6ms/step - loss: 0.4591 Epoch 100/100 167/167 [==============================] - 1s 5ms/step - loss: 0.4578 CPU times: user 1min 49s, sys: 36.6 s, total: 2min 25s Wall time: 2min 1s
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む