Ошибка при проверке цели: ожидаемая форма для conv2d_transpose

Я хочу реализовать автоматический кодировщик для набора данных Faces с помощью Keras. Я использовал train_on_batch, потому что набор данных слишком велик, но я столкнулся с этой проблемой:

for i in range(10):
    batch_index = 0
    while batch_index <= train_data.batch_index:
        data = train_data.next()
        result = train_result.next()
        model.train_on_batch(data[0],result[0])
        batch_index = batch_index + 1
          ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent     call last)
      <ipython-input-54-d7d64e954a89> in <module>
  4         data = train_data.next()
  5         result = train_result.next()
----> 6         model.train_on_batch(data[0],result[0])
  7         batch_index = batch_index + 1

~/.local/lib/python3.5/site-packages/keras/engine/training.py in     train_on_batch(self, x, y, sample_weight, class_weight)
   1209             x, y,
   1210             sample_weight=sample_weight,
-> 1211             class_weight=class_weight)
   1212         if self._uses_dynamic_learning_phase():
   1213             ins = x + y + sample_weights + [1.]

     ~/.local/lib/python3.5/site-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)
787                 feed_output_shapes,
788                 check_batch_axis=False,  # Don't enforce the batch size.
--> 789                 exception_prefix='target')
    790 
    791             # Generate sample-wise weight values given the     `sample_weight` and

~/.local/lib/python3.5/site-packages/keras/engine/training_utils.py in              standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
136                             ': expected ' + names[i] + ' to have shape ' +
137                             str(shape) + ' but got array with shape ' +
--> 138                             str(data_shape))
    139     return data
    140 

ValueError: Error when checking target: expected conv2d_transpose_21 to      have shape (250, 250, 1) but got array with shape (250, 250, 3)

Моя модель такая же, как у собрата:

Input_Layer = keras.Input((250,250,3))
x = keras.layers.Conv2D(20,5,activation='relu')(Input_Layer)
x = keras.layers.MaxPooling2D(2)(x)
x = keras.layers.Conv2D(20,2,activation = 'relu')(x)
x = keras.layers.MaxPooling2D(2)(x)
encoded = x
x = keras.layers.UpSampling2D(2)(x)
x = keras.layers.Conv2DTranspose(20,2,activation='relu')(x)
x = keras.layers.UpSampling2D(2)(x)
x = keras.layers.Conv2DTranspose(20,5,activation= 'relu')(x)
model = keras.Model(input = Input_Layer ,output = x)

Я загружаю изображения с помощью keras ImageDataGenerator, которые загружаются:

train_data = trainGenerator.flow_from_directory('lfw',batch_size=67,target_size=(250, 250))
Found 13199 images belonging to 1 classes.

Вот весь код

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
import matplotlib.pyplot as plt
import numpy as np
import keras

def cutHalf(img):
    for j in range(125):
        for i in range(250):
            img[i][j][0]=1
            img[i][j][1]=1
            img[i][j][2]=1
    return img

img_width = 250
img_height = 250
train_datagen = ImageDataGenerator(rescale=1./255)
train_datagen2 = ImageDataGenerator(rescale=1./255,preprocessing_function=cutHalf)

train_generator = train_datagen.flow_from_directory(
        'lfw',target_size=(img_width, img_height),
        class_mode=None)
train_generator2 = train_datagen2.flow_from_directory(
        'lfw',target_size=(img_width, img_height),
        class_mode=None)

def fixed_generator(generator,generator2):
    batch_index = 0
    while batch_index <= generator.batch_index:
        yield (generator.next(), generator2.next())

Input_Layer = keras.Input(shape=(img_width, img_height,3))
x = keras.layers.Conv2D(20,5,activation='relu')(Input_Layer)
x = keras.layers.MaxPooling2D(2)(x)
x = keras.layers.Conv2D(20,2,activation = 'relu')(x)
x = keras.layers.MaxPooling2D(2)(x)
encoded = x
x = keras.layers.UpSampling2D(2)(x)
x = keras.layers.Conv2DTranspose(20,2,activation='relu')(x)
x = keras.layers.UpSampling2D(2)(x)
x = keras.layers.Conv2DTranspose(20,5,activation= 'relu')(x)
model = keras.Model(input = Input_Layer ,output = x)

model.compile(optimizer='adam', 
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit_generator(
        fixed_generator(train_generator,train_generator2),
        nb_epoch=20,
        steps_per_epoch=50
        )

person Abdeslem SMAHI    schedule 12.02.2019    source источник
comment
Если ваши данные имеют 3 канала, выход вашей модели должен иметь 3 канала. Проверьте количество фильтров последнего слоя.   -  person Daniel Möller    schedule 12.02.2019
comment
Как я могу это сделать?   -  person Abdeslem SMAHI    schedule 12.02.2019
comment
Просто измените количество фильтров для последней конверсии на 3. Сейчас это 1 (хотя вы разместили здесь 20).   -  person Daniel Möller    schedule 12.02.2019
comment
Та же проблема ...   -  person Abdeslem SMAHI    schedule 12.02.2019
comment
Код, который вы разместили здесь, вероятно, не тот код, который вы используете тогда ... вы, вероятно, думаете, что используете одну модель, а можете использовать другую модель ... (проверьте наличие опечаток, заглавных букв, особенно в отношении x и т. Д. )   -  person Daniel Möller    schedule 12.02.2019
comment
Я переписал весь код и все та же проблема   -  person Abdeslem SMAHI    schedule 12.02.2019
comment
Я все еще вижу там 20 вместо 3 (последний Conv2DTranspose слой). --- Но я считаю, что проблема в 'sparse_categorical_crossentropy'. Попробуйте просто 'categorical_crossentropy'.   -  person Daniel Möller    schedule 12.02.2019
comment
Важный совет по производительности в cutHalf. Используйте только img[:250 , :125] = 1   -  person Daniel Möller    schedule 12.02.2019
comment
На самом деле проблема была в sparse_categorial_crossentropy. Спасибо, не могли бы вы показать мне, почему здесь не работает?   -  person Abdeslem SMAHI    schedule 12.02.2019
comment
Я не очень хорошо понимаю разреженные данные, но, похоже, это работает не с целыми тензорами, а с индексами (не уверен, не верьте мне здесь). Когда вы используете разреженную кроссэнтропию, система обычно ожидает данные с 1 функцией вместо обычных.   -  person Daniel Möller    schedule 12.02.2019


Ответы (1)


Я предполагаю, что и train_data.next(), и train_result.next() возвращают массив размером (1,250,250,3).

Когда я попытался запустить ваш код, я получил следующую ошибку:

Отслеживание (последний вызов последний):

Файл "", строка 1, в файле выполнения ('/ Users / lorenzo / Documents / stackoverflow / auto_encoder.py', wdir = '/ Users / lorenzo / Documents / stackoverflow')

Файл "/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", строка 705, в исполняемом файле execfile (имя файла, пространство имен)

Файл "/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", строка 102, в execfile exec (compile (f.read (), filename, 'exec'), namespace)

Файл "/Users/lorenzo/Documents/stackoverflow/auto_encoder.py", строка 43, в model.train_on_batch (onedata, oneresult)

Файл "/anaconda3/lib/python3.6/site-packages/keras/engine/training.py", строка 1211, в train_on_batch class_weight = class_weight)

Файл "/anaconda3/lib/python3.6/site-packages/keras/engine/training.py", строка 789, в _standardize_user_data exception_prefix = 'target')

Файл "/anaconda3/lib/python3.6/site-packages/keras/engine/training_utils.py", строка 138, в строке standardize_input_data (data_shape))

ValueError: Ошибка при проверке цели: ожидалось, что conv2d_transpose_6 будет иметь форму (250, 250, 20), но получил массив с формой (250, 250, 3)

В нем говорится, что ожидаемый целевой размер последнего слоя Conv2DTranspose равен (250, 250, 20), но вы вводите в модель массив формы (250, 250, 3).

Решение: x = keras.layers.Conv2DTranspose(20,5,activation= 'relu')(x) следует изменить на x = keras.layers.Conv2DTranspose(3,5,activation= 'relu')(x), чтобы выходные данные модели соответствовали вашему целевому размеру.

РЕДАКТИРОВАТЬ: так же, как говорит @Daniel Möller, потеря должна быть 'category_crossentropy', а также счетчик фильтра последнего слоя должен быть 3.

Вот пример вывода:

Found 530 images belonging to 1 classes.
Found 530 images belonging to 1 classes.
D:/D_Document/Github/keras_autoencoder.py:65: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor("in..., outputs=Tensor("co...)`
  model = keras.Model(input = Input_Layer ,output = x)
D:/D_Document/Github/keras_autoencoder.py:78: UserWarning: The semantics of the Keras 2 argument `steps_per_epoch` is not the same as the Keras 1 argument `samples_per_epoch`. `steps_per_epoch` is the number of batches to draw from the generator at each epoch. Basically steps_per_epoch = samples_per_epoch/batch_size. Similarly `nb_val_samples`->`validation_steps` and `val_samples`->`steps` arguments have changed. Update your method calls accordingly.
  steps_per_epoch=50
D:/D_Document/Github/keras_autoencoder.py:78: UserWarning: Update your `fit_generator` call to the Keras 2 API: `fit_generator(<generator..., epochs=20, steps_per_epoch=50)`
  steps_per_epoch=50
Epoch 1/20
50/50 [==============================] - 102s 2s/step - loss: 0.6981 - acc: 0.6931
Epoch 2/20
50/50 [==============================] - 95s 2s/step - loss: 0.6406 - acc: 0.7584
Epoch 3/20
50/50 [==============================] - 92s 2s/step - loss: 0.6396 - acc: 0.7588
Epoch 4/20
50/50 [==============================] - 93s 2s/step - loss: 0.6381 - acc: 0.7543
Epoch 5/20
50/50 [==============================] - 93s 2s/step - loss: 0.6377 - acc: 0.7618
Epoch 6/20
50/50 [==============================] - 89s 2s/step - loss: 0.6357 - acc: 0.7569
Epoch 7/20
50/50 [==============================] - 91s 2s/step - loss: 0.6394 - acc: 0.7651
Epoch 8/20
50/50 [==============================] - 93s 2s/step - loss: 0.6380 - acc: 0.7660
Epoch 9/20
50/50 [==============================] - 93s 2s/step - loss: 0.6380 - acc: 0.7643
Epoch 10/20
50/50 [==============================] - 89s 2s/step - loss: 0.6399 - acc: 0.7669
person keineahnung2345    schedule 12.02.2019
comment
По-прежнему та же ошибка, проблема в том, что в моем наборе данных есть 3 канала RGB, и я не знаю, почему он ожидает 1 канал, - person Abdeslem SMAHI; 12.02.2019
comment
Можете ли вы вставить сюда вывод data.shape и result.shape? - person keineahnung2345; 12.02.2019
comment
Оба (67,250,250,3) - person Abdeslem SMAHI; 12.02.2019
comment
Я не могу воспроизвести вашу ошибку. Интересно, измените ли вы определение модели до или после того, как зададите вопрос. Можете ли вы проверить, соответствует ли определение вашей модели на вашем компьютере? - person keineahnung2345; 12.02.2019
comment
То же самое, но у меня было это предупреждение, и я не знаю, имеет ли оно отношение к моей проблеме user Warning update your model call to the keras 2 API model(inputs=Tensor("in ..., outputs =Tensor("co...) this is added back by InteractiveShellApp.init_path() - person Abdeslem SMAHI; 12.02.2019
comment
Это предупреждение должно быть в порядке. Как насчет того, чтобы попробовать model.fit_generator? Ссылка: medium.com / @ vijayabhaskar96 / - person keineahnung2345; 12.02.2019
comment
Fit_generator работает с метками в качестве конечных результатов, но моя проблема связана с изображениями в качестве выходных данных или есть способ обойти это? - person Abdeslem SMAHI; 12.02.2019
comment
github.com/keras-team/keras/issues/3923#issuecomment- 251205420 Это должно сработать для вас. - person keineahnung2345; 12.02.2019
comment
Та же проблема даже при использовании генераторов - person Abdeslem SMAHI; 12.02.2019