Tensorflow と Keras を使って機械学習の実験環境を試します。サンプルプログラムが正常に動作することを確認するのが目的です。機械学習の内容については、この記事では深く入ることはしません。
Tensorflowのインストール
事前準備として、Mac の場合は Macの環境設定 を見て基本的な設定を済ませておいてください。Intel Mac と Apple Silicon Mac の違いについてもこのページに説明があります。
Windows または Intel Mac の場合は Anacondaをインストール して、Tensorflowをインストール(Anaconda編)してください。Apple Silicon Mac の場合は miniforgeをインストール して、Tensorflowをインストール(miniforge編)してください。
Keras は以前は独立したライブラリでしたが、現在では Tensorflow の一部として取り込まれています。改めてインストールする必要はありません。
以下の説明は、condaコマンドで “tensorflow” という名前の仮想環境を作り、Tensorflowがインストールされている前提で進めます。
インストールの確認
Tensotflow が正しくインストールされたこと確認するため、バージョンを表示するだけの小さなプログラムを走らせてみます。この後で実際に機械学習のサンプルを動作させますが、操作手順は全く同じです。
ターミナルを使う場合
Windows の場合は Anaconda Powershell Prompt (anaconda3) を、Mac の場合はターミナルを起動して仮想環境に入ります。
1 2 |
$ conda activate tensorflow (tensorflow) $ |
下に示したのは仮想環境において Python の対話モードに入り、Python のバージョンと Tensorflow のバージョンを確認したところです。Pythonのコマンド名は環境によって異なります。”python3″ で起動できないときは “python” コマンドを使ってください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
(tensorflow) $ python3 Python 3.8.10 | packaged by conda-forge | (default, May 11 2021, 06:27:18) [Clang 11.1.0 ] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> print(sys.version) 3.8.10 | packaged by conda-forge | (default, May 11 2021, 06:27:18) [Clang 11.1.0 ] >>> import tensorflow as tf Init Plugin Init Graph Optimizer Init Kernel >>> print('Tensorflow', tf.__version__) Tensorflow 2.5.0 >>> exit() (tensorflow) $ |
テキストエディタで Python のプログラムを書いてターミナルから実行することもできます。もしテキストエディタを持っていなければ Visual Studio Code (VSCode) をお勧めします。次にプログラムの例を示します。必ずエンコーディングを “UTF-8” に設定して保存してください。ファイル名は tftest.py としました。
1 2 3 4 |
import sys import tensorflow as tf print(sys.version) print('Tensorflow', tf.__version__) |
プログラムの実行はこのようにします。
1 2 3 4 5 6 7 8 |
(tensorflow) $ python3 tftest.py Init Plugin Init Graph Optimizer Init Kernel 3.8.10 | packaged by conda-forge | (default, May 11 2021, 06:27:18) [Clang 11.1.0 ] Tensorflow 2.5.0 (tensorflow) $ |
Jupyter Notebook の場合
Anaconda をインストールしている場合(Windows または Intel Mac)はメイン画面の上部で仮想環境を選択して、Jupyter Notebookの “Launch” を押します。ボタンが “Install” になっている場合は Jupyter Notebook がインストールされますので、その後 “Launch” を押します。
miniforge をインストールしている場合(Apple Silicon Mac)はターミナルで仮想環境に入り、まだ Jupyter Notebook をインストールしてない場合はインストールしてください。
1 |
(tensorflow) $ conda install jupyter |
そして Jupyter Notebook を起動してください。
1 |
(tensorflow) $ jupyter notebook |
Jupyter Notebook がブラウザ上で起動しますので、[New/新規] のメニューから [Python3] または [Python3 (ipykernel)] を選びます。ドライブの最上位の階層だとエラーになるかもしれません。その場合は適当な作業フォルダに移動してから実行してください。
Pythonプログラムを1行または数行ずつ実行することができます。プログラムを打ち込んだら Shift+Enter または上部の Runアイコン(▶)で実行できます。Tensorflowがインポートできることを確認してください。
Kerasのサンプルコードを試す
Kerasのサンプルコードにアクセスします。これはmnistと呼ばれる手書き文字のデータセットを認識するサンプルです。いくつかに別れていますが、すべてのコードをコピペしてプログラムを作成します。ファイル名は適当で構いませんが、ここでは tensorflow_sample.py としました。下に作ったものを示します。55行目で、処理時間を短縮するために epochs = 3 と変更してあります。ソースコードをコピペする場合は下スクロールして最後までコピーしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
import numpy as np from tensorflow import keras from tensorflow.keras import layers # # Prepare the data # # Model / data parameters num_classes = 10 input_shape = (28, 28, 1) # the data, split between train and test sets (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() # Scale images to the [0, 1] range x_train = x_train.astype("float32") / 255 x_test = x_test.astype("float32") / 255 # Make sure images have shape (28, 28, 1) x_train = np.expand_dims(x_train, -1) x_test = np.expand_dims(x_test, -1) print("x_train shape:", x_train.shape) print(x_train.shape[0], "train samples") print(x_test.shape[0], "test samples") # convert class vectors to binary class matrices y_train = keras.utils.to_categorical(y_train, num_classes) y_test = keras.utils.to_categorical(y_test, num_classes) # # Build the model # model = keras.Sequential( [ keras.Input(shape=input_shape), layers.Conv2D(32, kernel_size=(3, 3), activation="relu"), layers.MaxPooling2D(pool_size=(2, 2)), layers.Conv2D(64, kernel_size=(3, 3), activation="relu"), layers.MaxPooling2D(pool_size=(2, 2)), layers.Flatten(), layers.Dropout(0.5), layers.Dense(num_classes, activation="softmax"), ] ) model.summary() # # Train the model # batch_size = 128 epochs = 3 # 15 model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1) # # Evaluate the traned model # score = model.evaluate(x_test, y_test, verbose=0) print("Test loss:", score[0]) print("Test accuracy:", score[1]) |
実際に動作させます。ここではターミナルで実行しています。コマンド名は python3 ではなく python かもしれません。環境に合わせて実行してください。
Jupyter Notebook で動作させる場合も同じソースコードで動きます。ソースコード全体をひとつのセル内にコピペして、そのセルを実行してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
(tensorflow) $ python3 tensorflow_sample.py x_train shape: (60000, 28, 28, 1) 60000 train samples 10000 test samples Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d (Conv2D) (None, 26, 26, 32) 320 _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0 _________________________________________________________________ conv2d_1 (Conv2D) (None, 11, 11, 64) 18496 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64) 0 _________________________________________________________________ flatten (Flatten) (None, 1600) 0 _________________________________________________________________ dropout (Dropout) (None, 1600) 0 _________________________________________________________________ dense (Dense) (None, 10) 16010 ================================================================= Total params: 34,826 Trainable params: 34,826 Non-trainable params: 0 _________________________________________________________________ 2021-08-24 09:59:17.218950: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2) 2021-08-24 09:59:17.219091: W tensorflow/core/platform/profile_utils/cpu_utils.cc:126] Failed to get CPU frequency: 0 Hz Epoch 1/3 WARNING:tensorflow:AutoGraph could not transform <function Model.make_train_function.<locals>.train_function at 0x12513d940> and will run it as-is. Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: unsupported operand type(s) for -: 'NoneType' and 'int' To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert 422/422 [==============================] - ETA: 0s - loss: 0.8789 - accuracy: 0.7346WARNING:tensorflow:AutoGraph could not transform <function Model.make_test_function.<locals>.test_function at 0x1418c11f0> and will run it as-is. Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: unsupported operand type(s) for -: 'NoneType' and 'int' To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert 422/422 [==============================] - 7s 17ms/step - loss: 0.8780 - accuracy: 0.7349 - val_loss: 2.3863 - val_accuracy: 0.8653 Epoch 2/3 422/422 [==============================] - 7s 17ms/step - loss: 0.2930 - accuracy: 0.9368 - val_loss: 3.6311 - val_accuracy: 0.8707 Epoch 3/3 422/422 [==============================] - 7s 17ms/step - loss: 0.2797 - accuracy: 0.9499 - val_loss: 5.2125 - val_accuracy: 0.8650 Test loss: 0.15352922677993774 Test accuracy: 0.9729999899864197 (tensorflow) $ |
上の実行例では97.3%の精度で学習できていることがわかります。
コメント