2017-06-08 17 views
5

Tôi đã theo hướng dẫn "Xây dựng Autoencoders trong Keras": https://blog.keras.io/building-autoencoders-in-keras.htmlLàm thế nào để giải mã mã hóa dữ liệu từ autoencoder sâu trong Keras (unclarity trong hướng dẫn)

Đầu tiên, đơn giản, giải pháp hoạt động tốt. Nhưng trong phần "Deep autoencoder", mã được cung cấp trong hướng dẫn này dường như không hoạt động đầy đủ.

Đây là mã của tôi (chỉ cần đến nơi mà vấn đề xuất hiện), mà chỉ là sao chép từ turorial:

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

encoding_dim = 32 

input_img = Input(shape=(784,)) 
encoded = Dense(128, activation='relu')(input_img) 
encoded = Dense(64, activation='relu')(encoded) 
encoded = Dense(32, activation='relu')(encoded) # Multiple encoding 
decoded = Dense(64, activation='relu')(encoded) # and decoding layers. 
decoded = Dense(128, activation='relu')(decoded) 
decoded = Dense(784, activation='sigmoid')(decoded) 

autoencoder = Model(input_img, decoded) 

encoder = Model(input_img, encoded) 

encoded_input = Input(shape=(encoding_dim,)) 
decoder_layer = autoencoder.layers[-1] 
decoder = Model(encoded_input, decoder_layer(encoded_input)) # Crash happens here. 

tôi nhận được lỗi này:

Traceback (most recent call last): 
    File "keras_test.py", line 20, in <module> 
    decoder = Model(encoded_input, decoder_layer(encoded_input)) # Crash happens here 
    File "/Users/paulmagnus/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/keras/engine/topology.py", line 569, in __call__ 
    self.assert_input_compatibility(inputs) 
    File "/Users/paulmagnus/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/keras/engine/topology.py", line 479, in assert_input_compatibility 
    ' but got shape ' + str(x_shape)) 
ValueError: Input 0 is incompatible with layer dense_6: expected axis -1 of input shape to have value 128 but got shape (None, 32) 

Tôi đoán rằng decoder là kết nối với lớp giải mã sai và/hoặc hình dạng đầu vào hoặc đầu ra của nó sai. Nhưng tôi nên làm gì với nó?

decoder không cần thiết để autoencoder hoạt động. Tôi có thể thực hiện việc học và mã hóa các hình ảnh theo phần còn lại của hướng dẫn. Nhưng không có decoder Tôi không thể giải mã hình ảnh về định dạng ban đầu để xem chúng có thực sự tốt hay không. Các hướng dẫn không đề cập đến bất cứ điều gì về điều này và chỉ hiển thị các hình ảnh giải mã mà không có một từ. Tôi đoán tác giả giả định bất kỳ thay đổi nào ông đã làm cho decoder để đạt được điều này là tầm thường.

Để làm rõ: phiên bản đơn lớp hoạt động tốt, nơi thay vì 3 mã hóa và giải mã 3 lớp chúng tôi chỉ có

encoded = Dense(32, activation='relu')(input_img) 
decoded = Dense(784, activation='sigmoid')(encoded) 

và mọi thứ khác tương đương như trên. Sau đó, không có lỗi và tôi có thể sử dụng decoder để tạo lại hình ảnh.

+0

Xin chào PaulMag; Tôi nghĩ câu hỏi của bạn có liên quan đến mã và về gỡ lỗi thiết lập mô hình Keras của bạn, không quá nhiều về thống kê hoặc kỹ thuật học tập sâu. Nếu vậy, nó có liên quan tốt hơn về mặt địa lý với "nhiệm vụ" của StackOverflow, không phải CrossValidated. – fnl

+0

@fnl Có, bạn là chính xác. Tôi không chắc chắn về nền tảng nào để hỏi điều này. Tôi có nên repost nó trên StackOverflow và xóa nó khỏi CrossValidated? – PaulMag

+1

Tôi chỉ tìm ra rằng di cư là một điều. Tôi đã gắn cờ câu hỏi này để di chuyển sang StackOverflow. – PaulMag

Trả lời

11
decoder_layer = autoencoder.layers[-1] 
decoder = Model(encoded_input, decoder_layer(encoded_input)) 

Mã này làm việc cho đơn lớp bởi vì chỉ có lớp cuối cùng là bộ giải mã trong trường hợp này và

decoder_layer = autoencoder.layers[-1] 

dòng này đòi hỏi lớp cuối cùng.

cho bộ mã hóa và bộ giải mã 3 lớp, bạn phải gọi tất cả 3 lớp để xác định bộ giải mã. tôi đã làm cùng một hướng dẫn vì vậy tôi đã viết mã như thế này.

encoded_input = Input(shape=(encoding_dim,)) 

deco = autoencoder.layers[-3](encoded_input) 
deco = autoencoder.layers[-2](deco) 
deco = autoencoder.layers[-1](deco) 
# create the decoder model 
decoder = Model(encoded_input, deco). 

nó hoạt động tốt ngay bây giờ.

+0

Cảm ơn bạn. Nó có ý nghĩa, nhưng tôi sẽ không đoán được. Tôi nghĩ chúng tôi đã liên kết những lớp đó với nhau. Đó là một lỗ hổng lớn trong hướng dẫn. – PaulMag

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