TensorFlowとCIFAR-10を使用した画像分類の解説

![スクリーンショット 2023-12-08 165346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/2275b51b-1bf9-9efb-68dc-77266c7c15f4.png)

## はじめに

画像分類は、機械学習の分野で広く使用される技術の一つです。この記事では、TensorFlowを使用してオープンデータを基に簡単に画像分類を行う方法について説明します。

## **ステップ1: オープンデータの取得**

最初のステップは、オープンデータを取得することです。多くのオープンデータセットがオンラインで利用可能で、例えば[Kaggle](https://www.kaggle.com/datasets)、[ImageNet](http://www.image-net.org/)、[CIFAR-10](https://www.cs.toronto.edu/~kriz/cifar.html)などがあります。今回は、CIFAR-10データセットを使用します。

```python
import tensorflow as tf

# CIFAR-10データセットの読み込み
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()

```
CIFAR-10データセットは車や鳥など10カテゴリのデータが含まれています。
実際に取り込んだ画像データから5枚の画像を確認してみます。
```
# クラス名の定義
class_names = ['Airplane', 'Car', 'Bird', 'Cat', 'Deer', 'Dog', 'Frog', 'Horse', 'Ship', 'Truck']

# 画像の表示
plt.figure(figsize=(10,10))
for i in range(5):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(x_train[i], cmap=plt.cm.binary)
    # CIFARのラベルは0から始まるので、そのままクラス名にインデックスとして使用
    plt.xlabel(class_names[y_train[i][0]])
plt.show()
```
![スクリーンショット 2023-12-08 124350.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/e81787ef-615d-a93d-aeab-e3e8310f80e6.png)

## **ステップ2: データの前処理**

データをモデルに入力する前に、適切な前処理が必要です。一般的な前処理には、正規化やリサイズなどが含まれます。

```python
# データの正規化
x_train, x_test = x_train / 255.0, x_test / 255.0
```

## **ステップ3: モデルの構築と訓練**

モデルの構築には、TensorFlowのKeras APIを使用します。ここでは、シンプルなニューラルネットワーク（）を構築し、活性化関数としてReLUを使用します。このモデルは入力層、隠れ層、そして出力層から構成され、各層は特定の目的を果たします。モデルのコンパイルでは、最適化アルゴリズム、損失関数、評価指標を定義します。訓練プロセスでは、モデルがデータからパターンを学習することが重要です。

```python
model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])
#モデルをコンパイルし、訓練データを使ってモデルを訓練
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=10)
```

## **ステップ4: モデルの評価と使用**

最後に、テストデータを使ってモデルの性能を評価します。

```python
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print('\nTest accuracy:', test_acc)
```
Test accuracy: 0.797700023651123

## **ステップ5: テスト結果を可視化**

モデルの予測を視覚的に確認するために、テスト画像とその予測ラベルを表示てみます。

```python
# テストデータセットから予測を行う
predictions = model.predict(x_test)

# 画像と予測ラベルの表示
plt.figure(figsize=(10,10))
for i in range(10):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(x_test[i], interpolation='lanczos')
    predicted_label = np.argmax(predictions[i])
    true_label = y_test[i][0]
    if predicted_label == true_label:
        color = 'blue'
    else:
        color = 'red'
    plt.xlabel("{} ({})".format(class_names[predicted_label], 
                                class_names[true_label]),
                                color=color)
```
それぞれの画像の下に予測ラベルと実際のラベルが表示されます。予測が正しい場合は青色で、間違っている場合は赤色でラベルを表示されます。

今回は10問中、9問が正しくに分類されましたが、1問だけカエル（Frog）が鹿（Deer）と誤認されてしまったことが確認できます。
![スクリーンショット 2023-12-08 172009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/62e41a1d-9656-c553-9f01-163123f199d0.png)

## **まとめ**

この記事では、TensorFlowを使用してオープンデータを基に画像分類を行う方法を紹介しました。この基本的な流れを理解することで、個人の持つ画像データなど、さまざまな種類の画像分類タスクに取り組むことができます。