【技術記事】人工知能がsinカーブを学習するまで

みなさん、こんにちは、
みむすたーです。

本日は、人工知能がsinカーブを学習するまでの状態を描画していきたいと思います。

それではいきましょう。

ソースコード

%tensorflow_version 2.x
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import random
from tensorflow.keras import layers, models, callbacks, initializers, optimizers
from sklearn import datasets
import matplotlib.animation as animation

# 順伝播モデル
model = models.Sequential()

# 入力層 - 中間層 のモデル追加
model.add(layers.Dense(4,input_shape=(1,),name="middle_layer",activation="sigmoid"))

# 中間層 - 出力層 のモデル追加
model.add(layers.Dense(1,input_shape=(4,),name="output_layer"))

# 最適化関数=確率的勾配降下法(sgd)、誤差関数=平均二乗誤差(mse)、学習率=0.01、減衰率=0.9で設定
sgd = optimizers.SGD(lr=0.01, decay=0, momentum=0.9, nesterov=True)
model.compile(optimizer=sgd,loss="mse")

# テストデータかつ正解データ
x = np.linspace(0,2 * np.pi, 100)
y = np.sin(x)

# 描画領域作成
fig = plt.figure()
ax = fig.add_subplot(1,1,1)

# エポックごとにニューラルネットワークから出力
epoch_print_callback = callbacks.LambdaCallback(
    on_epoch_begin=lambda batch,logs: history_y.append(model.predict(x)))

# 学習開始
epoch = 2001
history = model.fit(x,y,batch_size=len(x)//10,epochs=epoch,verbose=0, callbacks=[epoch_print_callback])

# 履歴データを間引く
history_y = history_y[::10]

def AnimationUpdater(frame):
    global history_y
    global x, y
    # 表示されているグラフをリセット
    ax.cla()
    
    # yのグラフを表示
    ax.plot(x,y)
    ax.plot(x,history_y[frame-1])

    ax.text(0,1,"epoch=" + str(frame * 10))

# アニメーション作成
ani = animation.FuncAnimation(fig,AnimationUpdater, interval=10,frames=epoch//10)
ani.save("sin_learn.gif",writer="pillow")

実行結果

以下のgif画像が出力されます。

コメント