ожидается, что conv2d_7 будет иметь форму (4, 268, 1), но получит массив с формой (1, 270, 480) - PullRequest
1 голос
/ 19 марта 2019

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

Код:

def model_build():
input_img = InputLayer(shape=(1, env_size()[1], env_size()[0]))
x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(32, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
model = Model(input_img, decoded)
return model
if __name__ == '__main__':
    model = model_build()
    model.compile('adam', 'mean_squared_error')
    y = np.array([env()])
    print(y.shape)
    print(y.ndim)
    debug = model.fit(np.array([[env()]]), np.array([[env()]]))

Ошибка:

Traceback (последний вызов был последним): Файл "/ home / ai / Desktop / algernon-test / rewarders.py ", строка 46, в debug = model.fit (файл np.array ([[env ()]]), файл np.array ([[env ()]]))" / home / ai /.local / lib / python3.6 / site-packages / keras / engine / training.py ", строка 952, в файл fit batch_size = batch_size)" /home/ai/.local/lib/python3.6/site-packages/keras/engine/training.py ", строка 789, в _standardize_user_data exception_prefix = 'target') Файл" /home/ai/.local/lib/python3.6/site-packages/keras/engine/training_utils.py ",строка 138, в standardize_input_data str (data_shape)) ValueError: Ошибка при проверке цели: ожидалось, что conv2d_7 будет иметь форму (4, 268, 1), но получил массив с формой (1, 270, 480)

РЕДАКТИРОВАТЬ:

Код для get_screen, импортированный как env ():

def get_screen():
    img = screen.grab()
    img = img.resize(screen_size())
    img = img.convert('L')
    img = np.array(img)
    return img

1 Ответ

1 голос
/ 20 марта 2019

Похоже, env_size() и env() размеры изображения беспорядка как-то. Рассмотрим этот пример:

image1 = np.random.rand(1, 1, 270, 480) #First dimension is batch size for test purpose
image2 = np.random.rand(1, 4, 268, 1) #Or any other arbitrary dimensions

input_img = layers.Input(shape=image1[0].shape)
x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = layers.UpSampling2D((2, 2))(x)
x = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = layers.UpSampling2D((2, 2))(x)
x = layers.Conv2D(32, (3, 3), activation='relu')(x)
x = layers.UpSampling2D((2, 2))(x)
decoded = layers.Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
model = tf.keras.Model(input_img, decoded)
model.compile('adam', 'mean_squared_error')
model.summary()

Эта строка будет работать:

model.fit(image1, nb_epoch=1, batch_size=1)

Но это не

model.fit(image2, nb_epoch=1, batch_size=1)

Edit: Чтобы получить выходные данные того же размера, что и входные данные, необходимо тщательно рассчитать размер ядра свертки. image1 = np.random.rand (1, 1920, 1080, 1)

input_img = layers.Input(shape=image1[0].shape)
x = layers.Conv2D(32, 3, activation='relu', padding='same')(input_img)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(16, 3, activation='relu', padding='same')(x)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(8, 3, activation='relu', padding='same')(x)
encoded = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(8, 3, activation='relu', padding='same')(encoded)
x = layers.UpSampling2D((2, 2))(x)
x = layers.Conv2D(16, 3, activation='relu', padding='same')(x)
x = layers.UpSampling2D((2, 2))(x)
x = layers.Conv2D(32, 1, activation='relu')(x) # set kernel size to 1 for example
x = layers.UpSampling2D((2, 2))(x)
decoded = layers.Conv2D(1, 3, activation='sigmoid', padding='same')(x)
model = tf.keras.Model(input_img, decoded)
model.compile('adam', 'mean_squared_error')
model.summary()

Это выведет те же размеры.

Согласно данному руководству http://cs231n.github.io/convolutional-networks/

Мы можем вычислить пространственный размер выходного объема как функцию размер входного тома (W), размер рецептивного поля слоя Conv нейроны (F), шаг, с которым они применяются (S), и количество использованного дополнения нулями (P) на границе. Вы можете убедить Сами то, что правильная формула для расчета сколько нейронов «Соответствие» задается как (W-F + 2P) / S + 1 . Например, для входа 7x7 и 3x3 отфильтровывая шаг 1 и площадку 0, мы получили бы выход 5x5. С шагом 2 мы бы получили выход 3х3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...