Я обучил автокодеру для FontRecognition из бумаги DeepFont . В результате получается странная белая рамка вокруг изображения.
Вот мой код и краткое описание автоэнкодера
autoencoder = Sequential()
autoencoder.add(Conv2D(64, kernel_size=(11,11), strides=2, activation='relu', padding='valid', input_shape=(105,105,1)))
autoencoder.add(MaxPooling2D(pool_size=(2,2), strides=2, padding='same'))
autoencoder.add(Conv2D(128, kernel_size=(1,1), strides=1, activation='relu', padding='same'))
autoencoder.add(Conv2DTranspose(64, kernel_size=(1,1), strides=1, activation='relu', padding='same', kernel_initializer='uniform'))
autoencoder.add(UpSampling2D(size=(2,2)))
autoencoder.add(Conv2DTranspose(1, kernel_size=(11,11), strides=(2,2), activation='relu', padding='valid', kernel_initializer='uniform'))
autoencoder.summary()
autoencoder.compile(optimizer="adam" , loss='mean_squared_error')
X_train = X_train.reshape(len(X_train), 105,105, 1)
X_train = X_train.astype('float64')
X_train /= 255
X_val = X_val.reshape(len(X_val), 105,105, 1)
X_val = X_val.astype('float64')
X_val /= 255
history = autoencoder.fit(X_train, X_train, epochs=50, batch_size=128, shuffle=True, validation_data=(X_val,X_val))
Это резюме.
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 48, 48, 64) 7808
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 24, 24, 64) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 24, 24, 128) 8320
_________________________________________________________________
conv2d_transpose (Conv2DTran (None, 24, 24, 64) 8256
_________________________________________________________________
up_sampling2d (UpSampling2D) (None, 48, 48, 64) 0
_________________________________________________________________
conv2d_transpose_1 (Conv2DTr (None, 105, 105, 1) 7745
=================================================================
Total params: 32,129
Trainable params: 32,129
Non-trainable params: 0
_________________________________________________________________
Я обучил AE для размер партии 128 и 50 эпох с использованием Google Colab. Результат для последних эпох - loss - 0.0043
и val_loss - 0.0043
Итак, я запустил этот код для построения графика
decoded_imgs = autoencoder.predict(X_val)
n = 10
plt.figure(figsize=(20, 4))
for i in range(n):
# display original
ax = plt.subplot(2, n, i+1)
plt.imshow(X_val[i+10].reshape(105, 105))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
# display reconstruction
ax = plt.subplot(2, n, i + n +1)
plt.imshow(decoded_imgs[i+10].reshape(105, 105))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()
, и в результате получились изображения с наложенной белой рамкой. Есть идеи, как это происходит? вот результат изображения