【问题标题】:ValueError: Error when checking target: expected fc1000 to have shape (30,) but got array with shape (1,)ValueError:检查目标时出错:预期 fc1000 的形状为 (30,) 但得到的数组的形状为 (1,)
【发布时间】:2018-12-31 00:32:05
【问题描述】:

我试图重新训练 ResNet50 模型,以将给定的动物图像分类为 30 个不同的类别。为此,我制作了一个列表,其中包含给定维度图像的数组(在扩展维度并对其进行预处理之后):-(1、224、224、3),因此给定列表的形状(在将其转换为 numpy 数组之后)是(300, 1, 224, 224, 3),因为最初我只拍了 300 张图像。对于 Ytrain,我对类进行了标签编码,然后对类进行了热编码。对于 30 个类,我有一个维度为 (300, 30) 的 numpy 数组。然后我为model.fit_generator使用DataGenerator,传递形状为(1、224、224、3)的Xtrain和形状为(30,)的Ytrain,但得到了错误:-

ValueError: Error when checking target: expected fc1000 to have shape (30,) but got array with shape (1,)

这是我的代码:-

inputShape = (224, 224)
preprocess = imagenet_utils.preprocess_input

df = pd.read_csv('DLBeginner/meta-data/train.csv')
df = df.head(300)
imagesData, target = [], []
c = 0

for images in df['Image_id']:
filename = args["target"] + '/' + images
image = load_img(filename, target_size = inputShape)
image = img_to_array(image)
image = np.expand_dims(image, axis = 0)
image = preprocess(image)
imagesData.append(image)
c += 1
print('Count = {}, Image > {} '.format(c, images))

imagesData = np.array(imagesData)
labelEncoder = LabelEncoder()
series = df['Animal'][0:300]
integerEncoded = labelEncoder.fit_transform(series)
Hot = OneHotEncoder(sparse = False)
integerEncoded = integerEncoded.reshape(len(integerEncoded), 1)
oneHot = Hot.fit_transform(integerEncoded)

model = ResNet50(include_top = True, classes = 30, weights = None)

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

l = len(imagesData)
def DataGenerator(Xtrain, Ytrain):
while(True):
    for i in range(l):
        arr1 = Xtrain[i]
        arr2 = Ytrain[i]
        print("arr1.shape : {}".format(arr1.shape))
        print("arr2.shape : {}".format(arr2.shape))
        yield(arr1, arr2)

这里是“合适的部分”

generator = DataGenerator(imagesData, oneHot)

model.fit_generator(generator = generator, epochs = 5, steps_per_epoch=l)

我哪里错了? 提前致谢。

【问题讨论】:

    标签: python-3.x keras deep-learning conv-neural-network


    【解决方案1】:

    'categorical_crossentropy' 切换到 'sparse_categorical_crossentropy' 为我解决了这个问题。

    【讨论】:

      【解决方案2】:

      只是想添加更多细节。

      当您遇到多类分类问题并且 (1) 如果您的目标是单热编码,则使用categorical_crossentropy (2) 如果您的目标是 MNIST 示例中的整数,请使用 sparse_categorical_crossentropy。当你使用这个引擎盖下的 TensorFlow 时,它会将数据转换为 one-hot 编码并对数据进行分类。

      希望对您有所帮助。谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-30
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2018-10-24
        • 2018-09-30
        • 2019-03-05
        • 2019-05-10
        相关资源
        最近更新 更多