※当ブログではアフィリエイト広告を利用しています。
- はじめに
- TensorFlowって?
- TensorFlowで実装できるアルゴリズム
- TensorFlowをインストールする方法
- 必要条件
- TensorFlowのインストール
- 必要なパッケージのインストール
- セットアップの確認
- TensorFlowでニューラルネットワークを実装する
- スクリプト
- 各スクリプトの解説
- まとめ
- ☀️新着記事
はじめに
この記事を読めば、とりあえず一回動かせるようになります。
TensorFlowって?
TensorFlow は、機械学習向けに開発されたエンドツーエンドのオープンソース プラットフォームです TensorFlow公式より引用
主に「ニューラルネットワークも実装できる便利なツール」です。
ニューラルネットワークを実装しようと思うと、TensorFlowのほかにはPyTorchも有名ですが、今回は特にTensorFlowに焦点を当てています。
TensorFlowで実装できるアルゴリズム
TensorFlowではニューラルネットワーク以外にも様々なアルゴリズムが実装できます。
- ディープラーニング:
- フィードフォワードニューラルネットワーク (DNN)
- 畳み込みニューラルネットワーク (CNN): 画像処理やコンピュータビジョンタスクに適しています。
- 再帰型ニューラルネットワーク (RNN): 時系列データやテキストデータの処理に適しています。
- 変分オートエンコーダ (VAE) と 生成敵対ネットワーク (GAN): 画像生成や教師なし学習に関するタスクに使用されます。
- Transformer: テキスト処理や自然言語処理タスクに革命をもたらしたモデル。
- 強化学習:
- TensorFlowを使用して、エージェントの訓練や環境のシミュレーションを行うことができます。特に、TF-AgentsというTensorFlowの強化学習ライブラリを使用することで、様々なアルゴリズムを簡単に実装できます。
- 従来の機械学習:
- TensorFlowには、線形回帰、ロジスティック回帰、決定木、ランダムフォレスト、勾配ブースティングマシンなどの従来の機械学習アルゴリズムも組み込まれています。特に、TensorFlow Extended (TFX) や TensorFlow Decision Forests などの拡張ライブラリを使用することで、これらのアルゴリズムを効果的に利用することができます。
- クラスタリングや次元削減:
- K-means クラスタリングや PCA (主成分分析)、t-SNE などのアルゴリズムもTensorFlowで実装・実行することができます。
- 埋め込み学習:
- TensorFlow HubやEmbedding Projectorを使用して、様々なデータの埋め込みを学習・視覚化することができます。
- ニューラルネットワークの最適化:
- 量子化、プルーニング、知識の蒸留など、モデルのサイズを削減したり、推論速度を向上させるためのテクニックもサポートされています。
TensorFlowをインストールする方法
TensorFlowを使用する前に、まずは適切にセットアップを行う必要があります。以下は、TensorFlowをインストールし、必要なパッケージを設定する手順を示しています。
必要条件
- Python 3.5 以上
- pip (Pythonのパッケージ管理ツール)
TensorFlowのインストール
- コマンドプロンプトまたはターミナルを開きます。
- 以下のコマンドを実行して、TensorFlowをインストールします。
pip install tensorflow
このコマンドにより、最新の安定版TensorFlowがインストールされます。
必要なパッケージのインストール
MNISTデータセットを使用するためには、Keras APIも必要となりますが、TensorFlow 2.x 以降ではKerasはTensorFlowに組み込まれているため、追加のインストールは不要です。
セットアップの確認
以下の簡単なコードをPythonスクリプトとして実行することで、TensorFlowが正しくセットアップされているかを確認できます。
import tensorflow as tf
print(tf.__version__)
このコードは、インストールされているTensorFlowのバージョンを出力します。エラーが表示されず、バージョン番号が表示されれば、セットアップは成功しています。
TensorFlowでニューラルネットワークを実装する
有名で簡単な例として、手書き数字の認識を行う「MNIST」データセットを使った例が挙げられます。
MNISTは、28x28ピクセルの手書き数字の画像と、それに対応するラベル(0から9の数字)からなるデータセットです。
スクリプト
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
# データのロード
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# データの前処理
train_images = train_images / 255.0
test_images = test_images / 255.0
# モデルの構築
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
# モデルのコンパイル
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# モデルの訓練
model.fit(train_images, train_labels, epochs=5)
# モデルの評価
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'テスト精度: {test_acc}')
各スクリプトの解説
# データのロード
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
それぞれ以下の項目がロードできます。
- train_imagesおよびtest_imagesは、前述の手書きの画像データ
- train_labelsおよびtest_labelsは、それが実際なんの数字なのか?の答え
# データの前処理
train_images = train_images / 255.0
test_images = test_images / 255.0
前処理として、画像のピクセル値を0~1の範囲に正規化しています。
具体的には、MNISTの画像データは各ピクセルの値が0~255の範囲で与えられています(0が完全な白、255が完全な黒を示す)。多くのニューラルネットワークのモデルは、入力値が小さい範囲に正規化されている方が、訓練が効果的に行われることが知られています。
以下の理由から、入力データの正規化が有用であるとされています:
- 勾配の爆発・消失: ニューラルネットワークの深い層での勾配の爆発や消失を防ぐため。
- 収束速度: 正規化された入力は、モデルの収束を速めることが多い。
- 重みの初期化: 一般的な重みの初期化手法は、入力が正規化されていることを前提としている場合がある。
上記のような理由から、0~255の範囲のピクセル値を0~1の範囲にスケーリングするために、255で割る操作を行っています。
# モデルの構築
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
ここはモデルを構築しています。
サンプルでは784の要素ベクトルを128,10とどんどん圧縮させています。
- Flatten レイヤー: 28x28の画像を1次元の784要素のベクトルに変換します。
- 最初の Dense レイヤー: 784要素のベクトルを128要素のベクトルに変換します。
- 2つ目の Dense レイヤー: 128要素のベクトルを10要素のベクトルに変換します。
また最初のDenseレイヤーのactivation='relu'
は、レイヤーの活性化関数としてReLU (Rectified Linear Unit) を使用することを示しています。ReLU関数は、非線形性を導入し、モデルが複雑な関数を学習するのに役立ちます。
2つ目のDenseレイヤーのactivation='softmax'
は、レイヤーの活性化関数としてSoftmax関数を使用することを示しています。Softmax関数は、各ニューロンの出力を確率として解釈できるように、出力の合計が1になるように変換します。MNISTの場合、10のカテゴリ(0から9の数字)を分類する必要があるため、10個のニューロンが使用されます。
# モデルのコンパイル
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.compile()
は、ニューラルネットワークモデルを訓練するための設定を行うメソッドです。以下の引数を指定しています:
optimizer='adam'
:- これは最適化アルゴリズムを指定するものです。最適化アルゴリズムは、モデルの重みを更新する方法を決定します。
adam
は、適応的な学習率を持つ効果的な最適化アルゴリズムの一つです。他にも多くの最適化アルゴリズムがありますが、adam
は一般的に良い結果をもたらすことが多いため、よく使用されます。loss='sparse_categorical_crossentropy'
:- 損失関数を指定します。損失関数は、モデルの出力が正解とどれだけ離れているかを計算するものです。
sparse_categorical_crossentropy
は、多クラス分類問題に適した損失関数です。MNISTのように、ラベルが整数の場合(例: 0, 1, 2, ...)に使用します。ラベルがワンホットエンコーディングされている場合は、categorical_crossentropy
を使用します。metrics=['accuracy']
:- 訓練中に評価したい指標をリスト形式で指定します。
accuracy
は、正しく分類されたサンプルの割合を示す指標です。分類問題ではよく使用されます。
この compile
ステップは、モデルの訓練プロセスをどのように行うかを定義するものです。具体的には、どのような最適化アルゴリズムを使うか、どのようにモデルの性能を評価するかなどの設定を行います。
# モデルの訓練
model.fit(train_images, train_labels, epochs=5)
model.fit()
は、モデルの訓練を行うためのメソッドです。このメソッドにはいくつかの引数があり、以下のように指定されています:
train_images
:- 訓練データの入力として使用する画像データです。これは先ほど前処理を行った28x28の手書き数字の画像データの配列です。
train_labels
:- 訓練データの真のラベルです。これは0から9の整数の配列で、
train_images
の各画像が示す数字を表しています。 epochs=5
:- エポック数を指定します。1エポックは、訓練データ全体を一度モデルに通すことを意味します。この場合、訓練データ全体を5回モデルに通すことになります。
- エポック数を増やすと、モデルは訓練データをより多く見ることになりますが、過学習のリスクも高まる可能性があります。逆にエポック数を減らすと、訓練が不十分になる可能性があります。
この fit
メソッドを実行すると、モデルは指定されたエポック数だけ訓練データを使用して学習を行います。学習中、各エポックでの損失と指定された評価指標(この場合は精度)が表示されます。これにより、モデルの学習が進行するにつれて、その性能がどのように変わるかを確認することができます。
# モデルの評価
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'テスト精度: {test_acc}')
model.evaluate()
は、モデルの性能を評価するためのメソッドです。訓練済みのモデルを使って、テストデータセット上での性能を確認するために使用されます。
引数として次のものが指定されています:
test_images
:- 評価に使用するテストデータの入力画像です。これは前処理を行った28x28の手書き数字の画像データの配列です。
test_labels
:- テストデータの真のラベルです。これは0から9の整数の配列で、
test_images
の各画像が示す数字を表しています。
このメソッドを実行すると、テストデータを使用してモデルの損失と精度が計算され、それらの値が返されます。この例では、テストデータ上の損失は test_loss
に、精度は test_acc
に格納されます。
最後の print
文は、テストデータ上でのモデルの精度を表示しています。これにより、モデルが未見のデータに対してどれくらいの性能を持っているかを確認することができます。
まとめ
以上で、ためしにTensorFlowを動かせました!
このスクリプトはコピペで動くきますので、よければお試しください!