В чем причина 'InvalidArgumentError: Несовместимые фигуры: [10,2] против [10]' в тензорном потоке (с Keras)? - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь использовать CNN для обнаружения объектов с использованием Tensorflow с Keras.Я довольно новичок в этом, поэтому я использовал учебник в качестве руководства, но со своим собственным набором и несколькими другими вещами.Ошибка, которую я получаю, - это несовместимые формы Tensorflow с [x, 2] против [x], где x - любое количество обучающих образов, которые у меня есть, а 2 - количество классов.Я использовал небольшое количество изображений только для тестирования, но я почти уверен, что проблема не в этом?

Я безуспешно пробовал разные кратные тренировочные образы, и я посмотрел на model.summary () посмотреть, выложена ли модель именно так, как я этого хочу.Кроме того, я напечатал формы своих тренировочных изображений и их ярлыки, и они выглядят правильно.

Изображения имеют размер 28 x 28 пикселей, с плоским размером 784 и полной формой (28,28,1), 1 - количество каналов (в оттенках серого).У меня только два класса и всего 10 тренировочных образов (я могу получить больше, если это считается проблемой).

model = Sequential()

model.add(InputLayer(input_shape=(img_size_flat,)))

model.add(Reshape(img_shape_full))

model.add(Conv2D(kernel_size=5, strides=1, filters=16, padding='same',
                 activation='relu', name='layer_conv1'))
model.add(MaxPooling2D(pool_size=2, strides=2))

model.add(Conv2D(kernel_size=5, strides=1, filters=36, padding='same',
                 activation='relu', name='layer_conv2'))
model.add(MaxPooling2D(pool_size=2, strides=2))

model.add(Flatten())

model.add(Dense(128, activation='relu'))

model.add(Dense(num_classes, activation='softmax'))

from tensorflow.python.keras.optimizers import Adam
optimizer = Adam(lr=1e-3)

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

from tensorflow.python.keras.utils import to_categorical
model.fit(x=data.train,
    y=to_categorical(data.train_labels),
    batch_size=128, epochs=1)

Я использовал to_categorical () на ярлыках только потому, что они каким-то образом конвертировались в целые.Я проверил, что они сохранили свои правильные значения и т. Д.

Я распечатал сводку модели, чтобы проверить макет:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
reshape (Reshape)            (None, 28, 28, 1)         0         
_________________________________________________________________
layer_conv1 (Conv2D)         (None, 28, 28, 16)        416       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 14, 14, 16)        0         
_________________________________________________________________
layer_conv2 (Conv2D)         (None, 14, 14, 36)        14436     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 7, 7, 36)          0         
_________________________________________________________________
flatten (Flatten)            (None, 1764)              0         
_________________________________________________________________
dense (Dense)                (None, 128)               225920    
_________________________________________________________________
dense_1 (Dense)              (None, 2)                 258       
=================================================================
Total params: 241,030
Trainable params: 241,030
Non-trainable params: 0
_________________________________________________________________
None

Я напечатал размер данных numpy:

print(data.train.shape)
print(data.train_labels.shape)

, который печатает

(10, 784) #This is the shape of the images
(10, 2) #This is the shape of the labels

Ошибка:

2019-04-08 10:46:40.239226: I tensorflow/stream_executor/dso_loader.cc:152] successfully opened CUDA library cublas64_100.dll locally
Traceback (most recent call last):
  File "C:/Users/bunja/Dev/testCellDet/project/venv/main.py", line 182, in <module>
    batch_size=128, epochs=1)
  File "C:\Users\bunja\Miniconda3\lib\site-packages\tensorflow\python\keras\engine\training.py", line 880, in fit
    validation_steps=validation_steps)
  File "C:\Users\bunja\Miniconda3\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 329, in model_iteration
    batch_outs = f(ins_batch)
  File "C:\Users\bunja\Miniconda3\lib\site-packages\tensorflow\python\keras\backend.py", line 3076, in __call__
    run_metadata=self.run_metadata)
  File "C:\Users\bunja\Miniconda3\lib\site-packages\tensorflow\python\client\session.py", line 1439, in __call__
    run_metadata_ptr)
  File "C:\Users\bunja\Miniconda3\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 528, in __exit__
    c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [10,2] vs. [10]
     [[{{node metrics/acc/Equal}}]]
     [[{{node loss/mul}}]]

Как можно видеть, в сводке показано, что плотность_1 имеет выходную форму (Нет, 2).Это то место, где у меня проблема, так как у меня есть ошибка несовместимых фигур: [x, 2] против [x]?Я проверил учебник, который я использовал для изучения этого материала, и не обнаружил серьезных отличий.Я все еще новичок в этом, так что это может быть что-то маленькое, и мне может быть не хватает некоторой информации, поэтому, пожалуйста, спросите, если у вас есть какие-либо вопросыСпасибо !!!!!

Дополнительная информация:

Графический процессор: GeForce GTX 1080 Major: 6 вспомогательных: 1 memoryClockRate (ГГц): 1,7335

Версия Tensorflow: 1.13.1

Версия Python: Python 3.7.3

Вот код комментария к форме to_categorical:

print(data.train_labels.shape)
print()
print(to_categorical(data.train_labels).shape)

Вывод:

(10, 2)

(10, 2, 2)

У меня есть ощущение, что это может быть источником моей ошибки?Но я не уверен, как это исправить ...

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

to_categorical обычно используется, когда у вас есть метка в формате списка, и вам необходимо выполнить кодирование one-hot, чтобы преобразовать ее в правильную форму, чтобы подать ее моделям во время обучения.

Но в вашем случае ваша метка уже имеет ту же форму, что вы определили в вашей модели, поэтому кодировка one-hot не требуется.

Вы можете просмотреть None как batch_size, и это даст вам более четкое представление о том, как данные преобразуются со входа на выход.

И спасибо!

0 голосов
/ 08 апреля 2019

Я просто попробовал это сам.Это сработало очень хорошо для меня.Может быть, это ваши train_data.Можете ли вы показать нам это?

Если я вас правильно понимаю, вы используете следующие данные:

train_x = np.random.rand(5,784)
train_y = np.array([[1,0],[0,1],[0,1],[1,0],[0,1]])

Если я обучу модель с этими значениями, я не получу никаких ошибок.А также предсказания работают.

print(model.predict(np.random.rand(1,784)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...