Сверточный автоэнкодер Python Keras. Ошибка значения: логиты и метки должны иметь одинаковую форму

#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
_________________________________________________________________