Keras에서 Autoencoder를 사용하여 간단한 문제로 시도했습니다.

목적



이상 감지 문제를 시도하고 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으로 했더니, 아래의 그래프와 같이 똑바로 풀었습니다.
단순한 선형 문제이기 때문에 이것으로 잘 가는지, 아니면 회귀 문제는 이것으로 정답인지는 좀 더 시도해 보겠습니다.

좋은 웹페이지 즐겨찾기