ENTOTSU44

IT系のことを中心に更新してます。

Kerasでsin関数を機械学習する。

目標

Kerasを用いてニューラルネットワークを作成し、sin関数を出力する。

環境

  • macOS Catalina 10.15.3
  • Python 3.7.5
  • TensorFlow 1.15.0
  • Keras 2.2.4
  • numpy 1.17.3
  • matplotlib 3.1.3

仕様

ニューロン 活性化関数
入力層 1
中間層 3 シグモイド関数
出力層 1 恒等関数

プログラム

from keras.models import Sequential
from keras.layers import Dense
from keras import optimizers
import numpy as np
import matplotlib.pyplot as plt

epochs = 1000

# 入力データ生成
input_data = np.arange(0, np.pi * 2, 0.1)
correct_data = np.sin(input_data)
input_data = (input_data - np.pi) / np.pi

# 入力データ生成
model = Sequential()
model.add(Dense(3, activation='sigmoid', input_dim=1))
model.add(Dense(1, activation='linear'))
model.compile(loss='mean_squared_error', optimizer=optimizers.SGD(lr=0.1))
model.summary()
# 学習
history = model.fit(input_data, correct_data, batch_size=1, epochs=epochs)

# 検証
data = model.predict(input_data)

# グラフ出力
plt.plot(history.history['loss'], )
plt.title('model loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.savefig('model-loss.png')
plt.show()

plt.title('sin epochs=' + str(epochs))
plt.plot(input_data, correct_data, linestyle="dashed")
plt.plot(input_data, data, marker="+")
plt.savefig('sin-' + str(epochs) + '.png')
plt.show()

結果

モデル構造

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 3)                 6         
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 4         
=================================================================
Total params: 10
Trainable params: 10
Non-trainable params: 0

epochs=100のとき

loss: 0.0146

f:id:ENTOTSU44:20200319162244p:plain
epochs=100のときのsin関数

epochs=500のとき

loss: 0.0064

f:id:ENTOTSU44:20200319163227p:plain
epochs=500のときのsin関数

epochs=1000のとき

loss: 1.9209e-05

f:id:ENTOTSU44:20200319162717p:plain
epochs=1000の時のsin関数

loss率の推移

f:id:ENTOTSU44:20200319164037p:plain
los率の推移

感想

今回は回帰問題としてsin関数の学習を行なった。この学習はニューロンが少なく、シンプルなモデルだったため1エポックあたりの学習時間が短かった。