首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么CNN模型很难对彩色MNIST进行分类?

为什么CNN模型很难对彩色MNIST进行分类?
EN

Stack Overflow用户
提问于 2022-07-13 11:22:43
回答 1查看 140关注 0票数 3

我试图在Keras上用基本的CNN架构对彩色MNIST数字进行分类。下面是一段代码,它将原始数据集颜色变为纯红色、绿色或蓝色。

代码语言:javascript
运行
复制
def load_norm_data():
  ## load basic mnist
  (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
  train_images = np.zeros((*x_train.shape, 3)) # orig shape: (60 000, 28, 28, 1) -> rgb shape: (60 000, 28, 28, 3)
  for num in range(x_train.shape[0]):
    rgb = np.random.randint(3) 
    train_images[num, ..., rgb] = x_train[num]/255
  return train_images, y_train
  
if __name__ == '__main__':
  ims, labels = load_norm_data()
  for num in range(10):
    plt.subplot(2, 5, num+1)
    plt.imshow(ims[num])
    plt.axis('off')

这给出了头几个数字:

然后,我尝试将这个彩色数据集分类为相同的MNIST 10位数类,这样标签就不会改变--然而,模型的准确率从非彩色MNIST的95%下降到彩色MNIST的30%-70%,这在很大程度上取决于权重初始化.请在下面找到上述模型的架构:

代码语言:javascript
运行
复制
model = keras.Sequential()
model.add(keras.layers.Conv2D(64, kernel_size=(3,3), padding='same'))
model.add(keras.layers.MaxPool2D(pool_size=(2,2)))
model.add(keras.layers.Conv2D(64, kernel_size=(3,3), padding='same'))
model.add(keras.layers.MaxPool2D(pool_size=(2,2), padding='same'))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(10, activation='relu'))
model.add(keras.layers.Softmax())

input_shape = train_images.shape
model.build(input_shape)

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

model.fit(train_images, train_numbers, batch_size=12, epochs=25)

最初,我认为性能的下降可能与数据的不规则性有关(例如,假设数据中的许多3s最终是绿色的,因此模型学习green = 3)。所以我检查了数据,计数很好,每个类别的rgb分布也接近每种颜色的33%。我还检查了错误分类的图像,看看是否有许多代表某一种颜色或数字,但似乎也不是这样。在任何情况下,在阅读了Keras的文档之后,并且由于Conv2D迫使您传递一个二维的kernel_size,因此我认为它可以在输入图像的所有通道上操作,所以在这里的分类中不应该考虑颜色。

我是不是漏掉了什么?

如果您需要进一步的信息,请告诉我。提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-13 13:35:23

模型的最后一部分包括一个稠密的->重力线->软件。应该删除relu激活。此外,在卷积块中添加非线性(例如relu)可能会使您受益。否则,神经网络最终将成为一个(大)线性函数,并且对非线性数据不起作用。

代码语言:javascript
运行
复制
model = keras.Sequential()
model.add(keras.layers.Conv2D(64, kernel_size=(3,3), padding='same', activation='relu'))
model.add(keras.layers.MaxPool2D(pool_size=(2,2)))
model.add(keras.layers.Conv2D(64, kernel_size=(3,3), padding='same', activation='relu'))
model.add(keras.layers.MaxPool2D(pool_size=(2,2), padding='same'))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(10))
model.add(keras.layers.Softmax())

有趣的是,原始模型在MNIST数据集上运行良好。我不能确定原因,但也许MNIST数据集非常简单,模型能够处理。而且,relu -> softmax会将负值限制为0,并且可能没有多少负值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72965428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档