Ошибка Keras: не удалось передать входной массив из формы (300,300,3) в форму (300,300)

#python #tensorflow #keras

#python #тензорный поток #keras

Вопрос:

У меня есть следующий код, который должен обучить модель keras с помощью набора изображений, которые являются либо dummy_images, либо product_images, которые выдают ошибку ValueError: could not broadcast input array from shape (300,300,3) into shape (300,300) :

 # import packages
import os
import numpy as np
import pandas as pd
import scipy
import sklearn
import keras
from keras.models import Sequential
import cv2
import imageio
from skimage import io

# Defining Filepath
dummyPath = os.path.join('data', 'train', 'dummy')
productPath = os.path.join('data', 'train', 'product')
dummy, product = os.listdir(dummyPath), os.listdir(productPath)

# Loading the images
print("loading images")
images = []
label = []
for i in dummy:
    image = imageio.imread(os.path.join(dummyPath, i))
    images.append(image)
    label.append(0)  # for dummy images

for i in product:
    image = imageio.imread(os.path.join(productPath, i))
    images.append(image)
    label.append(1)  # for product images

# resizing all images
print("resizing images")
for i in range(len(images)):
    images[i] = cv2.resize(images[i], (300, 300))

# converting images to arrays
print("converting images to np-arrays")
images = np.array(images, dtype='object')
label = np.array(label)

# Defining the hyperparameters
print("Defining Parameters")
filters = 10
filtersize = (5, 5)
epochs = 5
batchsize = 128
input_shape = (300, 300, 3)

# Converting the target variable to the required size
from keras.utils.np_utils import to_categorical
label = to_categorical(label)

# Defining the model
print("Defining the model")
model = Sequential()

model.add(keras.layers.InputLayer(input_shape=input_shape))
model.add(keras.layers.convolutional.Conv2D(filters, filtersize, strides=(1, 1), padding='valid',
                                            data_format='channels_last', activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(units=2, input_dim=50, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(images, label, epochs=epochs, batch_size=batchsize, validation_split=0.3)

model.summary()
 

Ошибка в строке (или ее аргументах):

images = np.array(images, dtype='object')

Я попытался изменить "images[i] = cv2.resize(images[i], (300, 300))" "images[i] = cv2.resize(images[i], (300, 300, 3))" , но выдает ошибку, что этот параметр будет принимать только два аргумента, а не три.

Что я здесь делаю не так?

Ответ №1:

Вы можете изменять размер своих изображений с помощью numpy:

 for i in range(len(images)):
    images[i] = np.resize(images[i], (300, 300, 3))