堆叠 MNIST 和 Fashion_MNIST 的困难

问题描述 投票:0回答:1

我知道这对你们来说很基础而且太简单了,但我是一个初学者,需要你们的帮助。 我正在努力用 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)
python tensorflow keras conv-neural-network mnist
1个回答
0
投票

首先

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

现在是问题的答案。假设您有

mnist_train_image
fashion_train_image
,两者都有
(60000, 28, 28)
输入形状。

您想要做的事情由两部分组成:组合输入并制定目标。

首先是输入

正如您在问题中所写的那样,您可以像这样使用

np.vstack

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

但是正如您应该已经注意到的那样,记住您是否需要

vstack
dstack
hstack
有点痛苦。我的偏好是使用
np.concatenate
代替

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

现在不需要记住鸭子是什么

v
h
d
,你只需要记住你想要连接的轴(或维度),在这种情况下它是第一个轴,意味着0。特别是在这种情况下就像这个,“垂直”是第二个轴,因为它是一堆图像,第一个轴是“批量”。

接下来,标签

由于您想将 0-60000 分类为 0,将 60001-120000 分类为 1,因此有很多奇特的方法可以做到这一点。

但简而言之,您可以使用

np.zeros
创建一个填充 0 的数组。您猜对了,
np.ones
创建一个填充 1 的数组。但是
ones
zeros
都为您提供了一个数组浮动,我不确定这是否会成为问题,所以我在后面添加
.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。

© www.soinside.com 2019 - 2024. All rights reserved.