Kerasでsin関数を機械学習する。
目標
Kerasを用いてニューラルネットワークを作成し、sin関数を出力する。
環境
仕様
層 | ニューロン | 活性化関数 |
---|---|---|
入力層 | 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
epochs=500のとき
loss: 0.0064
epochs=1000のとき
loss: 1.9209e-05
loss率の推移
感想
今回は回帰問題としてsin関数の学習を行なった。この学習はニューロンが少なく、シンプルなモデルだったため1エポックあたりの学習時間が短かった。