Tensorflowを超初心者向けに超わかりやすく解説（完成版コードあり）

#この記事を書こうと思ったきっかけ
最近TFにハマって公式Docなどを見ながら色々書いているんですが、ある日気づきました。あのQiitaに初心者向け解説用の記事があんまねぇ!当時の初心者からみるとどれやればええねん、、という状況でした（）
ということで初心者さんが入り込めるようにしたいなと思いこの記事を書いています。(プログラミング初心者ってQiita知らない人多いらしい:thinking:)
#①Tensorflowとは？
TensorFlow（テンソルフロー、テンサーフロー）とは、Googleが開発しオープンソースで公開している、機械学習に用いるためのソフトウェアライブラリである。 英語の発音のまま読んだ場合はテンサーフローだが、数学用語のtensorはテンソルと読むのでどちらの読み方もあっていると言える。(https://ja.wikipedia.org/wiki/TensorFlow )
#②筆者の環境
Win10 Home
Python 3.8(anaconda) 
VSCode
Tensorflow 2.6
今回は、"とあるもの"でコードを実行するので、そこまで高スペックなPCはいりません。
#③AIを作るための準備
まず[Tensorflow初心者向けチュートリアルページ](https://www.tensorflow.org/tutorials/keras/classification) を開き、別のタブで[Google Colab](https://colab.research.google.com/)　を開きます。
<details><summary>Google ColabとはPythonの重い処理をGoogleのサーバーが実行してくれるすごいサービスです。

:::note info
勿論、無料で利用できます
:::
開くと、 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1904324/491255f0-7403-d6f7-9503-4ecb3bab5b81.png)
このような画面が表示されるので、ノートブックを新規作成を押すと、![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1904324/5a925150-970e-9e80-eb4a-993c52789278.png)
画面が切り替わります。これで（一応）開発ができるようになりました。
試しに、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1904324/81028ce4-4bf1-6453-65c7-b300f1815e7a.png)
矢印の先にある四角いところに、

```python:hello.py
print('hello world!')
```
と入力し、左にある再生ボタンを押してみましょう。Googleのサーバーとの接続が始まり、しばらくまつと、「hello world!」と表示されます。**この実行までの動作は覚えておいてください。**
次に、GoogleColabにGPUをつけてパワーアップします！
「ランタイム」 → 「ランタイムのタイプを変更」から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1904324/a72f95e1-4ac1-ca16-e613-41609cdb4b7e.png)
「ハードウェアアクセラレータ」で「GPU」を選択して保存してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1904324/dbc0aa8d-0f86-b554-193c-ba54acc3a945.png)
これで準備は完了です!

#④TF公式チュートリアルを見ながらAI作成
まず、AIを作成するために使うツールを読み込みます。③でやったGoogleColabの四角いところに、

```python:fashion_minist_tf.py
# TensorFlow と tf.keras のインポート
import tensorflow as tf
from tensorflow import keras

# ヘルパーライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt

print(tf.__version__)
```
と入力して実行しましょう。
実行結果に数字が出てくれば大丈夫です。
数字が出てきたことを確認したら

```python:fashion_minist_tf.py
print(tf.__version__)
```
の、部分を消して下さい（確認用だったので）
今回のチュートリアルでは、Fashion MNISTというものを使用します。Fashion MNISTには10カテゴリーの白黒画像70,000枚が含まれていて、それぞれは下図のような1枚に付き1種類の衣料品が写っているチュートリアル用の教材のようなものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1904324/fb510e89-b138-35f3-54f1-925198f91102.png)

これらを分類学習して、最終的には写真からどの種類の衣料品かがわかるAIを作れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1904324/24794868-ea9a-8633-172a-8770fe20112d.png)
そして、下のコードを入力して下さい

```python:fashion_minist_tf.py
fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
```
このコードを解説すると、
・train_images と train_labels の2つの配列は、Aiの学習に使用される訓練用データで、訓練されたモデルは、 
・test_images と test_labels 配列からなるテスト用データを使ってテストします。
次に、上の学習用データの中身に名前をつけます。

```python:fashion_minist_tf.py
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
```
見てわかると売りですが、Tシャツやドレス、コートやスニーカーなどのラベルを付けています。
AIに学習する前に、読み込めるようにデータを加工（前処理）する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1904324/7836b7ac-a4e0-58c1-f53d-7b999aec6cbf.png)

画像を調べてみればわかるように、画像の大きさは0から255の間の数値です。
AIにデータを投入する前に、これらの値を0から1までの範囲にスケールします。そのためには、画像データの値を255で割ります。
訓練用データセットとテスト用データセットは、同じように加工（前処理）することが重要です。

```python:fashion_minist_tf.py
train_images = train_images / 255.0

test_images = test_images / 255.0
```
訓練用データの最初の25枚の画像を、名前付きで表示してみましょう。AIを構築・訓練する前に、データが正しくなっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1904324/9dfdba3c-428b-8544-8a6a-1d6d2b5faff7.png)
確認してみるとちゃんと英語で名前が表示されています。

次にすごく重要なことをやるのですが、説明が難しいのでコードだけ載せておきます。気になる人は公式のチュートリアル見て下さい。

```python:fashion_minist_tf.py
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam', 
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
```

そうしたらモデルの訓練を行います。
まず、モデルに訓練用データを投入し、モデルにテスト用データセットの予測（分類）を行わせます。

```python:fashion_minist_tf.py
model.fit(train_images, train_labels, epochs=5)
```
ここまで入力したらプログラムを実行して下さい。少し時間がかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1904324/edcef690-8b47-915a-e410-1838ab220ec8.png)
モデルの訓練が終わったら、そのモデルを使って画像の分類予測を行うことが出来ます。

```python:fashion_minist_tf.py
predictions = model.predict(test_images)
```
もう少しです！
分類予測の結果を写真とグラフをともに表示してみましょう！

```python:fashion_minist_tf.py
# X個のテスト画像、予測されたラベル、正解ラベルを表示します。
# 正しい予測は青で、間違った予測は赤で表示しています。
num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
  plt.subplot(num_rows, 2*num_cols, 2*i+1)
  plot_image(i, predictions, test_labels, test_images)
  plt.subplot(num_rows, 2*num_cols, 2*i+2)
  plot_value_array(i, predictions, test_labels)
plt.show()
```
手を休めて実行してみましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1904324/1985faa7-58d2-3531-bf23-0aede5831436.png)
上のようなものが表示されたら成功です！（少し時間がかかります）（実行結果は違うかもしれません）

#記事を書いてみての感想
これが自分のQiita初投稿です（）専門用語とかをわかりやすくしたりするのが意外と大変でしたね、、
「初心者なのですが行き詰まってる、」というような人のためになれば幸いです。
まあこれからもいろいろな記事を書いていくのでよろしくおねがいします！

#完成版コード
```python:fashion_minist_tf.py
# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras

# Helper libraries
import numpy as np
import matplotlib.pyplot as plt

fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
train_images = train_images / 255.0

test_images = test_images / 255.0

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', 
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5)
predictions = model.predict(test_images)
def plot_image(i, predictions_array, true_label, img):
    predictions_array, true_label, img = predictions_array[i], true_label[i], img[i]
    plt.grid(False)
    plt.xticks([])
    plt.yticks([])

    plt.imshow(img, cmap=plt.cm.binary)

    predicted_label = np.argmax(predictions_array)
    if predicted_label == true_label:
        color = 'blue'
    else:
        color = 'red'

    plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
                                    100*np.max(predictions_array),
                                    class_names[true_label]),
                                    color=color)

def plot_value_array(i, predictions_array, true_label):
    predictions_array, true_label = predictions_array[i], true_label[i]
    plt.grid(False)
    plt.xticks([])
    plt.yticks([])

    thisplot = plt.bar(range(10), predictions_array, color="#777777")
    plt.ylim([0, 1]) 
    predicted_label = np.argmax(predictions_array)

    thisplot[predicted_label].set_color('red')
    thisplot[true_label].set_color('blue')


# X個のテスト画像、予測されたラベル、正解ラベルを表示します。
# 正しい予測は青で、間違った予測は赤で表示しています。
num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
  plt.subplot(num_rows, 2*num_cols, 2*i+1)
  plot_image(i, predictions, test_labels, test_images)
  plt.subplot(num_rows, 2*num_cols, 2*i+2)
  plot_value_array(i, predictions, test_labels)
plt.show()
```