Обучил замысловатый автоэнкодер. Теперь нужна помощь в извлечении пространства функций - PullRequest
0 голосов
/ 14 февраля 2020

Я построил автоэнкодер, используя собственный набор данных из примерно 32 тыс. Изображений. Я сделал разделение 75/25 для обучения / тестирования, и я смог получить результаты, которыми я доволен.

Теперь я хочу иметь возможность извлекать пространство объектов и сопоставлять их с каждым изображением в моем набор данных и новые данные, которые не были проверены. Я не смог найти учебник в Интернете, который углубился в использование кодера в качестве пространства функций. Все, что я мог найти, это построить полную сеть.

Мой код:

> input_img = Input(shape=(200, 200, 1))
# encoder part of the model (increased filter lyaer after each filter)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)

# decoder part of the model (went backwards from the encoder)
x = Conv2D(128, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
decoded = Cropping2D(cropping=((8,0), (8,0)), data_format=None)(x)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
autoencoder.summary()

Вот мои настройки net, если кому-то интересно:

Model: "model_22"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_23 (InputLayer)        (None, 200, 200, 1)       0         
_________________________________________________________________
conv2d_186 (Conv2D)          (None, 200, 200, 16)      160       
_________________________________________________________________
max_pooling2d_83 (MaxPooling (None, 100, 100, 16)      0         
_________________________________________________________________
conv2d_187 (Conv2D)          (None, 100, 100, 32)      4640      
_________________________________________________________________
max_pooling2d_84 (MaxPooling (None, 50, 50, 32)        0         
_________________________________________________________________
conv2d_188 (Conv2D)          (None, 50, 50, 64)        18496     
_________________________________________________________________
max_pooling2d_85 (MaxPooling (None, 25, 25, 64)        0         
_________________________________________________________________
conv2d_189 (Conv2D)          (None, 25, 25, 128)       73856     
_________________________________________________________________
max_pooling2d_86 (MaxPooling (None, 13, 13, 128)       0         
_________________________________________________________________
conv2d_190 (Conv2D)          (None, 13, 13, 128)       147584    
_________________________________________________________________
up_sampling2d_82 (UpSampling (None, 26, 26, 128)       0         
_________________________________________________________________
conv2d_191 (Conv2D)          (None, 26, 26, 64)        73792     
_________________________________________________________________
up_sampling2d_83 (UpSampling (None, 52, 52, 64)        0         
_________________________________________________________________
conv2d_192 (Conv2D)          (None, 52, 52, 32)        18464     
_________________________________________________________________
up_sampling2d_84 (UpSampling (None, 104, 104, 32)      0         
_________________________________________________________________
conv2d_193 (Conv2D)          (None, 104, 104, 16)      4624      
_________________________________________________________________
up_sampling2d_85 (UpSampling (None, 208, 208, 16)      0         
_________________________________________________________________
conv2d_194 (Conv2D)          (None, 208, 208, 1)       145       
_________________________________________________________________
cropping2d_2 (Cropping2D)    (None, 200, 200, 1)       0         
=================================================================
Total params: 341,761
Trainable params: 341,761
Non-trainable params: 0

Тогда мои тренировки:

autoencoder.fit(train, train,
                epochs=3,
                batch_size=128,
                shuffle=True,
                validation_data=(test, test))

Мои результаты:

Train on 23412 samples, validate on 7805 samples
Epoch 1/3
23412/23412 [==============================] - 773s 33ms/step - loss: 0.0620 - val_loss: 0.0398
Epoch 2/3
23412/23412 [==============================] - 715s 31ms/step - loss: 0.0349 - val_loss: 0.0349
Epoch 3/3
23412/23412 [==============================] - 753s 32ms/step - loss: 0.0314 - val_loss: 0.0319

Скорее не делитесь изображениями, но они выглядят хорошо реконструированными.

Спасибо вам за помощь и любую помощь!

1 Ответ

1 голос
/ 14 февраля 2020

Не уверен, что я полностью понимаю ваши вопросы, но хотите ли вы получить результирующее пространство функций для каждого изображения, на котором вы тренировались, а также для других. Почему бы просто не сделать это?

Назовите ваш закодированный слой в архитектуре автоэнкодера как «встраивание». Затем создайте кодировщик следующим образом:

embedding_layer = autoencoder.get_layer(name='embedding').output
encoder = Model(input_img,embedding_layer)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...