作为一个个人项目,我正在尝试构建一个分类器,该分类器试图纯粹根据封面来预测游戏的元评分。我认为使用(更具体地说是 2D-Convolution)学习 Keras 图像分类将是一个有趣的项目。
我绝对是新手,所以如果我犯了任何新手错误,请告诉我。以下是我发布 CNN 之前的一些注意事项:
1) 我编写了一个 Metacritic Scrubber,它采用具有 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% 的验证准确率,这非常令人失望。很多超参数我不知道要设置什么。
对不起,很长的帖子。最终,我的结果比随机猜测要好一点,但我希望通过一些指示,我可以提高这个准确性。我想知道实际上,我下载的封面文件是否太小。
谢谢阅读。