今日はいよいよmnist以外のサンプルを実行します。IMDbデータセット50,000件の映画レビューのデータセット「肯定的」または「否定的」というラベルが用意されている。imdb.load_data(num_words=10000)num_wordsという引数は、出現頻度の高いnum_words個のデータ以外捨てるということを表している。32]1train_data[0]の中身を見ると、どうやらあらかじめ単語をインデックス(int)に置き換えて格納しているようだ。10000個の単語を抽出しているため、単語のインデックスが10000を超えることはない。train_data]))---9999IMDbデータセットのdecode整数の配列として表現されているものを映画レビューに復元する。vectorize_sequences(test_data)enumerateを使うと、for文をindex付で回すことができる。sequence]の部分だが、numpyの配列は以下のようにインデックスを配列で指定して取得ができる。5]one-hot表現に変換することで、単語の並び順の情報を消えるのだが、良いのだろうか。並び順が肯定的/否定的の判断に、意味があるかどうかは探索的データ分析を行った上での判断する必要がありそう。ラベルもベクトル化しておく。今回のような単純な入力には、単純な全結合層(Dense)のスタックとReLU活性化関数で構成されたネットワークが良い。activation='relu')ここで行われる計算は以下の通りであり、Wとinputの内積により、入力データは16次元の表現空間に射影される。10000)となっている。b)Dense層を使用する場合、アーキテクチャ上、2つの重要な意思決定が必要である。この意思決定のガイドラインは4章で説明されるそう。使用する層の数をいくつにするか各層の隠れユニットの数をいくつにするか今回の例では、以下の通りのネットワークになっている。現在のレビューの感情に関する予測値(スカラー)を出力する3つめの層ネットワーク定義のコンパイルmodel.compile関数で損失関数とオプティマイザの指定を行う。rmsprop交差エントロピーとは以下の式で表される損失関数。確率を出力するときは交差エントロピーが最適とのこと。訓練データを訓練用と検証用に分割する。25,000個のサンプルのうち、15,000を訓練用、10,000を検証用とする。検証用512サンプルのミニバッチで20エポックの訓練を行う処理は以下の通り。y_val))各エポックの最後に10,000個の検証データで損失率と正解率の計算を行う。学習履歴、history.historyに格納されているので、matplotlibを使って可視化できる。loss')plt.xlabel('Epochs')plt.ylabel('Loss')plt.legend()plt.show()まずは損失関数の推移。訓練用データに対する損失関数は20エポックを通して下がり続けているが、検証データに対しては4エポック目あたりで最小値になっている。これは過学習(overfitting)と呼ばれる問題で、訓練データに以外のデータに対する予測率が落ちてしまっている状態である。この場合、訓練のエポック数を減らして(今回の場合は4にして)再実行することでoverfittingを防ぐことができる。ちなみに、正答率もグラフ化できる。月別アーカイブリンクはてなブログブログをはじめる週刊はてなブログはてなブログProはてなブログをはじめよう!h-sakanoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。