高校数学で学ぶディープラーニング 掲載プログラム

 
各章ごと(2から8章)のプログラムのテキストファイ ルです。
各プログラムは、コピーアンドペーストでGoogle Colaboratoryのコードセルにペーストしてください。
 
 

#------免責について---------------------------------------------
#
#本書の内容やプログラムの運用の結果については,著者および出版元は一
#切の責任を負いません。これらの運用は,お客様ご自身の責任と判断におい
#て行ってください。
 
 

#プログラミング言語等のバージョンについて
#
#本書に登場するプログラミング言語やプログラムライブラリは機能の向上
#のために改訂されることがあります。その際,命令や文法なども変更される
#ことがあるので使用するバージョンには注意を要します。第2 章で紹介する
#Google Colaboratory のコードセルで以下の命令を実行すれば,Pythonと
#TesorFlow ならびにKeras のバージョンが確認できます(Python は第2章
#で,TesorFlow とKeras は第5 章で登場します)。

! python -V #エクスクラメーションマークはOSコマンド

import tensorflow as tf
print('TensorFlow ', tf.__version__)

import keras
print('Keras ', keras.__version__)



#第2章

#------プログラム2-1------
#
for w1 in range(-2, 3): # 重みw1を-2から+2まで1ずつ変える。
  for w2 in range(-2, 3): #重みw2を-2から+2まで1ずつ変える。
    for b in range(-2, 3): #バイアス bを-2から+2まで1ずつ変える。

      #活性の計算と活性化関数による発火の判定
      x1 = 0; x2 = 0  # (x1 x2)=(0 0)の場合
      y00 = w1*x1 + w2*x2 + b
      if y00> 0:
           z00=1
      else:
           z00=0

      x1 = 0; x2 = 1   # (x1 x2)=(0 1)の場合
      y01 = w1*x1 + w2*x2 + b
      if y01 > 0:
           z01=1
      else:
           z01=0

      x1 = 1; x2 = 0   # (x1 x2)=(1 0)の場合
      y10 = w1*x1 + w2*x2 + b
      if y10 > 0:
           z10=1
      else:
           z10=0

      x1 = 1; x2 = 1   # (x1 x2)=(1 1)の場合
      y11 = w1*x1 + w2*x2 + b
      if y11 > 0:
           z11=1
      else:
           z11=0

      #2乗誤差の計算
      er1=(z00-1)**2+(z01-0)**2+(z10-0)**2+(z11-0)**2
      er2=(z00-0)**2+(z01-1)**2+(z10-0)**2+(z11-0)**2
      er3=(z00-0)**2+(z01-0)**2+(z10-1)**2+(z11-0)**2
      er4=(z00-0)**2+(z01-0)**2+(z10-0)**2+(z11-1)**2

      #適合するパラメーターの判別
      if er1==0: #er1=0ならニューロンO1の重みとバイアスに対応
         print('z1 : (w1 w2 b) = (', w1, w2, b, 
         ') : (z00 z01 z10 z11) = (', z00, z01, z10, z11, ')') 

      if er2==0: #er2=0ならニューロンO2の重みとバイアスに対応
         print('z2 : (w1 w2 b) = (', w1, w2, b, 
         ') : (z00 z01 z10 z11) = (', z00, z01, z10, z11, ')') 

      if er3==0: #er3=0ならニューロンO3の重みとバイアスに対応
         print('z3 : (w1 w2 b) = (', w1, w2, b, 
         ') : (z00 z01 z10 z11) = (', z00, z01, z10, z11, ')')

      if er4==0: #er4=0ならニューロンO4の重みとバイアスに対応
         print('z4 : (w1 w2 b) = (', w1, w2, b, 
         ') : (z00 z01 z10 z11) = (', z00, z01, z10, z11, ')')
 
 

#------プログラム2-2------
#
#関数hakkaを定義:活性化関数による発火の判定
def hakka(x1, x2, b):
  y = w1*x1 + w2*x2 + b
  if y> 0:
           z=1
  else:
           z=0
  return z

#メインルーチン
for w1 in range(-2, 3): # w1を-2から+2まで1ずつ変える。
    for w2 in range(-2, 3): # w2を-2から+2まで1ずつ変える。
       for b in range(-2, 3): # bを-2から+2まで1ずつ変える。

           x1 = 0; x2 = 0  # (x1 x2)=(0 0)の場合
           z00=hakka(x1, x2, b)

           x1 = 0; x2 = 1   # (x1 x2)=(0 1)の場合
           z01=hakka(x1, x2, b)

           x1 = 1; x2 = 0   # (x1 x2)=(1 0)の場合
           z10=hakka(x1, x2, b)

           x1 = 1; x2 = 1   # (x1 x2)=(1 1)の場合
           z11=hakka(x1, x2, b)

           #以下は、プログラム2-1の後半です。forループ内のインデントは揃えてください。

           #2乗誤差の計算
           er1=(z00-1)**2+(z01-0)**2+(z10-0)**2+(z11-0)**2
           er2=(z00-0)**2+(z01-1)**2+(z10-0)**2+(z11-0)**2
           er3=(z00-0)**2+(z01-0)**2+(z10-1)**2+(z11-0)**2
           er4=(z00-0)**2+(z01-0)**2+(z10-0)**2+(z11-1)**2

           #適合するパラメーターの判別
           if er1==0: #er1=0ならニューロンO1の重みとバイアスに対応
              print('z1 : (w1 w2 b) = (', w1, w2, b, 
              ') : (z00 z01 z10 z11) = (', z00, z01, z10, z11, ')') 
           if er2==0: #er2=0ならニューロンO2の重みとバイアスに対応
              print('z2 : (w1 w2 b) = (', w1, w2, b, 
              ') : (z00 z01 z10 z11) = (', z00, z01, z10, z11, ')') 

           if er3==0: #er3=0ならニューロンO3の重みとバイアスに対応
              print('z3 : (w1 w2 b) = (', w1, w2, b, 
              ') : (z00 z01 z10 z11) = (', z00, z01, z10, z11, ')')

           if er4==0: #er4=0ならニューロンO4の重みとバイアスに対応
              print('z4 : (w1 w2 b) = (', w1, w2, b, 
              ') : (z00 z01 z10 z11) = (', z00, z01, z10, z11, ')')
 
 

#------プログラム2-3------
#
# x1とx2の値の入力
x1=input ('x1=')
x2=input ('x2=') 

# 文字型データから整数型データへの変換
x1=int(x1)
x2=int(x2)

# (2-6)-(2-9)式
y1 = -2 * x1 -2 * x2 + 2 # (2.6)式
y2 = -2 * x1 + x2 # (2.7)式
y3 = x1 -2 * x2 # (2.8)式
y4 = x1 + x2 - 1 # (2.9)式
    
# 活性化関数
if y1>0: z1=1  # 階段関数 
else: z1=0

if y2>0: z2=1  # 階段関数 
else: z2=0 

if y3>0: z3=1  # 階段関数 
else: z3=0

if y4>0: z4=1  # 階段関数 
else: z4=0

# 結果の画面出力
print('(x1 x2)=(', x1, x2, ') : (z1 z2 z3 z4)=(', 
z1, z2, z3, z4, ')')
 


# 第3章

#------プログラム3-1------
#
import math # 指数関数 math.exp( )を使うために,math ライブラリを呼び出す。
i=1 # whileループの回数
L=100  # 損失関数Lの初期値。初期値は大きな値にする。
w1=2; w2=2; b=2  # w1,w2,b の初期値


#------プログラム3-2------

r1=1; r2=0; r3=0; r4=0  # パラメーターw11, w21, b1 の場合の正解のセット。これ以外の場合は左端に#をつける。
# r1=0; r2=1; r3=0; r4=0  # w12, w22, b2 の場合の正解のセット。これを使う場合は左端の#をとる。
# r1=0; r2=0; r3=1; r4=0  # w13, w23, b3 の場合の正解のセット。これを使う場合は左端の#をとる。
# r1=0; r2=0; r3=0; r4=1  # w14, w24, b4 の場合の正解のセット。これを使う場合は左端の#をとる。
 


#------プログラム3-3------

while L >0.01: # whileループ 条件式を満たす場合は計算を繰り返す

    x1 = 0; x2 = 0  # (x1 x2)=(0 0)の場合
    y = w1*x1 + w2*x2 + b # (2.1)式
    s = 1/(1+math.exp(-y))  # シグモイド関数
    dw1 = (s-r1)*s*(1-s)*x1 # (3.16)式のシグマの中の項
    dw2 = (s-r1)*s*(1-s)*x2 # (3.17)式のシグマの中の項
    db = (s-r1)*s*(1-s) # (3.18)式のシグマの中の項
    s00=s; dw1_00=dw1; dw2_00=dw2; db_00=db

    x1 = 0; x2 = 1   # (x1 x2)=(0 1) の場合
    y = w1*x1 + w2*x2 + b # (2.1)式
    s = 1/(1+math.exp(-y))  # シグモイド関数
    dw1 = (s-r2)*s*(1-s)*x1 # (3.16)式のシグマの中の項
    dw2 = (s-r2)*s*(1-s)*x2 # (3.17)式のシグマの中の項
    db = (s-r2)*s*(1-s) # (3.18)式のシグマの中の項
    s01 =s; dw1_01=dw1; dw2_01=dw2; db_01=db

    x1 = 1; x2 = 0   # (x1 x2)=(1 0) の場合
    y = w1*x1 + w2*x2 + b #(2.1)式

    s = 1/(1+math.exp(-y))  # シグモイド関数
    dw1 = (s-r3)*s*(1-s)*x1 # (3.16)式のシグマの中の項
    dw2 = (s-r3)*s*(1-s)*x2 # (3.17)式のシグマの中の項
    db = (s-r3)*s*(1-s) # (3.18)式のシグマの中の項
    s10=s; dw1_10=dw1; dw2_10=dw2; db_10=db

    x1 = 1; x2 = 1   # (x1 x2)=(1 1) の場合
    y = w1*x1 + w2*x2 + b # (2.1)式
    s = 1/(1+math.exp(-y))  # シグモイド関数
    dw1 = (s-r4)*s*(1-s)*x1  # (3.16)式のシグマの中の項
    dw2 = (s-r4)*s*(1-s)*x2  # (3.17)式のシグマの中の項
    db = (s-r4)*s*(1-s) # (3.18)式のシグマの中の項
    s11=s; dw1_11=dw1; dw2_11=dw2; db_11=db

    L =(s00-r1)**2+(s01-r2)**2+(s10-r3)**2+(s11-r4)**2  # 損失関数
    dw1_all = dw1_00+dw1_01+dw1_10+dw1_11 # (3.16)式 係数1/2は省略
    dw2_all = dw2_00+dw2_01+dw2_10+dw2_11 # (3.17)式 係数1/2は省略
    db_all = db_00+db_01+db_10+db_11 # (3.18)式 係数1/2は省略

    k = 10 # 学習率k
    w1 =w1-k*dw1_all # (w1-変位)を次の重みw1に設定
    w2 =w2-k*dw2_all # (w2-変位)を次の重みw2に設定
    b =b-k*db_all  # (b-変位)を次のバイアスbに設定
    i=i+1 # whileループの回数を1増やす

    # 以下のprint命令で,結果を表示
    print('No.', i) 
    print('(w1 w2 b) = (', w1, w2, b, ') ') 
    print('(s00 s01 s10 s11)=(', s00, s01, s10, s11, ')') 
    print('L = ', L ) 
    print('')
 
 

# 第4章

#------プログラム4-1------
#
import math # 指数関数 math.exp( )を使うために,math ライブラリを呼び出す命令

i=1    # whileループの回数
L=100  # 損失関数Lの初期値 初期値は大きな値を選ぶ。
w=2; b=2; v1=2; p1=2; v2=2; p2=2  
# w,b, v1, p1, v2, p2 の初期値

k=10 #学習率

while L >0.0001:                     # 損失関数Lの収束条件
        print('No.', i, ' k = ', k ) # 計算回数と学習率を表示

        x = 0   #------ x = 0 の場合------------------
        r1 = 1  # 出力o1の正解
        r2 = 0  # 出力o2の正解

        y = w * x + b               # (4.1)式
        z = 1/(1+math.exp(-y))      # (4.2)式 シグモイド関数

        q1 = v1 * z + p1            # (4.3)式
        q2 = v2 * z + p2            # (4.4)式

        o1 = 1/(1+math.exp(-q1))    # (4.5)式 シグモイド関数
        o2 = 1/(1+math.exp(-q2))    # (4.6)式 シグモイド関数
        print('( x, 01, 02 ) = (', x, o1, o2, ')')

        L = ((o1-r1)**2 + (o2-r2)**2)/2     # (4.7)式の損失関数
        eo1 = (o1-r1) * o1 * (1-o1)         # (4.30)式 出力層の誤差
        eo2 = (o2-r2) * o2 * (1-o2)         # (4.34)式 出力層の誤差
        em = (eo1*v1 + eo2*v2) * z * (1-z)  # (4.38) 式 隠れ層の誤差

        #パラメーターの変位を求める(画素値x=0の場合)
        dv1 = -k * eo1 * z     #(4.25)式
        dp1 = -k * eo1         #(4.26)式
        dv2 = -k * eo2 * z     #(4.27)式
        dp2 = -k * eo2         #(4.28)式
        dw = -k * em * x       # (4.13)式
        db = -k * em           # (4.14)式

        x = 1 #------ x=1 の場合------------------
        r1 = 0  # 出力o1の正解
        r2 = 1  # 出力o2の正解

        y = w * x + b               # (4.1)式
        z = 1/(1+math.exp(-y))      # (4.2)式

        q1 = v1 * z + p1            # (4.3)式
        q2 = v2  *z + p2            # (4.4)式

        o1 = 1/(1+math.exp(-q1))    # (4.5)式
        o2 = 1/(1+math.exp(-q2))    # (4.6)式
        print('( x, 01, 02 ) = (', x, o1, o2, ')')

        L = ((o1-r1)**2 + (o2-r2)**2)/2 + L  # (4.7)式の損失関数
        eo1 = (o1-r1) * o1 * (1-o1)    #(4.30)式 出力層の誤差
        eo2 = (o2-r2) * o2 * (1-o2)    #(4.34)式 出力層の誤差
        em = (eo1*v1 + eo2*v2) * z * (1-z)  #(4.38)式 隠れ層の誤差

        #パラメーターの変位を求める(画素値x=0と1の場合の和)
        dv1 = -k * eo1 * z + dv1    #(4.25)式 x=0とx=1の場合の和
        dp1 = -k * eo1 + dp1        #(4.26)式
        dv2 = -k * eo2 * z + dv2    #(4.27)式
        dp2 = -k * eo2 + dp2        #(4.28)式
        dw = -k * em * x + dw       # (4.13)式
        db = -k * em + db           # (4.14)式

        #パラメーターの値(変位後)
        w = w + dw
        b = b + db
        v1 = v1 + dv1
        p1 = p1 + dp1
        v2 = v2 + dv2
        p2 = p2 + dp2
        i= i + 1

        print('L = ', L)
        print('(w b) = (', w, b, ') ')
        print('(v1 p1 v2 p2) = (', v1, p1, v2, p2, ')')
        print('')
 


# 第5章

#------プログラム5-1------
#
# TensorFlow と Keras のインポート
import tensorflow as tf
from tensorflow import keras

# Numpy と Matplotlib のインポート
import numpy as np
import matplotlib.pyplot as plt

# fashion_mnist のデータセットのロード
(kunren_gazou, kunren_label), (kensho_gazou, kensho_label)= keras.datasets.fashion_mnist.load_data()

# ラベルをワンホットベクトルに変換
from keras.utils.np_utils import to_categorical
kunren_label = to_categorical(kunren_label, num_classes=None)
kensho_label = to_categorical(kensho_label, num_classes=None)

# データセットの正規化
kunren_gazou = kunren_gazou / 255.0
kensho_gazou = kensho_gazou / 255.0

# ニューラルネットワークのモデルの構築
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='sigmoid'),
    keras.layers.Dense(10, activation='softmax')
])

# モデルの要約(Summary)
model.summary()

# モデルの編集
model.compile(optimizer='SGD', 
              loss='mean_squared_error',
              metrics=['accuracy'])

# モデルによる訓練(学習)
model.fit(kunren_gazou, kunren_label, epochs=20)

# モデルの保存
model.save('Jijyou_heikin_ep20.h5')

#モデルの検証
kensho_loss, kensho_acc = model.evaluate(kensho_gazou,  kensho_label, verbose=2)

print('\n')
print('Kensho loss (Sonshitsu):', kensho_loss)
print('Kensho accuracy (Seikai_ritsu):', kensho_acc)
 


#------プログラム5-2------
#
#検証画像の確認
kensho_gazou.shape
kensho_gazou[300]
plt.imshow(kensho_gazou[300], cmap='gray')
plt.colorbar()
print('Kensho_gazou Label: ', np.argmax(kensho_label[300]))

#検証画像の予測
print('\n')
kensho_gazou[300].shape 
kenshosample=np.expand_dims(kensho_gazou[300], 0 )
yosoku_kekka = model.predict(kenshosample)

print('Yosoku_kekka (Vector): ', yosoku_kekka[0])
print('\n')
print('Yosoku_kekka (Label): ', np.argmax(yosoku_kekka[0]))
 
 

#------プログラム5-3------
#
#稼働中のモデルの消去
del model

#学習済みモデルのロード
model = keras.models.load_model('Jijyou_heikin_ep20.h5')

#モデルの検証
kensho_loss, kensho_acc = model.evaluate(kensho_gazou,  
kensho_label, verbose=2)

#検証結果
print('\n')
print('Kensho loss:', kensho_loss)
print('Kensho accuracy:', kensho_acc)

#300番の検証画像の予測
kenshosample=np.expand_dims(kensho_gazou[300], 0 )
yosoku_kekka = model.predict(kenshosample)
print(yosoku_kekka[0])
print(np.argmax(yosoku_kekka[0]))

print('Yosoku_kekka (Label): ', np.argmax(yosoku_kekka[0]))
 
 

# 第6章

#------プログラム6-1------
#
#モデルによる訓練(学習)
fit_kiroku = model.fit(kunren_gazou,  kunren_label, epochs=20, validation_data=(kensho_gazou, kensho_label) )

# 損失(Loss)の変化をプロット
plt.plot(fit_kiroku.history['loss'], '-s', color='blue', label='Kunren Loss', linewidth=2)
plt.plot(fit_kiroku.history['val_loss'], '-D', color='orange', label='Kensho Loss', linewidth=2)
plt.title('LOSS (Sonshitsu)')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(loc='upper right')
plt.show()
  
# 正解率(Accuracy)の変化をプロット
plt.plot(fit_kiroku.history['accuracy'],'o-', color='green', label='Kunren Accuracy', linewidth=2)
plt.plot(fit_kiroku.history['val_accuracy'], '-s', color='red', label='Kensho Accuracy', linewidth=2)
plt.title('ACCURACY (Seikairitsu)')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
plt.show()


#交差エントロピー誤差に変更------------------------------------------

#------プログラム5-1 モデルの編集まで------
 
# TensorFlow と Keras のインポート
import tensorflow as tf
from tensorflow import keras

# Numpy と Matplotlib のインポート
import numpy as np
import matplotlib.pyplot as plt

# fashion_mnist のデータセットのロード
(kunren_gazou, kunren_label), (kensho_gazou, kensho_label)= keras.datasets.fashion_mnist.load_data()

# ラベルをワンホットベクトルに変換
from keras.utils.np_utils import to_categorical
kunren_label = to_categorical(kunren_label, num_classes=None)
kensho_label = to_categorical(kensho_label, num_classes=None)

# データセットの正規化
kunren_gazou = kunren_gazou / 255.0
kensho_gazou = kensho_gazou / 255.0

# ニューラルネットワークのモデルの構築
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='sigmoid'),
    keras.layers.Dense(10, activation='softmax')
])

# モデルの要約(Summary)
model.summary()

# モデルの編集
model.compile(optimizer='SGD', 
              loss='categorical_crossentropy',
              metrics=['accuracy'])
 

#------プログラム6-1------
#
#モデルによる訓練(学習)
fit_kiroku = model.fit(kunren_gazou,  kunren_label, epochs=20, validation_data=(kensho_gazou, kensho_label) )

# 損失(Loss)の変化をプロット
plt.plot(fit_kiroku.history['loss'], '-s', color='blue', label='Kunren Loss', linewidth=2)
plt.plot(fit_kiroku.history['val_loss'], '-D', color='orange', label='Kensho Loss', linewidth=2)
plt.title('LOSS (Sonshitsu)')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(loc='upper right')
plt.show()
  
# 正解率(Accuracy)の変化をプロット
plt.plot(fit_kiroku.history['accuracy'],'o-', color='green', label='Kunren Accuracy', linewidth=2)
plt.plot(fit_kiroku.history['val_accuracy'], '-s', color='red', label='Kensho Accuracy', linewidth=2)
plt.title('ACCURACY (Seikairitsu)')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
plt.show()


# Adam と 交差エントロピー誤差 に変更-------------------------------------

#------プログラム5-1 モデルの編集まで------
 
# TensorFlow と Keras のインポート
import tensorflow as tf
from tensorflow import keras

# Numpy と Matplotlib のインポート
import numpy as np
import matplotlib.pyplot as plt

# fashion_mnist のデータセットのロード
(kunren_gazou, kunren_label), (kensho_gazou, kensho_label)= keras.datasets.fashion_mnist.load_data()

# ラベルをワンホットベクトルに変換
from keras.utils.np_utils import to_categorical
kunren_label = to_categorical(kunren_label, num_classes=None)
kensho_label = to_categorical(kensho_label, num_classes=None)

# データセットの正規化
kunren_gazou = kunren_gazou / 255.0
kensho_gazou = kensho_gazou / 255.0

# ニューラルネットワークのモデルの構築
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='sigmoid'),
    keras.layers.Dense(10, activation='softmax')
])

# モデルの要約(Summary)
model.summary()

# モデルの編集
model.compile(optimizer='Adam', 
              loss='categorical_crossentropy',
              metrics=['accuracy'])
 

#------プログラム6-1------
#
#モデルによる訓練(学習)
fit_kiroku = model.fit(kunren_gazou,  kunren_label, epochs=20, validation_data=(kensho_gazou, kensho_label) )

# 損失(Loss)の変化をプロット
plt.plot(fit_kiroku.history['loss'], '-s', color='blue', label='Kunren Loss', linewidth=2)
plt.plot(fit_kiroku.history['val_loss'], '-D', color='orange', label='Kensho Loss', linewidth=2)
plt.title('LOSS (Sonshitsu)')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(loc='upper right')
plt.show()
  
# 正解率(Accuracy)の変化をプロット
plt.plot(fit_kiroku.history['accuracy'],'o-', color='green', label='Kunren Accuracy', linewidth=2)
plt.plot(fit_kiroku.history['val_accuracy'], '-s', color='red', label='Kensho Accuracy', linewidth=2)
plt.title('ACCURACY (Seikairitsu)')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
plt.show()
 



# 第7章

#------プログラム7-2------
#
# TensorFlow と Keras のインポート
import tensorflow as tf
from tensorflow import keras

# Numpy と matplotlib のインポート
import numpy as np
import matplotlib.pyplot as plt

# fashion_mnist のデータセットのロード
(kunren_gazou, kunren_label), (kensho_gazou, kensho_label)= keras.datasets.fashion_mnist.load_data()

#ラベルをワンホットベクトルに変換します
from keras.utils.np_utils import to_categorical
kunren_label = to_categorical(kunren_label, num_classes=None)
kensho_label = to_categorical(kensho_label, num_classes=None)

#データセットを正規化します
kunren_gazou = kunren_gazou / 255.0
kensho_gazou = kensho_gazou / 255.0

#モデルの構築
model = keras.Sequential()
model.add( keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add( keras.layers.MaxPooling2D((2, 2)))

model.add( keras.layers.Flatten())
model.add( keras.layers.Dense(10, activation='softmax'))

#モデルの要約(Summary)
model.summary()

#モデルの編集
model.compile(optimizer='Adam', 
              loss='categorical_crossentropy',
              metrics=['accuracy'])

#モデルの訓練(学習)
fit_kiroku = model.fit(kunren_gazou,  kunren_label, epochs=20, validation_data=(kensho_gazou, kensho_label) )

#モデルの保存
model.save('Tatamikomi_ep20.h5')

# 損失(Loss)の変化をプロット
plt.plot(fit_kiroku.history['loss'], '-s', color='blue', label='Kunren Loss', linewidth=2)
plt.plot(fit_kiroku.history['val_loss'], '-D', color='orange', label='Kensho Loss', linewidth=2)
plt.title('LOSS (Sonshitsu)')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(loc='upper right')
plt.show()
  
# 正解率(Accuracy)の変化をプロット
plt.plot(fit_kiroku.history['accuracy'],'o-', color='green', label='Kunren Accuracy', linewidth=2)
plt.plot(fit_kiroku.history['val_accuracy'], '-s', color='red', label='Kensho Accuracy', linewidth=2)
plt.title('ACCURACY (Seikairitsu)')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
plt.show()



#------プログラム7-3------
#
# 配列layer_infoにmodelのlayerの情報を読み込む
for layer_info in model.layers:
    # layerの名称にconvを含むlayerをピックアップする
    if 'conv' in layer_info.name:
        # layerの重みとバイアスを配列に代入する
        omomi, bias= layer_info.get_weights()
        
        #重みの値を正規化する
        w_min, w_max = omomi.min(), omomi.max()
        filter_omomi = (omomi - w_min) / (w_max - w_min)  
        print(filter_omomi.shape)
        filter_No=6  #表示するフィルターの数

        for i in range(filter_No):    
            ax= plt.subplot(2, 3, i+1 )
            ax.set_xticks([])
            ax.set_yticks([])
            plt.imshow( filter_omomi[:, :, 0, i], cmap='gray')
            plt.colorbar()

        plt.show()



#------プログラム7-4------
#
# TensorFlow と Keras のインポート
import tensorflow as tf
from tensorflow import keras

# NumPy と matplotlib のインポート
import numpy as np
import matplotlib.pyplot as plt

# fashion_mnist のデータセットのロード
(kunren_gazou, kunren_label), (kensho_gazou, kensho_label)= keras.datasets.mnist.load_data()

# ラベルをワンホットベクトルに変換します
from keras.utils.np_utils import to_categorical
kunren_label = to_categorical(kunren_label, num_classes=None)
kensho_label = to_categorical(kensho_label, num_classes=None)

# データセットを正規化します
kunren_gazou = kunren_gazou / 255.0
kensho_gazou = kensho_gazou / 255.0

# モデルの構築
model = keras.Sequential()
model.add( keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add( keras.layers.MaxPooling2D((2, 2)))

model.add( keras.layers.Flatten())
model.add( keras.layers.Dense(10, activation='softmax'))

# モデルの要約(Summary)
model.summary()

# モデルの編集
model.compile(optimizer='Adam', 
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# モデルによる訓練(学習)
fit_kiroku = model.fit(kunren_gazou,  kunren_label, epochs=5, validation_data=(kensho_gazou, kensho_label) )

# 損失(Loss)の変化をプロット
plt.plot(fit_kiroku.history['loss'], '-s', color='blue', label='Kunren Loss', linewidth=2)
plt.plot(fit_kiroku.history['val_loss'], '-D', color='orange', label='Kensho Loss', linewidth=2)
plt.title('LOSS (Sonshitsu)')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(loc='upper right')
plt.show()
  
# 正解率(Accuracy)の変化をプロット
plt.plot(fit_kiroku.history['accuracy'], 'o-', color='green', label='Kunren Accuracy', linewidth=2)
plt.plot(fit_kiroku.history['val_accuracy'], '-s', color='red', label='Kensho Accuracy', linewidth=2)
plt.title('ACCURACY (Seikairitsu)')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
plt.show()



#------プログラム7-5------
#
import numpy as np
import matplotlib.pyplot as plt

from PIL import Image           # PILからImageメソッドをインポート
gazo7 = Image.open('gazo7.jpg') # JPG画像の読み込み
gazo7 = gazo7.convert("L")      # グレースケール画像への変換
gazo7 = gazo7.resize((28, 28))  # 28×28画像にリサイズ
gazo7np = np.array(gazo7)       # NumPy配列に変換
gazo7np = gazo7np/255.0         # 画像データの正規化
gazo7np = 1-gazo7np             # 白黒反転
plt.imshow(gazo7np, cmap='gray')




#------プログラム7-6------
#
kenshosample=np.expand_dims(gazo7np, 0 )
yosoku_kekka = model.predict(kenshosample)
print('Yosoku kekka (Vector): ', yosoku_kekka)
print('Yosoku kekka (Label): ', np.argmax(yosoku_kekka))



#第8章

# ====== SimpleRNN ==========================================================

#------プログラム8-1------
#
# SimpleRNNによる平均気温予測
# TensorFlow と Keras のインポート
import tensorflow as tf
from tensorflow import keras

# NumPyとmatplotlib のインポート
import numpy as np
import matplotlib.pyplot as plt

# 気温データ 2000/1 から 2017/1 まで(気象庁HPより)
Kion_data = [7.6,6,9.4,14.5,19.8,22.5,27.7,28.3,25.6,18.8,13.3,8.8,
             4.9,6.6,9.8,15.7,19.5,23.1,28.5,26.4,23.2,18.7,13.1,8.4,
             7.4,7.9,12.2,16.1,18.4,21.6,28,28,23.1,19,11.6,7.2,
             5.5,6.4,8.7,15.1,18.8,23.2,22.8,26,24.2,17.8,14.4,9.2,
             6.3,8.5,9.8,16.4,19.6,23.7,28.5,27.2,25.1,17.5,15.6,9.9,
             6.1,6.2,9,15.1,17.7,23.2,25.6,28.1,24.7,19.2,13.3,6.4,
             5.1,6.7,9.8,13.6,19,22.5,25.6,27.5,23.5,19.5,14.4,9.5,
             7.6,8.6,10.8,13.7,19.8,23.2,24.4,29,25.2,19,13.3,9,
             5.9,5.5,10.7,14.7,18.5,21.3,27,26.8,24.4,19.4,13.1,9.8,
             6.8,7.8,10,15.7,20.1,22.5,26.3,26.6,23,19,13.5,9,
             7,6.5,9.1,12.4,19,23.6,28,29.6,25.1,18.9,13.5,9.9,
             5.1,7,8.1,14.5,18.5,22.8,27.3,27.5,25.1,19.5,14.9,7.5,
             4.8,5.4,8.8,14.5,19.6,21.4,26.4,29.1,26.2,19.4,12.7,7.3,
             5.5,6.2,12.1,15.2,19.8,22.9,27.3,29.2,25.2,19.8,13.5,8.3,
             6.3,5.9,10.4,15,20.3,23.4,26.8,27.7,23.2,19.1,14.2,6.7,
             5.8,5.7,10.3,14.5,21.1,22.1,26.2,26.7,22.6,18.4,13.9,9.3,
             6.1,7.2,10.1,15.4,20.2,22.4,25.4,27.1,24.4,18.7,11.4,8.9,
             5.8]

Month_total = len(Kion_data) # 気温データの総月数 205
Kikan = 36 # 参考期間=36か月

# 気温データの配列と正解の配列の作成
Kion = [] # 月別気温データ(東京)のリスト:最初は要素無しで定義
Seikai = [] # 正解のリスト:最初は要素無しで定義

for i in range(Month_total - Kikan): # iは1から(205-36=169)まで
        # 「0から36までのデータ」+「1から37までのデータ」+...
        Kion.append(Kion_data[i:i + Kikan]) 
        Seikai.append(Kion_data[i + Kikan])

# 気温データ(1次元)を3次元配列に変換
Kion = np.array(Kion).reshape(-1, Kikan, 1)
# 正解の配列(1次元)を2次元配列に変換
Seikai = np.array(Seikai).reshape(-1, 1)

# モデルの構築
model = keras.Sequential()
model.add(keras.layers.SimpleRNN(200, activation='tanh'))
model.add(keras.layers.Dense(1, activation='linear'))

#モデルの編集
model.compile(optimizer='Adam', loss='mean_squared_error')

#アーリーストッピング
soki_syuryo = keras.callbacks.EarlyStopping(monitor='val_loss', patience=5, verbose=1)

#モデルの学習
fit_kiroku = model.fit(Kion, Seikai,
                     epochs=1000, batch_size=100,
                     verbose=2,
                     validation_split=0.2,
                     callbacks=[soki_syuryo])

#モデルの要約
model.summary()

#損失(Loss)の変化をプロット
plt.plot(fit_kiroku.history['loss'], '-s', color='blue', label='Kunren Loss', linewidth=2)
plt.plot(fit_kiroku.history['val_loss'], '-D', color='orange', label='Kensho Loss', linewidth=2)
plt.title('LOSS (Sonshitsu)')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(loc='upper right')
plt.show()


#テスト用気温データ 2017/1 から 2022/1 まで(気象庁HPより)
Kion_test=[5.8,6.9,8.5,14.7,20,22,27.3,26.4,22.8,16.8,11.9,6.6,
           4.7,5.4,11.5,17,19.8,22.4,28.3,28.1,22.9,19.1,14,8.3,
           5.6,7.2,10.6,13.6,20,21.8,24.1,28.4,25.1,19.4,13.1,8.5,
           7.1,8.3,10.7,12.8,19.5,23.2,24.3,29.1,24.2,17.5,14,7.7,
           5.4,8.5,12.8,15.1,19.6,22.7,25.9,27.4,22.3,18.2,13.7,7.9,
           4.9]

Month_total = len(Kion_test)
Kikan = 36
print('Month_total=', Month_total, Month_total - Kikan)

Kion = [] # 月別気温データ(東京)のリスト
Seikai = [] # 正解のリスト

# iは1から(61-36=25)まで Day_total 61, Kikan 36
for i in range(Month_total - Kikan):
        # 「0から36までのデータ」+「1から37までのデータ」+...
        Kion.append(Kion_test[i:i + Kikan])
        Seikai.append(Kion_test[i + Kikan])

Kion = np.array(Kion).reshape(-1, Kikan, 1)
Seikai = np.array(Seikai).reshape(-1, 1)

# 予測
Yosoku_kekka = model.predict(Kion)

# グラフ化のために正解と予測結果の配列の1次元化
Seikai=Seikai.reshape(-1)
Yosoku_kekka=Yosoku_kekka.reshape(-1)

# plt.plotによるグラフ描画
fig = plt.figure()
plt.rc('font', family='serif')
plt.xlim([-1, 25])  # x軸の範囲
plt.ylim([0, 30])   # y軸の範囲
plt.plot(range(25), Seikai, color='black',
         marker='o', markersize=5,  linewidth=0.5, label='Kion')
plt.plot(range(25), Yosoku_kekka,marker='*', markersize=10, linewidth=0, color='blue',
         label='Yosoku')

plt.title('Heikin-kion Yosoku (Prediction) Tokyo 2020/01--2022/01')
plt.xlabel('Month')
plt.ylabel('Temperature (C: Ondo)')
plt.legend(loc='lower right')

plt.show()



# ====== LSTM ==========================================================

#------プログラム8-1------
#
# LSTMによる平均気温予測
# TensorFlow と Keras のインポート
import tensorflow as tf
from tensorflow import keras

# NumPyとmatplotlib のインポート
import numpy as np
import matplotlib.pyplot as plt

# 気温データ 2000/1 から 2017/1 まで(気象庁HPより)
Kion_data = [7.6,6,9.4,14.5,19.8,22.5,27.7,28.3,25.6,18.8,13.3,8.8,
             4.9,6.6,9.8,15.7,19.5,23.1,28.5,26.4,23.2,18.7,13.1,8.4,
             7.4,7.9,12.2,16.1,18.4,21.6,28,28,23.1,19,11.6,7.2,
             5.5,6.4,8.7,15.1,18.8,23.2,22.8,26,24.2,17.8,14.4,9.2,
             6.3,8.5,9.8,16.4,19.6,23.7,28.5,27.2,25.1,17.5,15.6,9.9,
             6.1,6.2,9,15.1,17.7,23.2,25.6,28.1,24.7,19.2,13.3,6.4,
             5.1,6.7,9.8,13.6,19,22.5,25.6,27.5,23.5,19.5,14.4,9.5,
             7.6,8.6,10.8,13.7,19.8,23.2,24.4,29,25.2,19,13.3,9,
             5.9,5.5,10.7,14.7,18.5,21.3,27,26.8,24.4,19.4,13.1,9.8,
             6.8,7.8,10,15.7,20.1,22.5,26.3,26.6,23,19,13.5,9,
             7,6.5,9.1,12.4,19,23.6,28,29.6,25.1,18.9,13.5,9.9,
             5.1,7,8.1,14.5,18.5,22.8,27.3,27.5,25.1,19.5,14.9,7.5,
             4.8,5.4,8.8,14.5,19.6,21.4,26.4,29.1,26.2,19.4,12.7,7.3,
             5.5,6.2,12.1,15.2,19.8,22.9,27.3,29.2,25.2,19.8,13.5,8.3,
             6.3,5.9,10.4,15,20.3,23.4,26.8,27.7,23.2,19.1,14.2,6.7,
             5.8,5.7,10.3,14.5,21.1,22.1,26.2,26.7,22.6,18.4,13.9,9.3,
             6.1,7.2,10.1,15.4,20.2,22.4,25.4,27.1,24.4,18.7,11.4,8.9,
             5.8]

Month_total = len(Kion_data) # 気温データの総月数 205
Kikan = 36 # 参考期間=36か月

# 気温データの配列と正解の配列の作成
Kion = [] # 月別気温データ(東京)のリスト:最初は要素無しで定義
Seikai = [] # 正解のリスト:最初は要素無しで定義

for i in range(Month_total - Kikan): # iは1から(205-36=169)まで
        # 「0から36までのデータ」+「1から37までのデータ」+...
        Kion.append(Kion_data[i:i + Kikan]) 
        Seikai.append(Kion_data[i + Kikan])

# 気温データ(1次元)を3次元配列に変換
Kion = np.array(Kion).reshape(-1, Kikan, 1)
# 正解の配列(1次元)を2次元配列に変換
Seikai = np.array(Seikai).reshape(-1, 1)

# モデルの構築
model = keras.Sequential()
model.add(keras.layers.LSTM(200, activation='tanh'))
model.add(keras.layers.Dense(1, activation='linear'))

#モデルの編集
model.compile(optimizer='Adam', loss='mean_squared_error')

#アーリーストッピング
soki_syuryo = keras.callbacks.EarlyStopping(monitor='val_loss', patience=5, verbose=1)

#モデルの学習
fit_kiroku = model.fit(Kion, Seikai,
                     epochs=1000, batch_size=100,
                     verbose=2,
                     validation_split=0.2,
                     callbacks=[soki_syuryo])

#モデルの要約
model.summary()

#損失(Loss)の変化をプロット
plt.plot(fit_kiroku.history['loss'], '-s', color='blue', label='Kunren Loss', linewidth=2)
plt.plot(fit_kiroku.history['val_loss'], '-D', color='orange', label='Kensho Loss', linewidth=2)
plt.title('LOSS (Sonshitsu)')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(loc='upper right')
plt.show()


#テスト用気温データ 2017/1 から 2022/1 まで(気象庁HPより)
Kion_test=[5.8,6.9,8.5,14.7,20,22,27.3,26.4,22.8,16.8,11.9,6.6,
           4.7,5.4,11.5,17,19.8,22.4,28.3,28.1,22.9,19.1,14,8.3,
           5.6,7.2,10.6,13.6,20,21.8,24.1,28.4,25.1,19.4,13.1,8.5,
           7.1,8.3,10.7,12.8,19.5,23.2,24.3,29.1,24.2,17.5,14,7.7,
           5.4,8.5,12.8,15.1,19.6,22.7,25.9,27.4,22.3,18.2,13.7,7.9,
           4.9]

Month_total = len(Kion_test)
Kikan = 36
print('Month_total=', Month_total, Month_total - Kikan)

Kion = [] # 月別気温データ(東京)のリスト
Seikai = [] # 正解のリスト

# iは1から(61-36=25)まで Day_total 61, Kikan 36
for i in range(Month_total - Kikan):
        # 「0から36までのデータ」+「1から37までのデータ」+...
        Kion.append(Kion_test[i:i + Kikan])
        Seikai.append(Kion_test[i + Kikan])

Kion = np.array(Kion).reshape(-1, Kikan, 1)
Seikai = np.array(Seikai).reshape(-1, 1)

# 予測
Yosoku_kekka = model.predict(Kion)

# グラフ化のために正解と予測結果の配列の1次元化
Seikai=Seikai.reshape(-1)
Yosoku_kekka=Yosoku_kekka.reshape(-1)

# plt.plotによるグラフ描画
fig = plt.figure()
plt.rc('font', family='serif')
plt.xlim([-1, 25])  # x軸の範囲
plt.ylim([0, 30])   # y軸の範囲
plt.plot(range(25), Seikai, color='black',
         marker='o', markersize=5,  linewidth=0.5, label='Kion')
plt.plot(range(25), Yosoku_kekka,marker='*', markersize=10, linewidth=0, color='blue',
         label='Yosoku')

plt.title('Heikin-kion Yosoku (Prediction) Tokyo 2020/01--2022/01')
plt.xlabel('Month')
plt.ylabel('Temperature (C: Ondo)')
plt.legend(loc='lower right')

plt.show()
 

 

#------免責について---------------------------------------------
#
#本書の内容やプログラムの運用の結果については,著者および出版元は一
#切の責任を負いません。これらの運用は,お客様ご自身の責任と判断におい
#て行ってください。