2016-10-18 5 views
1

크기의 희소 행렬을 재현하기 위해 Keras 딥 자동 인코딩을 사용하고 있습니다. 각 행은 단백질 서열에 대한 트라이 그램 수입니다. 이 매트릭스에는 2 가지 종류의 단백질이 있지만 처음에는 네트워크가 무식하기를 원합니다. 그래서 자동 녹음기를 사용하고 있습니다. 나는 이것을 위해 keras blog autoencoder 튜토리얼을 따라 가고있다.Keras 딥 자동 인코딩 예측이 정확하지 않습니다.

이 내 코드 -

# this is the size of our encoded representations 
encoding_dim = 32 

input_img = Input(shape=(6860,)) 
encoded = Dense(128, activation='relu', activity_regularizer=regularizers.activity_l1(10e-5))(input_img) 
encoded = Dense(64, activation='relu')(encoded) 
encoded = Dense(32, activation='relu')(encoded) 

decoded = Dense(64, activation='relu')(encoded) 
decoded = Dense(128, activation='relu')(decoded) 
decoded = Dense(6860, activation='sigmoid')(decoded) 

autoencoder = Model(input=input_img, output=decoded) 

# this model maps an input to its encoded representation 
encoder = Model(input=input_img, output=encoded) 

# create a placeholder for an encoded (32-dimensional) input 
encoded_input_1 = Input(shape=(32,)) 
encoded_input_2 = Input(shape=(64,)) 
encoded_input_3 = Input(shape=(128,)) 

# retrieve the last layer of the autoencoder model 
decoder_layer_1 = autoencoder.layers[-3] 
decoder_layer_2 = autoencoder.layers[-2] 
decoder_layer_3 = autoencoder.layers[-1] 

# create the decoder model 
decoder_1 = Model(input = encoded_input_1, output = decoder_layer_1(encoded_input_1)) 
decoder_2 = Model(input = encoded_input_2, output = decoder_layer_2(encoded_input_2)) 
decoder_3 = Model(input = encoded_input_3, output = decoder_layer_3(encoded_input_3)) 

autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy') 

autoencoder.fit(x_train, x_train, 
       nb_epoch= 100, 
       batch_size=40, 
       shuffle=True, 
       validation_data=(x_test, x_test)) 

내 검증 세트 차원이 [80, 6860]입니다. 문제는 디코더를 사용하여 테스트 세트를 예측하면 내 예측이 실제로 꺼지는 것입니다. 값이없는 경우 예를 들어 나는 autoencoder의 예측의 제로가 같은 행에 대해

[ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 2. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

를 이용하는 기기 내 테스트 세트의 다음과 같은 코드 -

# encode and decode some digits 
# note that we take them from the *test* set 
encoded_imgs = encoder.predict(x_test) 
decoded_imgs = decoder_1.predict(encoded_imgs) 
decoded_imgs = decoder_2.predict(decoded_imgs) 
decoded_imgs = decoder_3.predict(decoded_imgs) 

print x_test[3, np.where(x_test[3, :] != 0)[0]] 
print (decoded_imgs[3, np.where(x_test[3, :] != 0)[0]]) 

단일 행 예측할 경우 같은 지수 어쩌면 내가 어떤 종류를 사용할 수 있습니다, 내가 생각 첫째, 지금

[ 0.04615583 0.04613763 0.10268984 0.00286385 0.0030572 0.02551027 0.00552908 0.09686473 0.02554915 0.0082816 0.02254158 0.01127195 0.00305908 0.17113154 0.01140419 0.03370495 0.00515486 0.02614204 0.00558715 0.02835727 0.0029659 0.01425297 0.00834536 0.04502939 0.02260707 0.01131396 0.00561662 0.01131314 0.00493734 0.00265232 0.0056083 0.01724379 0.06099484 0.03738695 0.01128869 0.01995548 0.00562622 0.00556281 0.01732991 0.03142899 0.05339266 0.04778111 0.00292415 0.02264618 0.01419865 0.00550648 0.00836777 0.01139715]

을 입었네 이 값들로부터 1을 얻기 위해 thresholding. 그러나 그들은 꽤 무작위 인 것으로 보인다. 하나의 행에 대해, 내 테스트 세트의 처음 50 개 0 값을 위해, 내 autoencoder는

[ 0.14251608 0.00118295 0.00118732 0.00304095 0.031255 0.00108441 0.0201351 0.00853934 0.00558488 0.00281343 0.00296877 0.00109651 0.01129742 0.00827519 0.0170884 0.01417614 0.01714166 0.00549215 0.00099755 0.00558552 0.00829634 0.01988331 0.00092845 0.00294271 0.01429107 0.01137067 0.01137967 0.01121876 0.00491931 0.00562285 0.0055124 0.01720702 0.0142925 0.00553411 0.00551252 0.00281541 0.01145663 0.002876 0.00555185 0.00525392 0.01421779 0.00273949 0.01698892 0.02529835 0.0112521 0.01130333 0.00554186 0.00291986 0.00554437 0.01144382]

은 어떻게 예측을 향상시킬 수 predicts-? 여기서 내가 뭘 잘못하고 있니? 나는 그 자료가 아주 희박하다는 말을해야한다. 원하는 경우 here에서 장난감 데이터를 다운로드 할 수 있습니다. 궁금한 점이 있으면 알려주세요.

+0

안녕하세요, 누적 자동 엔코더가 3 개의 인코딩 레이어와 3 개의 디코딩 레이어를 가지고 있기 때문에 왜 테스트 섹션에 1 개의 인코더와 3 개의 디코더가 있는지 궁금합니다. –

+0

손실 기능은 어떻게 생겼습니까? – Arturo

답변

7

가장 중요한 이유 중 하나는 아마도 훈련 데이터 크기가 너무 작을 수 있습니다. 당신은 완전히 연결된 네트워크를 가지고 있으며 따라서 7 개의 레이어 (입력과 출력 포함)로 매개 변수의 수는 1.8M에 가깝습니다. 360 개의 교육 샘플 만 있습니다. 기본적으로 매개 변수는 훈련받지 않습니다.

두 가지 방법으로 작업을 향상시킬 수 있습니다. 하나는 물론 더 많은 교육 데이터를 얻는 것입니다. 두 번째 방법은 튜토리얼의 뒷부분에서 CNN 예제를 따르는 것입니다. CNN은 매개 변수의 수를 크게 줄일 수 있기 때문에 널리 사용되었습니다.

관련 문제