Keras에서 Autoencoder를 사용하여 간단한 문제로 시도했습니다.
11546 단어 AutoencoderKeras이상 감지
목적
이상 감지 문제를 시도하고 Keras에서 간단한 문제를 만들려고했습니다.
내용
y=x-0.5+ε
라고 하는 식으로 x, y의 페어를 만들어 그것을 입력, 과 출력으로 해 학습해 보았습니다
코드
autoencoder.ipynbimport 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으로 했더니, 아래의 그래프와 같이 똑바로 풀었습니다.
단순한 선형 문제이기 때문에 이것으로 잘 가는지, 아니면 회귀 문제는 이것으로 정답인지는 좀 더 시도해 보겠습니다.
Reference
이 문제에 관하여(Keras에서 Autoencoder를 사용하여 간단한 문제로 시도했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/cessna373/items/641c4bbcc0065cd05538
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
y=x-0.5+ε
라고 하는 식으로 x, y의 페어를 만들어 그것을 입력, 과 출력으로 해 학습해 보았습니다
코드
autoencoder.ipynbimport 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으로 했더니, 아래의 그래프와 같이 똑바로 풀었습니다.
단순한 선형 문제이기 때문에 이것으로 잘 가는지, 아니면 회귀 문제는 이것으로 정답인지는 좀 더 시도해 보겠습니다.
Reference
이 문제에 관하여(Keras에서 Autoencoder를 사용하여 간단한 문제로 시도했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/cessna373/items/641c4bbcc0065cd05538
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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으로 했더니, 아래의 그래프와 같이 똑바로 풀었습니다.
단순한 선형 문제이기 때문에 이것으로 잘 가는지, 아니면 회귀 문제는 이것으로 정답인지는 좀 더 시도해 보겠습니다.
Reference
이 문제에 관하여(Keras에서 Autoencoder를 사용하여 간단한 문제로 시도했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/cessna373/items/641c4bbcc0065cd05538
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Keras에서 Autoencoder를 사용하여 간단한 문제로 시도했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/cessna373/items/641c4bbcc0065cd05538텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)