# 目的
異常検知問題をやってみたくてKerasで簡単な問題を作ってみました
# 内容
y=x-0.5+ε
という式でx,yのペアを作りそれを入力、と出力にして学習してみました
# コード
autoencoder.ipynb
import numpy as np
import random
from keras.models import Model,Sequential
from keras.layers import Dense,Activation,Dropout,Input
from keras.layers.normalization import BatchNormalization
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
# 関数
def func(x,w):
return(x+(random.random()*2-1)*w)
# データ作成
x1=[random.random() for i in range(500)]
X=np.array([[z,func(z-0.5,0.05)] for z in x1])
Y=np.array([[z,func(z,0.0)] for z in x1])
X_train,X_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)
# 学習モデル作成
encoding_dim = 1
activation="relu"
hidden=10
output_dim = X_train.shape[1]
model=Sequential()
model.add(Dense(hidden,input_shape=(X_train.shape[1],),activation=activation))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
model.add(Dense(encoding_dim,activation=activation))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
model.add(Dense(hidden,activation=activation))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
model.add(Dense(output_dim,activation=activation))
print(model.summary())
#学習実施
model.compile(optimizer='sgd', loss='mae')
model.fit(X_train, X_train, epochs=50,batch_size=50, validation_data=(X_test, X_test),verbose=0)
#学習結果表示
pred=model.predict(X_train)
plt.scatter(X_train[:,0],X_train[:,1],s=0.1)
plt.scatter(pred[:,0],pred[:,1],s=0.1)
plt.show()
plt.scatter(X_train[:,0]-pred[:,0],X_train[:,1]-pred[:,1])
#結果
青い点が学習データ(x,y)をペアで入力と出力
オレンジの点が同じデータを入力したときの出力
なぜかうまく学習できません
今のところ原因はわかっていません。
activationをreluやsgdなどに変えたりlossを変えたり隠れ層の数を変えましたが
大きく改善していません
#解決
いろいろいじって自己解決しました
結果的には、活性化関数をreluとかtanhとかにしていましたが、思い切ってKerasのデフォルトのNoneにしたところ,下のグラフのようにまっすぐのりました。
単純な線形問題だからこれでうまく行くのか、それとも回帰問題はこれで正解なのかはもう少し試してみて考えます