#python #tensorflow #keras #conv-neural-network #autoencoder
#python #tensorflow #keras #conv-нейронная сеть #автоэнкодер
Вопрос:
Я взял большую часть этого кода отсюда. Я очень новичок в автоэнкодерах.
Вот код:
input_img = keras.Input(shape=(64, 55,1))
x = keras.layers.Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = keras.layers.MaxPooling2D((2, 2), padding='same')(x)
x = keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = keras.layers.MaxPooling2D((2, 2), padding='same')(x)
x = keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = keras.layers.MaxPooling2D((2, 2), padding='same')(x)
x = keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = keras.layers.UpSampling2D((2, 2))(x)
x = keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = keras.layers.UpSampling2D((2, 2))(x)
x = keras.layers.Conv2D(16, (3, 3), activation='relu',padding='same')(x)
x = keras.layers.UpSampling2D((2, 2))(x)
decoded = keras.layers.Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
autoencoder = keras.Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
onlyfiles = [f for f in listdir("newnew") if isfile(join("newnew", f))][:2000]
lis=[]
for i in onlyfiles:
image = Image.open('newnew/' i)
data = np.asarray(image)
lis.append(data)
lis = np.array(lis)
lis = lis.astype("float32")
lis = lis / np.max(lis)
print(lis.shape)
lis = lis.reshape((len(lis),64,55,1))
print(lis.shape)
test = lis[:100]
train = lis[100:]
autoencoder.fit(train,train,
epochs=50,
batch_size=128,
shuffle=True,
validation_data=(test,test))
Поскольку я просто пытался запустить код, я ограничил его только 2000 изображениями.
Для контекста изображения имеют оттенки серого и уже 55×64.
Получаемое мной сообщение об ошибке:
Ошибка значения: логиты и метки должны иметь одинаковую форму ((Нет, 64, 56, 1) против (Нет, 64, 55, 1))
Прочитав похожие проблемы при переполнении стека, я уже внес одно изменение на веб-сайт, с которого я взял автоэнкодер, добавив дополнение padding='same'
к одной из строк, в которой оно отсутствовало. Я считаю, что корень проблемы находится где-то в слоях, потому что изначально перед добавлением дополнительного «padding = same» в сообщении об ошибке говорилось:
Ошибка значения: логиты и метки должны иметь одинаковую форму ((Нет, 60, 52, 1) против (Нет, 64, 55, 1))
К сожалению, как я уже сказал, я новичок в автоэнкодерах и до сих пор не до конца понимаю все числа в слоях. Любая помощь будет оценена по достоинству 🙂
Ответ №1:
Поскольку выходные данные автоэнкодера совпадают с входными данными, входные и выходные формы должны быть одинаковыми. Входная форма в вашей модели равна (None, 64, 55,1), а выходная форма равна (None, 64, 56, 1), что приводит к ошибке.
Чтобы преодолеть это, добавьте в модель слой Cropping2D, как показано ниже.
input_img = keras.Input(shape=(64, 55,1))
x = keras.layers.Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = keras.layers.MaxPooling2D((2, 2), padding='same')(x)
x = keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = keras.layers.MaxPooling2D((2, 2), padding='same')(x)
x = keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = keras.layers.MaxPooling2D((2, 2), padding='same')(x)
x = keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = keras.layers.UpSampling2D((2, 2))(x)
x = keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = keras.layers.UpSampling2D((2, 2))(x)
x = keras.layers.Conv2D(16, (3, 3), activation='relu',padding='same')(x)
x = keras.layers.UpSampling2D((2, 2))(x)
decoded = keras.layers.Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
decoded= keras.layers.Cropping2D(((0,0),(0,1)))(decoded)
autoencoder = keras.Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
autoencoder.summary()
Вывод:
Model: "model_11"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_15 (InputLayer) [(None, 64, 55, 1)] 0
conv2d_98 (Conv2D) (None, 64, 55, 16) 160
max_pooling2d_42 (MaxPoolin (None, 32, 28, 16) 0
g2D)
conv2d_99 (Conv2D) (None, 32, 28, 8) 1160
max_pooling2d_43 (MaxPoolin (None, 16, 14, 8) 0
g2D)
conv2d_100 (Conv2D) (None, 16, 14, 8) 584
max_pooling2d_44 (MaxPoolin (None, 8, 7, 8) 0
g2D)
conv2d_101 (Conv2D) (None, 8, 7, 8) 584
up_sampling2d_42 (UpSamplin (None, 16, 14, 8) 0
g2D)
conv2d_102 (Conv2D) (None, 16, 14, 8) 584
up_sampling2d_43 (UpSamplin (None, 32, 28, 8) 0
g2D)
conv2d_103 (Conv2D) (None, 32, 28, 16) 1168
up_sampling2d_44 (UpSamplin (None, 64, 56, 16) 0
g2D)
conv2d_104 (Conv2D) (None, 64, 56, 1) 145
cropping2d_13 (Cropping2D) (None, 64, 55, 1) 0
=================================================================
Total params: 4,385
Trainable params: 4,385
Non-trainable params: 0
_________________________________________________________________