<jupyter_start><jupyter_text>Copyright 2018-2019 Digital Advantage - Deep Insider.<jupyter_code>#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.<jupyter_output><empty_output><jupyter_text>連載『機械学習 ＆ ディープラーニング入門（Python編）』のノートブック        Deep Insiderで記事を読む         Google Colabで実行する         GitHubでソースコードを見る   ※上から順に実行してください。上のコードで実行したものを再利用しているところがあるため、すべて実行しないとエラーになるコードがあります。  　すべてのコードを一括実行したい場合は、メニューバーから［ランタイム］－［すべてのセルを実行］をクリックしてください。 ※このノートブックは「Python 2」でも実行できるようにしていますが、基本的に「Python 3」を利用することをお勧めします。　Python 3を利用するには、メニューバーから［ランタイム］－［ランタイムのタイプを変更］を選択すると表示される［ノートブックの設定］ダイアログの、［ランタイムのタイプ］欄で「Python 3」に選択し、その右下にある［保存］ボタンをクリックしてください。  Python バージョン2への対応<jupyter_code># Pythonファイルの冒頭で以下を記述する
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

print(3 / 2) # 「1.5」。インポートしないPython 2系だと「1」<jupyter_output><empty_output><jupyter_text>本連載のゴール 以下の図1-a／b／c／dのコードが読めるし、意味も理解できるようになることが、本連載の最終的なゴール。 図1-a　TensorFlowの公式チュートリアルのサンプルコード（1）![図1-a　TensorFlowの公式チュートリアルのサンプルコード（1）](https://re.deepinsider.jp/tutor/deeplearningpyt/01version/01a.gif) 図1-b　TensorFlowの公式チュートリアルのサンプルコード（2）![図1-b　TensorFlowの公式チュートリアルのサンプルコード（2）](https://re.deepinsider.jp/tutor/deeplearningpyt/01version/01b.gif) 図1-c　TensorFlowの公式チュートリアルのサンプルコード（3）![図1-c　TensorFlowの公式チュートリアルのサンプルコード（3）](https://re.deepinsider.jp/tutor/deeplearningpyt/01version/01c.gif) 図1-d　TensorFlowの公式チュートリアルのサンプルコード（4）![図1-d　TensorFlowの公式チュートリアルのサンプルコード（4）](https://re.deepinsider.jp/tutor/deeplearningpyt/01version/01d.gif)  Python言語のバージョン バージョンは3系を使用。<jupyter_code>import sys
print('Version: ', str(sys.version_info.major) + '.' + str(sys.version_info.minor))
# Version:  3.6<jupyter_output><empty_output><jupyter_text>配布用プロジェクトのインストール ※リスト1の前にリスト2を実行する必要があるので、順番が前後している点に注意してほしい。  リスト2　配布用プロジェクト「tensorflow」をインストールするためのシェルコマンド<jupyter_code>!pip install tensorflow<jupyter_output><empty_output><jupyter_text>モジュールのインポート  リスト1　モジュールをインポートするコード例<jupyter_code>import tensorflow as tf<jupyter_output><empty_output><jupyter_text>リストex1　応用テクニック： 複数行の文を記述する例<jupyter_code>import tensorflow \
    as tf<jupyter_output><empty_output><jupyter_text>モジュールの利用と定義  リスト3-1　モジュールを利用するコード例<jupyter_code>mnist = tf.keras.datasets.mnist<jupyter_output><empty_output><jupyter_text>リスト3-2　モジュール階層の途中のモジュールをインポートするコード例<jupyter_code>from tensorflow.keras import datasets
mnist = datasets.mnist<jupyter_output><empty_output><jupyter_text>コメント  リスト4-1　コメントのコード例（行全体）<jupyter_code># Display training progress by printing a single dot for each completed epoch（各エポックの完了のたびに「.」を描画することでトレーニングの進捗を表示する）
#＃ ……コメントに続くコードは省略……

# Store training stats（トレーニング統計を保存する）
## ……コメントに続くコードは省略……<jupyter_output><empty_output><jupyter_text>リスト4-2　コメントのコード例（行途中）<jupyter_code>import tensorflow as tf  # tfという名前でtensorflowモジュールをインポート<jupyter_output><empty_output><jupyter_text>リスト4-3　コメントのコード例（複数行）<jupyter_code>'''
複数行の
コメントが
書けます
'''<jupyter_output><empty_output><jupyter_text>変数の宣言と代入  リスト5-1　変数の宣言と代入のサンプルコード<jupyter_code>import tensorflow as tf  # 事前にインポートが必要
mnist = tf.keras.datasets.mnist<jupyter_output><empty_output><jupyter_text>リスト5-2　変数に代入されたオブジェクトの内容を確認<jupyter_code>mnist<jupyter_output><empty_output><jupyter_text>リスト6-1　オブジェクトの型を調べるコード例<jupyter_code>type(mnist)  # moduleと出力される<jupyter_output><empty_output><jupyter_text>リスト6-2　変数「mnist」に代入されたオブジェクトのIDを調べるコード例<jupyter_code>id(mnist)  # 140667186446808（※本稿の場合。読者ごとに違う数値）と出力される<jupyter_output><empty_output><jupyter_text>リスト6-3　tf.keras.datasets.mnistモジュールのIDを調べるコード例<jupyter_code>id(tf.keras.datasets.mnist)  # 140667186446808（※本稿の場合）と出力される<jupyter_output><empty_output><jupyter_text>データの型（基本編）  リスト7　変数への何らかの代入を行っているコード<jupyter_code># 変数への「数値」の代入
EPOCHS = 500

# 変数への「文字列値」の代入
color = 'blue'
#color = 'red'  # 同じデータ型なので説明省略<jupyter_output><empty_output><jupyter_text>bool型（ブール型）  リスト7-1　変数の宣言と「真偽値」の代入を行うコード<jupyter_code>is_a = True
is_b = False

is_b  # Falseと出力される<jupyter_output><empty_output><jupyter_text>int型／float型（数値型）  リスト7-2　変数の宣言と「整数値」の代入を行うコード<jupyter_code>EPOCHS = 500

EPOCHS  # 500と出力される<jupyter_output><empty_output><jupyter_text>リスト7-3　変数の宣言と「浮動小数点数値」の代入を行うコード<jupyter_code>float_variable = 123.456

float_variable  # 123.456と出力される<jupyter_output><empty_output><jupyter_text>str型（文字列型）  リスト7-4　変数の宣言と「文字列値」の代入を行うコード<jupyter_code>color = 'blue'

color  # 'blue'と出力される<jupyter_output><empty_output><jupyter_text>リスト7-5　二重引用符による文字列の記述<jupyter_code>color = "b'lue"

color  # "b'lue"と出力される<jupyter_output><empty_output><jupyter_text>リスト7-6　文字列でエスケープシーケンスを使った例<jupyter_code>color = 'b\'l"ue'

color  # 'b\'l"ue'と出力される<jupyter_output><empty_output><jupyter_text>データの型（コレクション編）  リスト8　変数への何らかの代入を行っているコード<jupyter_code>#import tensorflow as tf
#mnist = tf.keras.datasets.mnist
# 以下のコードを動かすためには、上記2行を事前に実行しておく必要がある
#---------------------------------------------------------------------

# 変数への「タプル値」の代入
(x_train, y_train),(x_test, y_test) = mnist.load_data()

# 「タプル」の構文を応用して、複数の変数にまとめて代入
x_train, x_test = x_train / 255.0, x_test / 255.0

# 以下は「タプル」の構文を応用する同じ方法なので説明を省略
# predictions_array, true_label, img = predictions_array[i], true_label[i], img[i]<jupyter_output><empty_output><jupyter_text>list型（リスト型）  リスト8-1　変数へ「リスト」値を代入するコード<jupyter_code>abc_list = ['a', 'b', 'c', 'd', 'e']

abc_list  # ['a', 'b', 'c', 'd', 'e']と出力される<jupyter_output><empty_output><jupyter_text>◇ インデクシング（要素データの取得）  リスト8-2　リストから単一の値／データを取得するコード<jupyter_code>abc_list[1]
# 'b'と出力される<jupyter_output><empty_output><jupyter_text>リスト8-3　リスト内の要素に値／データを代入するコード<jupyter_code>abc_list[1] = 'x'

abc_list  # ['a', 'x', 'c', 'd', 'e']と出力される<jupyter_output><empty_output><jupyter_text>◇ スライシング（範囲データの取得）  リスト8-4　リストから範囲指定で複数の値／データを取得するコード<jupyter_code>abc_list[2:4]
# ['c', 'd']と出力される<jupyter_output><empty_output><jupyter_text>リスト8-4-1　リストから範囲指定で複数の値／データを取得するコード（応用1）<jupyter_code>abc_list[:4] # 先頭からインデックス3までを取得
# ['a', 'x', 'c', 'd']と出力される<jupyter_output><empty_output><jupyter_text>リスト8-4-2　リストから範囲指定で複数の値／データを取得するコード（応用2）<jupyter_code>abc_list[2:] # インデックス2から末尾までを取得+
# ['c', 'd', 'e']と出力される<jupyter_output><empty_output><jupyter_text>リスト8-4-3　リストから範囲指定で複数の値／データを取得するコード（応用3）<jupyter_code>abc_list[::2] # 先頭から末尾まで2個先ごとに取得
# ['a', 'c', 'e']と出力される<jupyter_output><empty_output><jupyter_text>tuple型（タプル型）  リスト8-5　1つの変数へ「タプル」値を代入するコード<jupyter_code># タプル値は1つの変数に代入できる
tuple_data = ('Taro', 'Yamada')
# 丸括弧を省略して「tuple_data = 'Taro', 'Yamada'」と記述しても同じ意味

tuple_data  # ('Taro', 'Yamada')と出力される<jupyter_output><empty_output><jupyter_text>◇ アンパック代入（複数の変数への分解代入）  リスト8-6　複数の変数へ「タプル」値をアンパック代入するコード<jupyter_code># 変数「tuple_data」の宣言とタプル値の代入は、リスト8-5で行っている

# tuple型で宣言した複数の変数に、タプル値をアンパック代入（＝分解して代入）
(first_name, family_name) = tuple_data

family_name  # 'Yamada'と出力される<jupyter_output><empty_output><jupyter_text>◇ 丸括弧の省略  リスト8-7　丸括弧を省略したタプルの例<jupyter_code>first_name, family_name = 'Taro', 'Yamada'

family_name  # 'Yamada'と出力される<jupyter_output><empty_output><jupyter_text>リスト8-8　タプルを応用して複数の変数をまとめて宣言＆代入する例<jupyter_code>is_b, EPOCHS, color = False, 500, 'blue'

is_b, EPOCHS, color  # '(False, 500, 'blue')'と出力される<jupyter_output><empty_output><jupyter_text>リスト8-9　複数の変数への「タプル値」のアンパック代入を行っているコード<jupyter_code>#import tensorflow as tf
#mnist = tf.keras.datasets.mnist
# 以下のコードを動かすためには、上記2行を事前に実行しておく必要がある
#---------------------------------------------------------------------

(x_train, y_train),(x_test, y_test) = mnist.load_data()

# 右辺の「mnist.load_data()」は関数で、
#  ((＜訓練データ＞, ＜訓練ラベル＞), (＜テストデータ＞, ＜テストラベル＞))
# という構造のタプルを出力する<jupyter_output><empty_output><jupyter_text>dict型（辞書型）  リスト8-10　変数への「辞書値」の代入を行っているコード<jupyter_code>abc_dict = { 'a': 1.2, 'b': 2.4, 'c': 3.6 }

abc_dict  # { 'a': 1.2, 'b': 2.4, 'c': 3.6 }と出力される<jupyter_output><empty_output><jupyter_text>◇ キー指定による値の取得  リスト8-11　辞書を使用するサンプルコード<jupyter_code>abc_dict['a']
# 1.2と出力される<jupyter_output><empty_output><jupyter_text>リスト8-12　辞書内の要素に値／データを代入するコード<jupyter_code>abc_dict['a'] = 12.3  # 代入による値の変更
abc_dict['x'] = 9.9   # 代入によるキーと値の追加

abc_dict  # {'a': 12.3, 'b': 2.4, 'c': 3.6, 'x': 9.9}と出力される<jupyter_output><empty_output><jupyter_text>データの型（各種オブジェクト編）  リスト9　変数への何らかの代入を行っているコード<jupyter_code>#import tensorflow as tf  # このコードを動かすためにインポートが必要

# 変数への「モジュール」の代入
mnist = tf.keras.datasets.mnist

# 変数への「何らかのオブジェクト」の代入（1）
#model = tf.keras.models.Sequential([
#  tf.keras.layers.Flatten(),
#  tf.keras.layers.Dense(512, activation=tf.nn.relu),
#  tf.keras.layers.Dropout(0.2),
#  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
#])
# 「tf.keras.models.Sequential([～])」の意味は、Lesson 10「クラス」の回で解説
# ここでは、次のコードに臨時的に置き換えて解説
model = '＜関数（厳密にはクラスのコンストラクター。詳細省略）＞が出力したオブジェクト'

# 変数への「何らかのオブジェクト」の代入（2）
#history = model.fit(train_data, train_labels, epochs=EPOCHS,
#                    validation_split = 0.2, verbose=0,
#                    callbacks=[PrintDot()])
# 「model.fit(～)」の意味は、Lesson 7「関数」の回で解説
# ここでは、次のコードに臨時的に置き換えて解説
history = '＜関数（詳細省略）＞が出力したオブジェクト'<jupyter_output><empty_output><jupyter_text>関数の利用  リスト10-1　関数を利用するコード例<jupyter_code>#import tensorflow as tf
#mnist = tf.keras.datasets.mnist
# 以下のコードを動かすためには、上記2行を事前に実行しておく必要がある
#---------------------------------------------------------------------

(x_train, y_train),(x_test, y_test) = mnist.load_data()<jupyter_output><empty_output><jupyter_text>リスト10-2　戻り値を無視するコード例<jupyter_code>mnist.load_data()
# 戻り値は出力（＝表示）されるのみで、変数に保存されない<jupyter_output><empty_output><jupyter_text>リストex2　print()関数の使用例<jupyter_code>print(y_train)
# [5 0 4 ... 5 6 8] のように出力される<jupyter_output><empty_output><jupyter_text>リストex3　オブジェクト評価の自動出力機能の使用例<jupyter_code>y_train
# array([5, 0, 4, ..., 5, 6, 8], dtype=uint8) のように出力される<jupyter_output><empty_output><jupyter_text>さまざまな関数の使用例  ライブラリ「NumPy」とライブラリ「Matplotlib」  リスト10-3　ライブラリ「NumPy」のインストール<jupyter_code>!pip install numpy<jupyter_output><empty_output><jupyter_text>リスト10-4　ライブラリ「Matplotlib」のインストール<jupyter_code>!pip install matplotlib<jupyter_output><empty_output><jupyter_text>リスト10-5　numpyモジュール（名前：np）のインポート<jupyter_code>import numpy as np<jupyter_output><empty_output><jupyter_text>リスト10-6　matplotlib.pyplotモジュール（名前：plt）のインポート<jupyter_code>import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>図1-aに含まれる「関数」のコード  リスト10-7　図1-aにおける「関数」（前半）<jupyter_code>#import tensorflow as tf
#mnist = tf.keras.datasets.mnist
#(x_train, y_train),(x_test, y_test) = mnist.load_data()
#x_train, x_test = x_train / 255.0, x_test / 255.0
# 以下のコードを動かすためには、上記4行を事前に実行しておく必要がある
#---------------------------------------------------------------------

# ニューラルネットワークで使うSequentialモデルを作成する
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])<jupyter_output><empty_output><jupyter_text>リスト10-8　図1-aにおける「関数」（後半）<jupyter_code># モデルをコンパイルする（最適化手法に「Adam」、損失関数に「クロスエントロピー（の一種）」、測定項目に「正確度」を指定）
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# モデルをフィット（＝学習）させる（訓練データ、訓練ラベル、エポック数は5回）
model.fit(x_train, y_train, epochs=5)

# モデルの出来を評価する（テストデータ、テストラベル）
model.evaluate(x_test, y_test)<jupyter_output><empty_output><jupyter_text>図1-bに含まれる「関数」のコード  リスト10-9　図1-bにおける「関数」<jupyter_code>#import tensorflow as tf
#import numpy as np
#import matplotlib.pyplot as plt
#mnist = tf.keras.datasets.mnist
#(x_train, y_train),(x_test, y_test) = mnist.load_data()
#x_train, x_test = x_train / 255.0, x_test / 255.0
# 以下のコードを動かすためには、上記6行を事前に実行しておく必要がある
#---------------------------------------------------------------------

# 実行に必要な変数を仮で用意---ここから---
img = x_test[0]             # テストデータの1番目の画像
predictions_array = x_test  # 予測結果データの代わりにテストデータを使用
# -----------------------------ここまで---

# グラフに対してグリッド線の「有無（False： なし）」を設定
plt.grid(False)

# グラフに対してx軸とy軸の「目盛り値（[]： 空のリスト値）」を設定
plt.xticks([])
plt.yticks([])

# グラフに対してx軸のラベルを設定
plt.xlabel("xlabel")
# ※仮に「"xlabel"」という文字列値に置き換えているが、ここには後述する「文字列フォーマット関数」があった

# グラフに対して画像（img）を、白黒（plt.cm.binary）で表示する
plt.imshow(img, cmap=plt.cm.binary)

# NumPy配列値（predictions_array）の中から最大値となる要素のインデックス集を取得して、変数predicted_labelに代入
predicted_label = np.argmax(predictions_array)

# NumPy配列値（predictions_array）の中から最大値を取得する
np.max(predictions_array)
# 1.0 と出力<jupyter_output><empty_output><jupyter_text>図1-cに含まれる「関数」のコード  リスト10-10　図1-cにおける「関数」<jupyter_code>#import tensorflow as tf
#import matplotlib.pyplot as plt
#mnist = tf.keras.datasets.mnist
#(x_train, y_train),(x_test, y_test) = mnist.load_data()
#x_train, x_test = x_train / 255.0, x_test / 255.0
# 以下のコードを動かすためには、上記5行を事前に実行しておく必要がある
#---------------------------------------------------------------------

# 実行に必要な変数を仮で用意---ここから---
train_images = x_train  # 訓練データ（画像）
train_labels = y_train  # 訓練ラベル
class_names = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']  # 分類名
i = 0  # インデックス番号。1番目
# -----------------------------ここまで---

# グラフに対して幅10×高さ10インチの図を新規作成する
plt.figure(figsize=(10,10))

# 現在の図に5行×5列の枠組みを作って、左上のi+1番目の場所にサブプロット（＝枠内の描画領域）を追加する
plt.subplot(5,5,i+1)

# グラフに対してx軸とy軸の「目盛り値（[]： 空のリスト値）」を設定
plt.xticks([])
plt.yticks([])

# グラフに対してグリッド線の「有無（False： なし）」を設定
plt.grid(False)

# グラフに対して画像（train_images[i]）を、白黒（plt.cm.binary）で表示する
plt.imshow(train_images[i], cmap=plt.cm.binary)

# グラフに対してx軸のラベルを設定
plt.xlabel(class_names[train_labels[i]])<jupyter_output><empty_output><jupyter_text>図1-dに含まれる「関数」のコード  リスト10-11　図1-dにおける「関数」<jupyter_code>#import tensorflow as tf
#import matplotlib.pyplot as plt
#mnist = tf.keras.datasets.mnist
#(x_train, y_train),(x_test, y_test) = mnist.load_data()
#x_train, x_test = x_train / 255.0, x_test / 255.0
# 以下のコードを動かすためには、上記5行を事前に実行しておく必要がある
#---------------------------------------------------------------------

# ※さらに、リスト10-7とリスト10-8を事前に実行しておく必要がある
#---------------------------------------------------------------------

# 実行に必要な変数を仮で用意---ここから---
from tensorflow import keras  # tf.kerasと同じモジュールのインポート
train_data = x_train          # 訓練データ
train_labels = y_train        # 訓練ラベル
EPOCHS = 5                    # エポック数を5回に
# -----------------------------ここまで---

# 空行を出力する
print('')

# 末尾を改行にしない（end=''）で「.」を出力する
print('.', end='')

# モデルをフィット（＝学習）させて（訓練データ、訓練ラベル、エポック数は5回、精度検証データ用に20％分使って、詳細情報の出力はせず、コールバックもなし）、その結果を変数historyに代入する
history = model.fit(train_data, train_labels, epochs=EPOCHS,
                    validation_split = 0.2, verbose=0,
                    callbacks=[])<jupyter_output><empty_output><jupyter_text>文字列フォーマット関数  リスト10-12　文字列をフォーマットするコード例<jupyter_code>msg = "{} {:2.0f}% ({})".format('予測結果の分類内容',
                                72.5,
                                '正解ラベルの分類内容')

msg  # '予測結果の分類内容 72% (正解ラベルの分類内容)' と出力される<jupyter_output><empty_output><jupyter_text>関数の定義  リスト11-1　関数を定義するコード例<jupyter_code>def load_data(path='mnist.npz'):
  # ……内部で何らかの処理を実行……
  x_train, y_train = ['x_train'], ['y_train']
  x_test, y_test = ['x_test'], ['y_test']
  
  return (x_train, y_train), (x_test, y_test)<jupyter_output><empty_output><jupyter_text>デフォルト引数  リスト11-2　関数の呼び出しで引数を省略するコード例<jupyter_code>#import tensorflow as tf
#mnist = tf.keras.datasets.mnist
# 以下のコードを動かすためには、上記2行を事前に実行しておく必要がある
#---------------------------------------------------------------------

mnist.load_data()<jupyter_output><empty_output><jupyter_text>リスト11-3　関数の呼び出しで引数を省略しないコード例<jupyter_code>mnist.load_data('mnist.npz')<jupyter_output><empty_output><jupyter_text>リスト11-3　10個の引数（第2引数以降はデフォルト引数あり）を持つ関数定義の例<jupyter_code>def some_function(param1, param2=2, param3=3, param4=4, param5=5, param6=6, param7=7, param8=8, param9=9, param10=10):
  return param1 + param2 + param3 + param4 + param5 +param6 + param7 +param8 + param9 + param10<jupyter_output><empty_output><jupyter_text>リスト11-4　10個の引数をすべて指定して関数を呼び出す例<jupyter_code>some_function(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

# 55と出力される<jupyter_output><empty_output><jupyter_text>リスト11-5　デフォルト引数により9個の引数指定を省略して関数を呼び出す例<jupyter_code>some_function(1)

# 55と出力される<jupyter_output><empty_output><jupyter_text>キーワード引数  リスト11-6　第9引数の値を指定したい場合（第10引数のみ省略）<jupyter_code>some_function(1, 2, 3, 4, 5, 6, 7, 8, 999)

# 1045と出力される<jupyter_output><empty_output><jupyter_text>リスト11-7　キーワード引数で関数の第9引数に値を渡す場合（第2引数～第8引数、第10引数は省略）<jupyter_code>some_function(1, param9=999)

# 1045と出力される<jupyter_output><empty_output><jupyter_text>さまざまな関数の定義例  リスト11-8　図1-bにおける「関数定義」<jupyter_code># 画像をプロット（＝描画）する関数
def plot_image(i, predictions_array, true_label, img):
  # 予測結果と正解と画像を、インデックス番号（i）を指定してNumPy配列データから1つ取得
  predictions_array, true_label, img = predictions_array[i], true_label[i], img[i]
  # ……何らかの処理（一部は前回説明）……<jupyter_output><empty_output><jupyter_text>リスト11-9　図1-dにおける「関数定義」<jupyter_code># ドット（.）を出力するクラスの定義
#class PrintDot(keras.callbacks.Callback):  # Lesson 12で説明
  # 各エポックの最後に呼び出されるクラスのメソッド（＝関数の一種）の定義
  def on_epoch_end(self, epoch, logs):
    # ……何らかの処理（前回説明）……
    print('.', end='')<jupyter_output><empty_output><jupyter_text>条件分岐  リスト12-1　条件分岐を行うコード例<jupyter_code>predicted_label = '猫'
true_label = '犬'
# 上の2行は下記コードの実行に必要な仮のコード

if predicted_label == true_label:
  color = 'blue'
else:
  color = 'red'

color  # 'red'と出力される<jupyter_output><empty_output><jupyter_text>リスト12-2　3つ以上の条件分岐を行うコード例<jupyter_code>predicted_label = '猫'  # この2行は下記コードの実行に必要な仮のコード

if predicted_label == '犬':
  color = 'blue'
elif predicted_label == '猫':
  color = 'green'
elif predicted_label == '馬':
  color = 'yellow'
else:
  color = 'red'

color  # 'green'と出力される<jupyter_output><empty_output><jupyter_text>リスト12-3　else文が含まれない条件分岐のコード例<jupyter_code>predicted_label = '猫'  # この2行は下記コードの実行に必要な仮のコード

color = 'white'

if predicted_label == '犬':
  color = 'blue'
elif predicted_label == '羊':
  color = 'pink'

color  # 'white'と出力される<jupyter_output><empty_output><jupyter_text>ブロックとスコープの違い  リスト12-4　if文内の変数宣言はグローバルスコープで宣言されている<jupyter_code>predicted_label = 100  # この2行は下記コードの実行に必要な仮のコード

if predicted_label == 100:
  animal = 'イヌ'  # グローバルスコープでの変数宣言になる

animal  # 'イヌ'と出力される<jupyter_output><empty_output><jupyter_text>リスト12-5　関数定義内の変数宣言はローカルスコープで宣言されている<jupyter_code>def some_function():
  size = 10  # ローカルスコープでの変数宣言になる

some_function()  # 関数を呼び出す
#size  # 変数は定義されてないとしてNameError（名前のエラー）になる<jupyter_output><empty_output><jupyter_text>リスト12-6　関数定義内でグローバル変数を宣言することも可能<jupyter_code>def some_function():
  global size  # グローバルスコープでの変数宣言になる
  size = 10

some_function()  # 関数を呼び出す
size  # 10と出力される<jupyter_output><empty_output><jupyter_text>コロン（:）とセミコロン（;）  リスト12-7　コロン「:」の後に改行せずに単純文を記載した例<jupyter_code>epoch = 100

if epoch % 100 == 0: print('')<jupyter_output><empty_output><jupyter_text>リスト12-8　セミコロン「:」の後に複合文を続ける例<jupyter_code>print('1'); print('2'); print('3')

# 1
# 2
# 3 と出力される<jupyter_output><empty_output><jupyter_text>ループ処理（for文）  リスト13-1　ループ処理（for文）を行うコード例<jupyter_code>import matplotlib.pyplot as plt  # 下記コードの実行に必要なライブラリを追記

for i in range(25):
  plt.subplot(5, 5, i+1)
  # ……省略……<jupyter_output><empty_output><jupyter_text>ループ処理（while文）  リスト13-2　ループ処理（while文）を行うコード例<jupyter_code>import matplotlib.pyplot as plt  # 下記コードの実行に必要なライブラリを追記

i = 0
while i < 25:
  plt.subplot(5, 5, i+1)
  i = i + 1
  # ……省略……<jupyter_output><empty_output><jupyter_text>ループ処理の中断と継続  リスト13-3　ループ処理を中断するコード例<jupyter_code>for i in range(25):
  plt.subplot(5, 5, i+1)
  if i >= 2:
    break
  # ……省略……<jupyter_output><empty_output><jupyter_text>リスト13-4　次のループ処理にスキップして継続するコード例<jupyter_code>for i in range(25):
  if i >= 2:
    continue
  plt.subplot(5, 5, i+1)
  # ……省略……<jupyter_output><empty_output><jupyter_text>四則演算  リスト13-5　四則演算のコード例<jupyter_code>num = 5 + 3
print(num)  # 8（足し算）

num = 5 - 3
print(num)  # 2（引き算）

num = 5 * 3
print(num)  # 15（かけ算）

num = 5 / 3
print(num)  # 1.6666666666666667（割り算）

num = 5 % 3
print(num)  # 2（余り）<jupyter_output><empty_output><jupyter_text>リスト13-6　NumPyの四則演算機能が使われているコード例<jupyter_code>#import tensorflow as tf
#mnist = tf.keras.datasets.mnist
#(x_train, y_train),(x_test, y_test) = mnist.load_data()
# 以下のコードを動かすためには、上記2行を事前に実行しておく必要がある
#---------------------------------------------------------------------

x_train, x_test = x_train / 255.0, x_test / 255.0<jupyter_output><empty_output><jupyter_text>クラスの利用  リスト14-1　クラスのインスタンスを生成するコード例<jupyter_code># import tensorflow as tf
# mnist = tf.keras.datasets.mnist
# (x_train, y_train),(x_test, y_test) = mnist.load_data()
# x_train, x_test = x_train / 255.0, x_test / 255.0
# 以下のコードを動かすためには、上記4行を事前に実行しておく必要がある
#---------------------------------------------------------------------

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])<jupyter_output><empty_output><jupyter_text>リスト14-2　インスタンスメソッドのコード例<jupyter_code>model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)<jupyter_output><empty_output><jupyter_text>クラスを使う利点  リスト15-1　通常の変数の書き方<jupyter_code>#import tensorflow as tf
#mnist = tf.keras.datasets.mnist
# 以下のコードを動かすためには、上記2行を事前に実行しておく必要がある
#---------------------------------------------------------------------

(x_train, y_train),(x_test, y_test) = mnist.load_data()<jupyter_output><empty_output><jupyter_text>リスト15-2　変数を無視する場合の書き方<jupyter_code>(x_train, y_train),(_, _) = mnist.load_data()<jupyter_output><empty_output><jupyter_text>クラスの定義  リスト15-4　クラスの継承元のコード（先に実行する必要があるため、順番を入れ替えました。）<jupyter_code>from tensorflow.python.keras.engine.network import Network  # 下記コードの実行に必要なモジュールを追記
# ……省略……

class Model(Network):
  # ……省略……

  def compile(self,
              optimizer,
              loss=None,
              metrics=None,
              loss_weights=None,
              sample_weight_mode=None,
              weighted_metrics=None,
              target_tensors=None,
              distribute=None,
              **kwargs):
    pass # ……省略……

  def fit(self,
          x=None,
          y=None,
          batch_size=None,
          epochs=1,
          verbose=1,
          callbacks=None,
          validation_split=0.,
          validation_data=None,
          shuffle=True,
          class_weight=None,
          sample_weight=None,
          initial_epoch=0,
          steps_per_epoch=None,
          validation_steps=None,
          max_queue_size=10,
          workers=1,
          use_multiprocessing=False,
          **kwargs):
    pass # ……省略……

  def evaluate(self,
               x=None,
               y=None,
               batch_size=None,
               verbose=1,
               sample_weight=None,
               steps=None,
               max_queue_size=10,
               workers=1,
               use_multiprocessing=False):
    pass # ……省略……

  # ……省略……<jupyter_output><empty_output><jupyter_text>リスト15-3　クラスを定義しているコード例<jupyter_code># ……省略……
# ※後述のリスト15-4を先に実行しないと、このコードはエラーになるので注意

class Sequential(Model):
  # ……省略……

  # コンストラクターの定義と実装
  def __init__(self, layers=None, name=None):
    # ……省略……
    # インスタンス変数の利用（もしくは宣言と値の代入）
    self.supports_masking = True
    # ……省略……

  # インスタンスメソッドの定義と実装
  def add(self, layer):
    # ……省略……
    # インスタンス変数の利用（もしくは宣言と値の代入）
    self.built = False
    # ……省略……

  # ……省略……<jupyter_output><empty_output><jupyter_text>クラスのインスタンスの調査  リスト15-6　対象クラスのインスタンスかどうかを判別しているコード例<jupyter_code>model = tf.keras.models.Sequential()
print(isinstance(model, tf.keras.models.Model))
# True（modelオブジェクトはtf.keras.models.Modelクラスを継承したtf.keras.models.Sequentialクラスのインスタンスである）

# ちなみに、データの型を比較／判別する場合は、基本的に次のように書く
a = 12.3
print(type(a) == float)
# True（aオブジェクトの型はfloatである）

print(type(model) == tf.keras.models.Model)
# False（modelオブジェクトの型はtf.keras.models.Modelクラスではない）

print(type(model) == tf.keras.models.Sequential)
# True（modelオブジェクトの型はtf.keras.models.Sequentialクラスである）<jupyter_output><empty_output><jupyter_text>Python バージョン2への対応  リスト16-1　__future__モジュールをインポートするコード例<jupyter_code># Pythonファイルの冒頭で以下を記述する
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

print(3 / 2) # 「1.5」。上記モジュールをインポートしないPython 2系だと「1」<jupyter_output><empty_output><jupyter_text>リスト16-2　__future__モジュールをインポートするコード例<jupyter_code>from __future__ import absolute_import, division, print_function

import tensorflow as tf
from tensorflow import keras

import numpy as np

print(tf.__version__)  # 1.14.0のように出力される<jupyter_output><empty_output><jupyter_text>Python 標準ライブラリ  リスト17　インポートした`os`モジュールでOS情報を出力するコード例<jupyter_code>import os

print(os.uname()) 
# posix.uname_result(sysname='Linux', nodename='x0x0x0', release='4.14.79+', version='#1 SMP Wed Dec 19 21:19:13 PST 2018', machine='x86_64')
# 上記の出力結果は環境により異なるので注意<jupyter_output><empty_output><jupyter_text>if条件式  リスト18-1　条件分岐を行う「文」のコード例<jupyter_code>predicted_label = '猫'
true_label = '犬'
# 上の2行は下記コードの実行に必要な仮のコード

if predicted_label == true_label:
  color = 'blue'
else:
  color = 'red'

color  # 'red'と出力される<jupyter_output><empty_output><jupyter_text>リスト18-2　条件分岐を行う「式」のコード例<jupyter_code>color = 'blue' if predicted_label == true_label else 'red'

color  # 'red'と出力される<jupyter_output><empty_output><jupyter_text>and／or／not論理演算子  リスト19-1　複数の条件指定を複数の`if`文で記述したコード例<jupyter_code>cond_num = 98
cond_str = '猫'
# 上の2行は下記コードの実行に必要な仮のコード

if cond_num == 100:
  if cond_str == '犬':
    answer = 'OK'
  else:
    answer = 'NG'
else:
    answer = 'NG'

answer  # 'NG'と出力される<jupyter_output><empty_output><jupyter_text>リスト19-2　複数の条件指定を1つの`if`文と論理演算子で記述したコード例<jupyter_code>if cond_num == 100 and cond_str == '犬':
  answer = 'OK'
else:
  answer = 'NG'

answer  # 'NG'と出力される<jupyter_output><empty_output><jupyter_text>リスト19-3　論理演算子`not`で否定条件を記述したコード例<jupyter_code>if not cond_num == 100 or not cond_str == '犬':
  answer = 'NG'
else:
  answer = 'OK'

answer  # 'NG'と出力される<jupyter_output><empty_output><jupyter_text>ラムダ式  リスト20-1　`def`文により関数を定義するコード例<jupyter_code>def add_func(arg_x, arg_y):
  return arg_x + arg_y

sum = add_func(101, 234)

sum  # 335<jupyter_output><empty_output><jupyter_text>リスト20-2　`lambda`式により関数を定義するコード例<jupyter_code>add_lambda = lambda arg_x, arg_y: arg_x + arg_y

sum = add_lambda(101, 234)

sum  # 335<jupyter_output><empty_output><jupyter_text>リスト20-3　`lambda`式で定義したアルゴリズムをコールバック関数として指定するコード例<jupyter_code>heights = [ 165.5, 177.2, 183.2 ]

sorted_heights = sorted(heights, key=lambda x: x % 10, reverse=True)

sorted_heights  # [177.2, 165.5, 183.2]<jupyter_output><empty_output><jupyter_text>リスト20-4　`def`文で定義したアルゴリズムをコールバック関数として指定するコード例<jupyter_code>def sort_algo(arg_x):
  return arg_x % 10

sorted_heights = sorted(heights, key=sort_algo, reverse=True)

sorted_heights  # [177.2, 165.5, 183.2]<jupyter_output><empty_output><jupyter_text>リスト内包表記  リスト21-1　for文によりループ処理を記述したコード例<jupyter_code>for i in range(5):
  print(i+1)

# 1
# 2
# 3
# 4
# 5<jupyter_output><empty_output><jupyter_text>リスト21-2　リスト内包表記によりループ処理を記述したコード例<jupyter_code>[print(i+1) for i in range(5)]
# 1
# 2
# 3
# 4
# 5

# もちろん以下のように変数に代入することも可能
new_list = [i+1 for i in range(5)]
print(new_list)  # [1, 2, 3, 4, 5]<jupyter_output><empty_output><jupyter_text>例外  リスト22-1　ファイルを開いて読み取るコード例<jupyter_code>f = open('data.csv')
lines = f.readlines()
f.close()<jupyter_output><empty_output><jupyter_text>リスト22-2　ファイルを開いて読み取るコード例<jupyter_code>try:
  f = open('data.csv')
  print('ファイルは正常に開けました。')

except FileNotFoundError as e:
#except IOError as e:  # Python 2系の場合
  print('ファイルがないようです。')
  print(e)  # [Errno 2] No such file or directory: 'data.csv'
  raise

except:
  print('何らかの例外が発生しました。')
  raise

finally:
  print('ここは常に最後に実行される。')
  
lines = f.readlines()
f.close()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1633391877845084, 'fraction_numerical': 0.032796874439944085, 'mean_word_length': 5.244404655326768, 'pattern_counts': {'":': 0, '<': 406, '<?xml version=': 0, '>': 407, 'https://': 5, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '101', 'dir': 'jupyter-structured-clean-dedup', 'id': '146849', 'license': 'Apache-2.0', 'n_tokens_mistral': 16185, 'n_tokens_neox': 15254, 'n_words': 1444, 'path': 'docs/articles/deeplearningpyt.ipynb', 'repo_name': 'DeepInsider/playground-data', 'size': '27899'}