<jupyter_start><jupyter_text>機械学習ハンズオン（MNIST画像分類編） 【課題】 MNIST（手書き数字データセット）の画像を0～9の数字に分類しましょう。ここでは、次の3つの方法を試します。 1. 1層パーセプトロン 1. 多層（…と言っても2層）パーセプトロン 1. 2層の畳み込みニューラルネットワーク(CNN)  事前準備（最初に一度だけ実行してください）  ライブラリのロードBinderで実行する場合は、1行目のコメントアウトを外して実行してください。<jupyter_code># !pip install tensorflow matplotlib
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np<jupyter_output><empty_output><jupyter_text>データセット(MNIST)の読み込みデータをダウンロードします。データは訓練データとテストデータに分かれて取得されます。<jupyter_code>mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()<jupyter_output><empty_output><jupyter_text>データの正規化MNISTのデータは各ピクセルが0-255の値を持ったモノクロデータですが、機械学習の効率を上げるため、これを0.0-1.0の範囲になるように数値を調整します。（注意）ここを複数回実行すると、その分だけ値が小さくなってしまいます。<jupyter_code>x_train, x_test = x_train / 255.0, x_test / 255.0<jupyter_output><empty_output><jupyter_text>調整後の画像データはこんな感じになります。<jupyter_code>print(x_train[0])<jupyter_output><empty_output><jupyter_text>1層パーセプトロン * モデル  1. 28*28の配列をフラット化する。  2. 入力が784ノード、出力が10ノードの全結合層を作る。この層の出力をsoftmaxで確率に変換する。 * 最適化  * Adamアルゴリズム * 損失  * 交差エントロピー  モデルの作成Kerasの学習モデルを作ります。<jupyter_code>model_slp = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model_slp.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
model_slp.summary()<jupyter_output><empty_output><jupyter_text>モデルの学習モデルに訓練データを渡して学習します。<jupyter_code>model_slp.fit(x_train, y_train, epochs=5)<jupyter_output><empty_output><jupyter_text>モデルの評価テストデータ（学習モデルにとっては未知のデータ）を使って、学習モデルを評価します。<jupyter_code>model_slp.evaluate(x_test, y_test)<jupyter_output><empty_output><jupyter_text>多層パーセプトロン * モデル  1. 28*28の配列をフラット化する。  2. 入力が784ノード、出力が512ノードの全結合層を作る。この層の出力をReLUでアクティベーションする（要するに負の値を0に変換している）。  3. 過学習を防ぐためにドロップアウト層を作る。（全ノードの20%だけ残して後を無効にする）  4. 入力が512ノード、出力が10ノードの全結合層を作る。この層の出力をsoftmaxで確率に変換する。 * 最適化  * 1層と同じ * 損失  * 1層と同じ  モデルの作成<jupyter_code>model_mlp = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model_mlp.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
model_mlp.summary()<jupyter_output><empty_output><jupyter_text>モデルの学習<jupyter_code>model_mlp.fit(x_train, y_train, epochs=5)<jupyter_output><empty_output><jupyter_text>モデルの評価<jupyter_code>model_mlp.evaluate(x_test, y_test)<jupyter_output><empty_output><jupyter_text>畳み込みニューラルネットワーク * モデル   1. 5x5のフィルターを32個作って畳み込みを行う。   1. 2x2で最大プーリングする。   1. さらに5x5のフィルターを64個作って畳み込みを行う。   1. さらに2x2で最大プーリングする。   1. いったんフラット化する。   1. 出力1024ノードの全結合層を作る。   1. 出力10ノードの全結合層を作る。この出力をsoftmaxで確率に変換する。<jupyter_code>model_cnn = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(filters=32, kernel_size=[5, 5], padding='same', activation=tf.nn.relu),
    tf.keras.layers.MaxPooling2D(pool_size=[2, 2], strides=[2, 2]),
    tf.keras.layers.Conv2D(filters=64, kernel_size=[5, 5], padding='same', activation=tf.nn.relu),
    tf.keras.layers.MaxPooling2D(pool_size=[2, 2], strides=[2, 2]),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(1024, activation=tf.nn.relu),
    tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model_cnn.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])<jupyter_output><empty_output><jupyter_text>モデルの学習<jupyter_code>x_train_cnn = x_train.reshape(x_train.shape[0], 28, 28, 1)
model_cnn.fit(x_train_cnn, y_train, epochs=5)
# もしここでエラーが出てしまったら、このセルを再実行するか、このセルを無視してください。
model_cnn.summary()<jupyter_output><empty_output><jupyter_text>モデルの評価<jupyter_code>x_test_cnn = x_test.reshape(x_test.shape[0], 28, 28, 1)
model_cnn.evaluate(x_test_cnn, y_test)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13134404488650855, 'fraction_numerical': 0.03723539913287427, 'mean_word_length': 7.638766519823789, 'pattern_counts': {'":': 0, '<': 53, '<?xml version=': 0, '>': 53, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '13', 'dir': 'jupyter-structured-clean-dedup', 'id': '78134', 'license': 'MIT', 'n_tokens_mistral': 2399, 'n_tokens_neox': 2250, 'n_words': 145, 'path': 'mnist_classification.ipynb', 'repo_name': 'tnaka78/machine_learning_handson', 'size': '3921'}