簡體   English   中英

自動編碼器輸入形狀:預期 input_1 的形狀為 (256, 256, 3) 但得到的數組形狀為 (256, 256, 4)

[英]Autoencoder input shape: expected input_1 to have shape (256, 256, 3) but got array with shape (256, 256, 4)

我正在嘗試構建一個自動編碼器,但我收到以下錯誤,我不知道為什么。

ValueError:檢查輸入時出錯:預期 input_1 的形狀為 (256, 256, 3) 但得到的數組的形狀為 (256, 256, 4)

如果我打印圖像形狀,我會得到 (256, 256, 3) 但我仍然會收到關於形狀的錯誤。

任何幫助都會很棒。

Ubuntu 18.04 | Python 3.7.6 | Tensorflow 2.1


from tensorflow.keras.layers import Input, Dense, Conv2D, MaxPooling2D, Dropout, Conv2DTranspose, UpSampling2D, add
from tensorflow.keras.models import Model
from tensorflow.keras import regularizers

import os
import re
from scipy import ndimage, misc
from skimage.transform import resize, rescale
from matplotlib import pyplot
import numpy as np

#Functions

def train_batches(just_load_dataset=False):

    batches = 256 # Number of images to have at the same time in a batch

    batch = 0 # Number if images in the current batch (grows over time and then resets for each batch)
    batch_nb = 0 # Batch current index

    max_batches = -1 # If you want to train only on a limited number of images to finish the training even faster.

    ep = 4 # Number of epochs

    images = []
    x_train_n = []
    x_train_down = []

    x_train_n2 = [] # Resulting high res dataset
    x_train_down2 = [] # Resulting low res dataset

    for root, dirnames, filenames in os.walk(input_dir):
        for filename in filenames:
            if re.search("\.(jpg|jpeg|JPEG|png|bmp|tiff)$", filename):
                if batch_nb == max_batches: # If we limit the number of batches, just return earlier
                    return x_train_n2, x_train_down2
                filepath = os.path.join(root, filename)
                image = pyplot.imread(filepath)

                if len(image.shape) > 2:

                    image_resized = resize(image, (256, 256))
                    x_train_n.append(image_resized)
                    x_train_down.append(rescale(rescale(image_resized, 0.5), 2.0))
                    batch += 1
                    if batch == batches:
                        batch_nb += 1

                        x_train_n2 = np.array(x_train_n)
                        x_train_down2 = np.array(x_train_down)

                        if just_load_dataset:
                            return x_train_n2, x_train_down2

                        print('Training batch', batch_nb, '(', batches, ')')

                        autoencoder.fit(x_train_down2, x_train_n2, epochs=ep, batch_size=10, shuffle=True, validation_split=0.15)

                        x_train_n = []
                        x_train_down = []

                        batch = 0

    return x_train_n2, x_train_down2

#Script

input_dir="/mnt/vanguard/datasets/ffhq-dataset/thumbnails256x256"

n = 256
chan = 3
input_img = Input(shape=(n, n, chan))


# Encoder
l1 = Conv2D(64, (3, 3), padding='same', activation='relu', activity_regularizer=regularizers.l1(10e-10))(input_img)
l2 = Conv2D(64, (3, 3), padding='same', activation='relu', activity_regularizer=regularizers.l1(10e-10))(l1)
l3 = MaxPooling2D(padding='same')(l2)
l3 = Dropout(0.3)(l3)
l4 = Conv2D(128, (3, 3),  padding='same', activation='relu', activity_regularizer=regularizers.l1(10e-10))(l3)
l5 = Conv2D(128, (3, 3), padding='same', activation='relu', activity_regularizer=regularizers.l1(10e-10))(l4)
l6 = MaxPooling2D(padding='same')(l5)
l7 = Conv2D(256, (3, 3), padding='same', activation='relu', activity_regularizer=regularizers.l1(10e-10))(l6)

# Decoder
l8 = UpSampling2D()(l7)
l9 = Conv2D(128, (3, 3), padding='same', activation='relu', activity_regularizer=regularizers.l1(10e-10))(l8)
l10 = Conv2D(128, (3, 3), padding='same', activation='relu', activity_regularizer=regularizers.l1(10e-10))(l9)
l11 = add([l5, l10])
l12 = UpSampling2D()(l11)
l13 = Conv2D(64, (3, 3), padding='same', activation='relu', activity_regularizer=regularizers.l1(10e-10))(l12)
l14 = Conv2D(64, (3, 3), padding='same', activation='relu', activity_regularizer=regularizers.l1(10e-10))(l13)
l15 = add([l14, l2])

#chan = 3, for RGB
decoded = Conv2D(chan, (3, 3), padding='same', activation='relu', activity_regularizer=regularizers.l1(10e-10))(l15)

# Create neural network
autoencoder = Model(input_img, decoded)
autoencoder_hfenn = Model(input_img, decoded)
autoencoder.summary()

autoencoder.compile(optimizer='adadelta', loss='mean_squared_error')

x_train_n = []
x_train_down = []
x_train_n, x_train_down = train_batches()

重新縮放x_train_down.append(rescale(rescale(image_resized, 0.5), 2.0))導致問題。 OpenCV 可用於降低圖像質量:

small = cv2.resize(image_resized, (0,0), fx=0.5, fy=0.5)
large = cv2.resize(small, (0,0), fx=2.0, fy=2.0)

另請注意,這是 GPU 密集型計算。 要么減小圖像尺寸,要么嘗試使用更多 memory (K80) 的 GPU。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM