2016-06-10 21 views
7

Tôi đang cố gắng theo Bộ mã hóa tự động sâu Két example. Tôi nhận được một ngoại lệ không khớp, nhưng đối với cuộc sống của tôi, tôi không thể hiểu tại sao. Nó hoạt động khi tôi chỉ sử dụng một kích thước được mã hóa, nhưng không phải khi tôi xếp chúng.Python/Keras/Theano sai kích thước cho bộ mã hóa tự động sâu

Ngoại lệ: Input 0 là không phù hợp với lớp dense_18:
hình dự kiến ​​= (Không, 128), tìm thấy hình = (Không, 32) *

Lỗi này là trên dòng decoder = Model(input=encoded_input, output=decoder_layer(encoded_input))

from keras.layers import Dense,Input 
from keras.models import Model 

import numpy as np 

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

#NPUT LAYER 
input_img = Input(shape=(784,)) 

#ENCODE LAYER 
# "encoded" is the encoded representation of the input 
encoded = Dense(encoding_dim*4, activation='relu')(input_img) 
encoded = Dense(encoding_dim*2, activation='relu')(encoded) 
encoded = Dense(encoding_dim, activation='relu')(encoded) 

#DECODED LAYER 
# "decoded" is the lossy reconstruction of the input 
decoded = Dense(encoding_dim*2, activation='relu')(encoded) 
decoded = Dense(encoding_dim*4, activation='relu')(decoded) 
decoded = Dense(784, activation='sigmoid')(decoded) 

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


#SEPERATE ENCODER MODEL 
encoder = Model(input=input_img, output=encoded) 

# create a placeholder for an encoded (32-dimensional) input 
encoded_input = Input(shape=(encoding_dim,)) 

# retrieve the last layer of the autoencoder model 
decoder_layer = autoencoder.layers[-1] 

# create the decoder model 
decoder = Model(input=encoded_input, output=decoder_layer(encoded_input)) 

#COMPILER 
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy') 
+0

Thật tuyệt vời khi hầu hết mọi người đấu tranh ở cùng một điểm. Cảm ơn bạn đã chia sẻ –

+0

https://stackoverflow.com/questions/47842931/valueerror-error-when-checking-target-expected-model-2-to-have-shape-none-25 bất kỳ đề xuất nào? –

Trả lời

7

Cảm ơn gợi ý từ Marcin. Hóa ra tất cả các lớp giải mã cần phải được unrolled để làm cho nó hoạt động.

# retrieve the last layer of the autoencoder model 
decoder_layer1 = autoencoder.layers[-3] 
decoder_layer2 = autoencoder.layers[-2] 
decoder_layer3 = autoencoder.layers[-1] 

# create the decoder model 
decoder = Model(input=encoded_input, output=decoder_layer3(decoder_layer2(decoder_layer1(encoded_input)))) 
+2

bằng tiếng Anh đơn giản, 'unrolling' có nghĩa là gì? Tôi giả sử các lớp bằng cách sử dụng hàm chức năng Keras được liên kết chính xác, vì vậy việc sử dụng lớp cuối cùng chỉ hoạt động. Bất cứ ai sẵn sàng đưa ra một lời giải thích đơn giản? – OHTO

+1

Cái cuối cùng sẽ không hoạt động vì bạn cần cái gì đó sẽ biến đổi một vector kích thước 'encoding_dim' thành một vectơ của kích thước 784. decoder_layer3 đơn lẻ đi từ encoding_dim * 4 đến 784. decoder_layer1 đơn thuần đi từ encoding_dim sang encoding_dim * 2. – Borbag

+0

https://stackoverflow.com/questions/47842931/valueerror-error-when-checking-target-expected-model-2-to-have-shape-none-25 bất kỳ đề xuất nào? –

2

vấn đề nằm ở chỗ:

# retrieve the last layer of the autoencoder model 
decoder_layer = autoencoder.layers[-1] 

Trong mô hình trước đó - lớp cuối cùng là lớp bộ giải mã duy nhất. Vì vậy, nó đầu vào cũng là một đầu vào cho bộ giải mã. Nhưng ngay bây giờ bạn có 3 lớp giải mã, do đó bạn phải quay lại lớp đầu tiên để có được bộ giải mã lớp đầu tiên. Vì vậy, thay đổi dòng này thành:

# retrieve the last layer of the autoencoder model 
decoder_layer = autoencoder.layers[-3] 

Nên thực hiện công việc.

+0

Tôi không nghĩ rằng điều này sẽ làm việc, bạn không cần phải áp dụng các chuyển đổi từ mỗi lớp bộ giải mã, không chỉ là người đầu tiên? – memo

+0

Thực tế - với phiên bản 'keras 1.1.1', giải pháp của tôi hoạt động hoàn hảo. Và đây là phiên bản mà tôi đã sử dụng vào lúc này. Vì vậy, nhận xét của bạn không hợp lệ. –

+0

Rất lạ, với keras 2.0.3 nó không hoạt động. Nhưng tôi cũng không hiểu nó có thể hoạt động như thế nào, ngay cả với keras 1.x. Nếu bạn xây dựng một mô hình bộ giải mã với 'decoder = Model (encoded_input, autoencoder.layers [-3] (encoded_input))' bạn chỉ áp dụng phép biến đổi từ một lớp đơn. Để xây dựng mô hình bộ giải mã đầy đủ, bạn cần phải áp dụng các biến đổi từ mọi lớp (trong bit bộ giải mã), hoặc theo cách thủ công, như @chris đã thực hiện hoặc tự động, như tôi đã thực hiện bên dưới. Hoặc có lẽ tôi đã hiểu lầm cú pháp của API chức năng. – memo

-1

Bạn cần áp dụng phép biến đổi từ mỗi lớp bộ giải mã sang lớp trước. Bạn có thể hủy đăng ký và mã hóa theo cách thủ công những câu hỏi này như trong câu trả lời được chấp nhận hoặc vòng lặp sau đây nên xử lý câu trả lời:

# create a placeholder for an encoded (32-dimensional) input 
encoded_input = Input(shape=(encoding_dim,)) 

# retrieve the decoder layers and apply to each prev layer 
num_decoder_layers = 3 
decoder_layer = encoded_input 
for i in range(-num_decoder_layers, 0): 
    decoder_layer = autoencoder.layers[i](decoder_layer) 

# create the decoder model 
decoder = Model(encoded_input, decoder_layer) 
+0

https://stackoverflow.com/questions/47842931/valueerror-error-when-checking-target-expected-model-2-to-have-shape-none-25/47847014#47847014 bất kỳ đề xuất nào –

Các vấn đề liên quan