0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

KerasでAutoencoderを試して簡単な問題で試してみた

Last updated at Posted at 2020-02-16

# 目的
異常検知問題をやってみたくて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を変えたり隠れ層の数を変えましたが
大きく改善していません

result.png

#解決
いろいろいじって自己解決しました
結果的には、活性化関数をreluとかtanhとかにしていましたが、思い切ってKerasのデフォルトのNoneにしたところ,下のグラフのようにまっすぐのりました。
単純な線形問題だからこれでうまく行くのか、それとも回帰問題はこれで正解なのかはもう少し試してみて考えます

result.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?