在使用卷积神经网络进行常规图像分类时,密集层的单元数值应设为多少?

我正在为石头剪刀布创建一个普通的图像分类器。我使用的是本地GPU,并且不是高端GPU。当我开始训练模型时,它不断报错:

ResourceExhaustedError:  OOM when allocating tensor with shape.

我谷歌了这个错误,他们建议我减小批量大小,我照做了。然而,这仍然没有解决问题。后来我将图像大小从200*200改为50*50,模型开始训练,准确率达到了99%。之后我想看看能否使用150*150大小的图像,因为我在YouTube的官方TensorFlow频道上找到了一份教程,我完全按照他们的代码进行操作,但仍然不起作用。我减少了批量大小,还是没有解决方案。后来我改变了密集层中的单元数量,最初是512,然后我将其减少到200,这样就正常工作了,但现在准确率非常差。我只是想知道有没有什么方法可以根据我的GPU调整我的模型,而不影响我的准确率?所以我想知道密集层中的单元数量有什么影响?这对我帮助很大。

    i=Input(shape=X_train[0].shape)    x=Conv2D(64,(3,3),padding='same',activation='relu')(i)    x=BatchNormalization()(x)    x=Conv2D(64,(3,3),padding='same',activation='relu')(x)    x=BatchNormalization()(x)    x=MaxPool2D((2,2))(x)    x=Conv2D(128,(3,3),padding='same',activation='relu')(x)    x=BatchNormalization()(x)    x=Conv2D(128,(3,3),padding='same',activation='relu')(x)    x=BatchNormalization()(x)    x=MaxPool2D((2,2))(x)    x=Flatten()(x)    x=Dropout(0.2)(x)    x=Dense(512,activation='relu')(x)    x=Dropout(0.2)(x)    x=Dense(3,activation='softmax')(x)    model=Model(i,x)

现在当我使用150*150大小的图像运行这个代码时,它会报那个错误,如果我将图像大小改为50*50并将批量大小减少到8,它就能正常工作,并给我99%的准确率。但如果我使用150*150并将密集层中的单元数量减少到200(随机),它也能正常工作,但准确率非常非常差。我使用的是低端的NVIDIA GeForce MX 230 GPU,我的显存是4GB


回答:

对于200×200的图像,最后一个MaxPool的输出形状为(50,50,128),然后被展平,作为密集层的输入,总共有50*50*128*512=163840000个参数。这很多。

为了减少参数量,你可以采取以下一种或多种方法:- 减少最后一个Conv2D层中的滤波器数量- 使用大于2×2的MaxPool- 减少密集层的尺寸- 减少输入图像的尺寸。

你已经尝试了后两种方法。最终哪种方法能给你带来最佳的准确率,只能通过反复试验来发现。你已经达到了99%的准确率,这已经很不错了。

如果你想要一个有更多VRAM的平台,你可以使用Google Colab https://colab.research.google.com/

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注