我正在使用一个Keras的2D卷积神经网络来解决一个分类问题,但我能达到的最佳准确率大约是30%。我应该做些什么来提高这个模型的精确度准确率?
这是我用来创建模型的代码:
model = Sequential()model.add(Conv2D(128, kernel_size=(3,3), input_shape=x_train.shape[1:]))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Conv2D(128, kernel_size=(3,3)))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Flatten())model.add(Dense(20, activation='softmax'))adam = Adam(lr=3e-4)model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])
x数据包含2480场比赛,每场比赛有20名参赛者,每名参赛者有100个变量,总形状为(2480, 20, 100)。y数据代表每场比赛的获胜者,并且是一热编码的,包含2480场比赛,每场比赛有20个y标签,总形状为(2480, 20)。
这个数据集可以在这里找到这里,并使用以下代码加载到内存中:
import numpy as npx = np.loadtxt("x_data").reshape(2480, 20, 100)y = np.loadtxt("y_data").reshape(2480, 20)
所有这些数据都是以纯文本形式存储的浮点变量。x是100 * 20 * 2480个变量,y是20 * 2480个变量。
y中的第一个值看起来像这样:
[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]
这代表第一号参赛者赢得了比赛。
提前感谢!
回答:
首先,对于数值数据,完全不要使用卷积层。
只需使用3到4个Dense层,并加入适当的正则化层,如BatchNorm和Dropout,就可以得到不错的拟合。另外,由于你的y(目标)是一热编码的,你需要使用softmax。使用默认的Adam学习率,应该就足够了。
分类交叉熵 + Softmax = 多类分类
二元交叉熵 + Sigmoid = 多标签分类
关于100个变量,批次形状应该是(None, 2800, 100)。2800指的是数据点的数量(行),100指的是每个样本的特征数(列),None指的是批次大小。你需要将其重塑为(2800, 100)。