ValueError: Ошибка при проверке ввода: ожидалось, что conv2d_1_input имеет 4 измерения, но получил массив с формой (8020, 1) - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь создать классификатор изображений, но я сталкиваюсь с ошибкой, упомянутой в заголовке этого поста.Ниже приведен код, над которым я работаю.Как мне преобразовать мой массив numpy, который имеет форму (8020,) в форму, как того требует функция fit ()?Я попытался напечатать форму ввода: train_img_array.shape [1:], но она дает пустую форму: ()

import numpy as np
img_train.shape
img_valid.shape
img_train.head(5)
img_valid.head(5)

(8020, 4)
(2006, 4)
         ID  index  class                                               data
8030  11596  11596      0  [[[255, 255, 255, 0], [255, 255, 255, 0], [255...
2152  11149  11149      0  [[[255, 255, 255, 0], [255, 255, 255, 0], [255...
550   10015  10015      0  [[[255, 255, 255, 0], [255, 255, 255, 0], [255...
1740   9035   9035      0  [[[255, 255, 255, 0], [255, 255, 255, 0], [255...
9549   8218   8218      1  [[[255, 255, 255, 0], [255, 255, 255, 0], [255...
         ID  index  class                                               data
3312   5481   5481      0  [[[255, 255, 255, 0], [255, 255, 255, 0], [255...
9079  10002  10002      0  [[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], ...
6129  11358  11358      0  [[[255, 255, 255, 0], [255, 255, 255, 0], [255...
1147   2613   2613      1  [[[255, 255, 255, 0], [255, 255, 255, 0], [255...
7105   5442   5442      1  [[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], ...

img_train.dtypes

ID        int64
index     int64
class     int64
data     object
dtype: object

train_img_array = np.array([])
train_id_array = np.array([])
train_lab_array = np.array([])
train_id_array = img_train['ID'].values
train_lab_array = img_train['class'].values
train_img_array =img_train['data'].values

train_img_array.shape
train_lab_array.shape
train_id_array.shape

(8020,)
(8020,)
(8020,)

# Importing the Keras libraries and other packages


#matplotlib inline
from __future__ import print_function

import keras
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout
Using Theano backend.
WARNING (theano.tensor.blas): Using NumPy C-API based implementation for BLAS functions.

classifier = Sequential()
classifier.add(Conv2D(32, (3, 3), padding='same', activation='relu', input_shape = (256, 256, 3)))
classifier.add(Conv2D(32, (3, 3), activation='relu'))
classifier.add(MaxPooling2D(pool_size=(2, 2)))
classifier.add(Dropout(0.25))

classifier.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
classifier.add(Conv2D(64, (3, 3), activation='relu'))
classifier.add(MaxPooling2D(pool_size=(2, 2)))  
classifier.add(Dropout(0.25))

classifier.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
classifier.add(Conv2D(64, (3, 3), activation='relu'))
classifier.add(MaxPooling2D(pool_size=(2, 2)))
classifier.add(Dropout(0.25))

classifier.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
classifier.add(Conv2D(64, (3, 3), activation='relu'))
classifier.add(MaxPooling2D(pool_size=(2, 2)))
classifier.add(Dropout(0.25))

classifier.add(Flatten())
classifier.add(Dense(units = 256, activation = 'relu'))
classifier.add(Dropout(0.25))
classifier.add(Dense(units = 1, activation = 'sigmoid'))    classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
classifier.summary()

batch_size = 32
epochs = 15


history = classifier.fit(train_img_array, train_lab_array, batch_size=batch_size, epochs=epochs, verbose=1, 
                   validation_data=(valid_img_array, valid_lab_array))
classifier.evaluate(valid_img_array, valid_lab_array)


ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (8020, 1)

Редактировать: ----------------------------------------------------------- Как просил Нассим, добавивЕще несколько подробностей к этому посту:

print(train_img_array) 

[ array([[[255, 255, 255,   0],
        [255, 255, 255,   0],
        [255, 255, 255,   0],
        ..., 
        [255, 255, 255,   0],
        [255, 255, 255,   0],
        [255, 255, 255,   0]],

       [[255, 255, 255,   0],
        [255, 255, 255,   0],
        [255, 255, 255,   0],
        ..., 
        ..., 
        [255, 255, 255,   0],
        [255, 255, 255,   0],
        [255, 255, 255,   0]]], dtype=uint8)
 array([[[255, 255, 255,   0],
        [255, 255, 255,   0],
        [255, 255, 255,   0],
        ..., 
        ..., 
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0]]], dtype=uint8)]


print(list(train_img_array)) 

[array([[[255, 255, 255,   0],
        [255, 255, 255,   0],
        [255, 255, 255,   0],
        ..., 
        [255, 255, 255,   0],
        [255, 255, 255,   0],
        [255, 255, 255,   0]],

       [[255, 255, 255,   0],
        [255, 255, 255,   0],
        [255, 255, 255,   0],
        ..., 
        ..., 
        [255, 255, 255,   0],
        [255, 255, 255,   0],
        [255, 255, 255,   0]]], dtype=uint8), array([[[255, 255, 255,   0],
        [255, 255, 255,   0],
        [255, 255, 255,   0],
        ..., 


print(np.array(list(train_img_array)))
throws the error:

ValueError: could not broadcast input array from shape (700,584,4) into shape (700,584)

1 Ответ

0 голосов
/ 30 мая 2018

Таким образом, после отладки с использованием результата:

> print(type(train_img_array[0]))
<type 'numpy.ndarray'>

> print(train_img_array[0].shape)
(700, 584, 4)

> print(rain_img_array[0])
array([[[255, 255, 255, 0], [255, 255, 255, 0], [255, 255, 255, 0], ..., ..., [255, 255, 255, 0], [255, 255, 255, 0], [255, 255, 255, 0]]], dtype=uint8)

мы видим, что то, что возвращается, когда вы делаете:

train_img_array =img_train['data'].values

на самом деле является одним массивом фигуры (8020,)где все элементы являются другими массивами, содержащими в изображениях.В основном два вложенных массива:

Итак, вы хотите, чтобы свести эту вложенную структуру вложенных массивов в один объект массива.То, как я это сделаю, может быть немного хакерским, но должно сработать, заключается в следующем:

train_img_array =img_train['data'].values
train_img_array = np.array(list(train_img_array))

Таким образом, в основном, преобразуйте структуру numpy массива numpy массивов в список numpy массивов.Затем, когда вы строите массив numpy из списка массивов numpy, вы получаете (волшебный) массив numpy с еще одним измерением.

Форма после этой операции должна быть (8020, 700, 584, 4)

Теперь я вижу еще одну потенциальную проблему, с которой вы можете столкнуться, это формат вашего изображения.Размер канала ваших изображений - последний (здесь 4 канала).Затем вы должны в своих сверточных слоях указать:

conv2D(... , data_format="channels_last", )

Кроме того, ваша входная форма для первого слоя равна (700, 584, 4), а не (256, 256, 3)

надеюсь, что это работает: -)

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