对视频游戏封面 CNN 分类器 (keras) 的改进

数据挖掘 喀拉斯 图像分类 美国有线电视新闻网
2022-02-25 08:08:28

作为一个个人项目,我正在尝试构建一个分类器,该分类器试图纯粹根据封面来预测游戏的元评分。我认为使用(更具体地说是 2D-Convolution)学习 Keras 图像分类将是一个有趣的项目。

我绝对是新手,所以如果我犯了任何新手错误,请告诉我。以下是我发布 CNN 之前的一些注意事项:

1) 我编写了一个 Metacritic Sc​​rubber,它采用具有 metacritic 分数的 PS2、PS3、PS4、Xbox360 和 Xbox One 游戏,下载艺术品并用分数标记它。重复的游戏被删除(这可能是一个错误,因为它们有时会根据平台有不同的分数)。我对这段代码很满意。

2) 我在 0-9 而不是 0-100 的范围内对分数进行了四舍五入,以减少分类的数量。

3) 图像为 123x98,具有 3 个通道。所有图像都被拉伸到这个大小。我想知道这是否可能是问题的根源,因为有些封面被拉长了。每个通道的值在 0-255 之间。

4) 带有方形封面的游戏(DLC、非零售等)已被省略。

这给我留下了 3816 个游戏封面的数据集。我认为这可能足以进行初步调查。

我建立的模型基于 Iwana 等人在本文中的工作: https ://arxiv.org/abs/1610.09204

model = Sequential()
model.add(Conv2D(64, (2, 3),activation='relu', input_shape=(123,98,3)))
model.add(MaxPooling2D(pool_size=(2, 2),padding='valid'))

model.add(Conv2D(128, (2, 3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2),padding='valid'))

model.add(Conv2D(256, (2, 3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2),padding='valid'))

model.add(Conv2D(256, (2, 3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2),padding='valid'))

model.add(Conv2D(256, (2, 3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2),padding='valid'))

model.add(Flatten())

model.add(Dense(720, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(720, activation='relu'))
model.add(Dense(720, activation='relu'))
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.001,momentum=0.1,decay=0.0005,nesterov=True), metrics=['accuracy'])
model.summary()

#Save output to file
csv_logger = CSVLogger('training.log')
#Save best model when possible
checkpoint = ModelCheckpoint('training_model_best.hdf5', monitor='val_acc', verbose=1, save_best_only=True, mode='max')

model.fit(np.array(images), np.array(labels), epochs=225, batch_size=10,
    validation_split=0.50,verbose=2,shuffle=True,callbacks=[csv_logger,checkpoint])

我使用了相当苛刻的 0.5 验证拆分,因为我真的想避免过度拟合。但无论我是否使用 0.2 - 0.5 之间的值,我通常会达到大约 35% 的验证准确率,这非常令人失望。很多超参数我不知道要设置什么。

对不起,很长的帖子。最终,我的结果比随机猜测要好一点,但我希望通过一些指示,我可以提高这个准确性。我想知道实际上,我下载的封面文件是否太小。

谢谢阅读。

1个回答

以下是需要考虑的几点:

1) 我编写了一个 Metacritic Sc​​rubber,它采用具有 metacritic 分数的 PS2、PS3、PS4、Xbox360 和 Xbox One 游戏,下载艺术品并用分数标记它。重复的游戏被删除(这可能是一个错误,因为它们有时会根据平台有不同的分数)。我对这段代码很满意。

好的!

2) 我在 0-9 而不是 0-100 的范围内对分数进行了四舍五入,以减少分类的数量。

这也应该没问题。

3) 图像为 123x98,具有 3 个通道。所有图像都被拉伸到这个大小。我想知道这是否可能是问题的根源,因为有些封面被拉长了。每个通道的值在 0-255 之间。

我会将 0-1 ( norm_values = values/255) 之间的值标准化。关于文件的大小,我认为这应该不是问题。例如,Cifar-10 为 32x32 或 ImageNet 上的平均图像分辨率为 469x387 像素,尽管大多数方法将它们调整为 256x256。我觉得你的尺码应该没问题。

4) 带有方形封面的游戏(DLC、非零售等)已被省略。

这里没有太多要补充的。

这给我留下了 3816 个游戏封面的数据集。我认为这可能足以进行初步调查。我建立的模型基于 Iwana 等人在本文中的工作:https ://arxiv.org/abs/1610.09204

这是我实际上认为我们有一些问题的地方。首先,您的数据集非常小。拆分训练/测试时,3816 减少到 1908 ......这不好,尤其是这种结构。在你提到的论文中,他们使用了一个大约有 250 万个参数的网络,他们使用了大约 137K 的样本。与您的 1908 数据集相比,您的数据集似乎很小,并且您使用的是相同的模型结构...

在我看来,简单地说,您的模型无法做得更好。无论您选择什么参数,您都需要(大量)更多数据。您可以尝试减小网络的大小,也可以使用添加噪声、镜像样本等创建更多数据……看看这些是否有帮助。

最后,除了大小之外,您无法判断您的数据是否具有足够的代表性,以至于任何模型都可以从中学习。因此,恐怕 35% 的准确率与其他任何值一样好。无论如何,你的任务似乎能够完成你的实验,而你做到了。你学到了很多关于深度模型的局限性,所以我想说:干得好!