ValueError:无法将输入数组从形状(300300,3)广播到形状(300300)

2024-04-25 08:47:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的Python代码(用于培训的Keras教程)。我尝试删除img = img.convert('L')以在加载图像时保留颜色(我的所有图像都是RGB颜色的,因此数据不是问题所在),但遇到以下错误:

training_images = np.array([i[0] for i in training_data]).reshape(-1, IMAGE_SIZE, IMAGE_SIZE, 3)
ValueError: could not broadcast input array from shape (300,300,3) into shape (300,300)

怎么了?如何修复?你知道吗

from keras.models import Sequential, load_model
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.layers.normalization import BatchNormalization
from PIL import Image
from random import shuffle, choice
import numpy as np
import os

IMAGE_SIZE = 300
IMAGE_DIRECTORY = './data/test_set'

def label_img(name):
  if name == 'cats': return np.array([1, 0])
  elif name == 'notcats' : return np.array([0, 1])

def load_data():
  train_data = []
  directories = next(os.walk(IMAGE_DIRECTORY))[1]

  for dirname in directories:
    file_names = next(os.walk(os.path.join(IMAGE_DIRECTORY, dirname)))[2]

    for i in range(200):
      image_name = choice(file_names)
      image_path = os.path.join(IMAGE_DIRECTORY, dirname, image_name)
      label = label_img(dirname)
      img = Image.open(image_path)
      #img = img.convert('L')
      img = img.resize((IMAGE_SIZE, IMAGE_SIZE), Image.ANTIALIAS)
      train_data.append([np.array(img), label])

  return train_data

def create_model():
  model = Sequential()
  model.add(Conv2D(32, kernel_size = (3, 3), activation='relu', 
                   input_shape=(IMAGE_SIZE, IMAGE_SIZE, 1)))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(BatchNormalization())
  model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(BatchNormalization())
  model.add(Dropout(0.2))
  model.add(Flatten())
  model.add(Dense(256, activation='relu'))
  model.add(Dropout(0.2))
  model.add(Dense(64, activation='relu'))
  model.add(Dense(2, activation = 'softmax'))

  return model

training_data = load_data()
training_images = np.array([i[0] for i in training_data]).reshape(-1, IMAGE_SIZE, IMAGE_SIZE, 1)
training_labels = np.array([i[1] for i in training_data])

model = create_model()
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(training_images, training_labels, batch_size=50, epochs=10, verbose=1)

Tags: nameinfromimageimportaddimgfor
2条回答
  model.add(Conv2D(32, kernel_size = (3, 3), activation='relu', 
                   input_shape=(IMAGE_SIZE, IMAGE_SIZE, 1)))

你的模特想要一个灰度图像(1个通道),但你要训练彩色图像(3个通道)。这行不通。您将不得不修改您的模型,以采取彩色图像,或通过在灰度图像。您开始使用的示例代码使用.reshape(-1, IMAGE_SIZE, IMAGE_SIZE, 1)将灰度图像转换为该神经网络第一层所需的形状。你知道吗

如果模型是为灰度设计的,那么只需将.convert('L')保留在中,它将彩色图像转换为灰度。许多图像分类任务在灰度中工作得很好。你知道吗

因为我能够在一些discussion in the comments之后确定问题,所以我将把它作为一个答案发布。你知道吗

在那条线上

training_images = np.array([i[0] for i in training_data]).reshape(-1, IMAGE_SIZE, IMAGE_SIZE, 1)

您正试图将3通道RGB图像重塑为单通道(灰度)图像,这是不可能的(也不是您想做的事情,因为您希望保留颜色),因此ValueError。只有在删除img = img.convert('L')之前,这一部分才是必需的,以便为模型提供适当的形状,该模型的输入形状为(IMAGE_SIZE, IMAGE_SIZE, 1)。你知道吗

现在您正在使用RGB图像,可以删除reshape,因为图像已经具有(IMAGE_SIZE, IMAGE_SIZE, 3)返回的正确形状。但是,如nneonneo's answer中所述,您的模型需要修改才能处理新的输入形状。你知道吗

相关问题 更多 >

    热门问题