【问题标题】:Difficulty with stacking MNIST and Fashion_MNIST堆叠MNIST和Fashion_MNIST的困难
【发布时间】:2021-06-10 01:49:37
【问题描述】:

我知道这对你们来说太简单了,但我是初学者,需要你们的帮助。 我正在努力用 CNN 制作二进制分类器。 我的最终目标是检查精度超过 0.99

我同时导入 MNIST 和 FASHION_MNIST 来识别它是数字还是服装。 所以有2类。我想将 0-60000 归类为 0,将 60001-120000 归类为 1。 我将使用 binary_crossentropy。

但我不知道如何从头开始。 如何首先使用 vstack hstack 来结合 MNIST 和 FASHION_MNIST?

这是我目前尝试的方式

****import numpy as np
from keras.datasets import mnist
from keras.datasets import fashion_mnist
import keras
import tensorflow as tf
from keras.utils.np_utils import to_categorical
num_classes = 2
train_images = train_images.astype("float32") / 255
test_images = test_images.astype("float32") / 255
train_images = train_images.reshape((-1, 784))
test_images = test_images.reshape((-1, 784))
train_labels = to_categorical(train_labels, num_classes)
test_labels = to_categorical(test_labels, num_classes)****

【问题讨论】:

    标签: tensorflow keras conv-neural-network mnist


    【解决方案1】:

    首先

    它们是图像,因此最好将它们视为图像,不要将它们重塑为矢量。

    现在是问题的答案。假设您有mnist_train_imagefashion_train_image,两者都有(60000, 28, 28) 输入形状。

    您要做的是由两部分组成,组合输入和制作目标。

    首先输入

    正如您已经在问题中写的那样,您可以像这样使用np.vstack

    >>> train_image = np.vstack((fashion_train_image, mnist_train_image))
    >>> train_image.shape
    (120000, 28, 28)
    

    但正如您应该已经注意到的那样,记住您是否需要 vstackdstackhstack 有点痛苦。我的偏好是我会改用np.concatenate

    >>> train_image = np.concatenate((fashion_train_image, mnist_train_image), axis=0)
    >>> train_image.shape
    (120000, 28, 28)
    

    现在无需记住鸭子是什么vhd 您只需要记住要连接的轴(或维度),在这种情况下,它是第一个轴,表示 0。尤其是在这种情况下,“垂直”是第二个轴,因为它是一堆图像,而第一个轴是“批处理”。

    接下来是标签

    既然您想将 0-60000 归类为 0,将 60001-120000 归类为 1,那么有很多奇特的方法可以做到这一点。

    但简而言之,您可以使用 np.zeros 创建一个填充为 0 的数组。而 np.ones 可以创建一个填充为 1 的数组。但是oneszeros 都给你一个浮点数组,我不确定这是否会成为问题,所以我在后面添加.astype('uint8')以防万一。您也可以在函数中添加参数dtype='uint8'

    使用上面的连接

    >>> train_labels = np.concatenate((np.zeros(60000), np.ones(60000))).astype('uint8')
    >>> train_labels.shape
    (120000,)
    

    对整个大小使用 1 或 0,然后减去或添加或重新分配其余部分

    >>> train_labels = np.zeros(120000).astype('uint8')
    >>> train_labels[60000:] = 1
    #####
    >>> train_labels = np.ones(120000, dtype='uint8')
    >>> train_labels[:60000] -= 1
    

    重要!!!!

    您的示例中有一个关于标签的明显错误,索引从 0 开始,所以第 60,000 个索引是 59,999。

    所以你真正想要的是将 0-59999 归类为 0,将 60000-119999 归类为 1。

    【讨论】:

    • 非常感谢您!你救了我的命。然而,我遇到了另一个问题。如果您检查我刚刚上传的最近的问题,将不胜感激。提前致谢! :)
    • 如果这解决了问题,那么请将其标记为已解决
    • 对于另一个问题,无论错误说什么,都放在问题中
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2021-03-21
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多