Подгонка трехмерного изображения к модели глубокого обучения - PullRequest
0 голосов
/ 24 марта 2019

Я выполняю предварительную обработку изображений в форме массива Numpy (28,28, 3). Когда я пытаюсь уместить свои данные, я получаю сообщение об ошибке. Если я пропущу весь предварительно подготовленный фрейм данных, я получу ошибку ValueError: Ошибка при проверке ввода: ожидалось, что conv2d_20_input будет иметь 4 измерения, но получит массив с формой (360, 1)

Когда я передаю одно значение, я получаю ошибку: Ошибка при проверке ввода: ожидалось, что conv2d_16_input будет иметь 4 измерения, но получил массив с формой (28, 28, 3

Я пытался обработать данные. Я попытался индивидуально сбросить модель и тренироваться на 1: 1, и это все еще не работает

Код для предварительной обработки

from tensorflow.python.keras.preprocessing.image import load_img, img_to_array
def read_and_prep_images(img_paths):
    z = load_img(img_paths, target_size=(28,28))
    z= img_to_array(z)
    return z
df['arrays'] = df['filepath'].apply(read_and_prep_images)

создание модели

model = Sequential()

добавление слоев модели

model.add(Conv2D(filters = 24, kernel_size = (5),padding = 'Same', 
              activation ='relu', input_shape = (28, 28,3)))

model.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', 
                 activation ='relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', 
                 activation ='relu'))
model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', 
                 activation ='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(256, activation = "relu"))
model.add(Dropout(0.5))
model.add(Dense(10, activation = "softmax"))

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

Дважды проверьте форму

np.shape(df['arrays'].iloc[0])

(28, 28, 3)

Предварительные данные

X_train, X_test, y_train, y_test = train_test_split(df.arrays, df.label, test_size=0.4, random_state=101)

Фитинг Модель

model.fit(X_train, y_train, batch_size=100, epochs=4, validation_split=0.2)

модель должна соответствовать, и я могу использовать model.predict для новых изображений, которые модель не видела раньше.

1 Ответ

0 голосов
/ 24 марта 2019

Если я пропущу весь предварительно подготовленный фрейм данных, я получу ошибку ValueError: Ошибка при проверке ввода: ожидалось, что conv2d_20_input имеет 4 измерения, но получил массив с формой (360, 1)

Ошибка возникает из-за того, что df.arrays возвращает массив массивов. Итак, в вашем случае, если вы отметите df.arrays.shape, это будет (360,) вместо (360,28,28,3). Итак, сначала нужно удалить вложенность. Один из способов сделать это:

X = np.zeros((len(df.arrays), *df.arrays[0].shape))
for i in range(len(df.arrays)):
    X[i] = df.arrays[i]

X теперь может быть передано model.fit.

Когда я передаю одно значение, я получаю ошибку: Ошибка при проверке ввода: ожидалось, что conv2d_16_input будет иметь 4 измерения, но получил массив с формой (28, 28, 3)

Это просто, просто добавьте размер партии. Передайте df.arrays [0] [None] вместо df.arrays [0].

>>> df.arrays[0].shape
(28, 28, 3)
>>> df.arrays[0][None].shape
(1, 28, 28, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...