我正在为石头剪刀布创建一个普通的图像分类器。我使用的是本地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/