我使用了batch_size = 1024和epochs = 100,我的分类器在我的模型上达到的最高准确率为70%。如何提高准确性?
dr = 0.5 # dropout rate model = models.Sequential() model.add(Reshape(([1]+in_shp), input_shape=in_shp))model.add(ZeroPadding2D((0, 2)))model.add(Conv2D(256, (1, 3),padding='valid', activation="relu", name="conv1", kernel_initializer='glorot_uniform',data_format="channels_first"))model.add(Dropout(dr)) model.add(ZeroPadding2D((0, 2)))model.add(Conv2D(80, (2, 3), padding="valid", activation="relu", name="conv2", kernel_initializer='glorot_uniform',data_format="channels_first"))model.add(Dropout(dr))model.add(Flatten())model.add(Dense(256, activation='relu', kernel_initializer='he_normal', name="dense1")model.add(Dropout(dr))model.add(Dense( len(classes), kernel_initializer='he_normal', name="dense2" ))model.add(Activation('softmax'))model.add(Reshape([len(classes)]))model.compile(loss='categorical_crossentropy', optimizer='Adam',metrics=['accuracy'])model.summary()
回答:
以下是一些建议的更改列表:
- 除非处理的图像必须使用,否则可以去掉ZeroPadding2D层
- 在使用多个Conv2D()层时,从较少的过滤器数量开始,然后逐渐增加。例如,从32开始,然后是64,再到128。用合适的内核大小根据具体情况用MaxPooling2D()分隔它们。
- 在Flatten()之后和到达最后一层之前添加一个额外的Dense()层。
检查一些修改后的代码
dr = 0.5 # dropout rate model = models.Sequential() model.add(Reshape(([1]+in_shp), input_shape=in_shp))# 你可以去掉ZeroPadding2D,因为它会在图像张量周围添加零行和零列model.add(ZeroPadding2D((0, 2)))# 从较少的过滤器数量开始,然后逐渐增加model.add(Conv2D(32, (1, 3),padding='valid', activation="relu", name="conv1", kernel_initializer='glorot_uniform',data_format="channels_first"))model.add(MaxPooling2D(2))model.add(Dropout(dr)) #model.add(ZeroPadding2D((0, 2))) # 不需要 # 增加过滤器数量model.add(Conv2D(64, (2, 3), padding="valid", activation="relu", name="conv2", kernel_initializer='glorot_uniform',data_format="channels_first"))model.add(MaxPooling2D(2))model.add(Conv2D(64, (2, 3), padding="valid", activation="relu", name="conv2", kernel_initializer='glorot_uniform',data_format="channels_first"))model.add(MaxPooling2D(2))model.add(Dropout(dr))model.add(Flatten())model.add(Dense(256, activation='relu', kernel_initializer='he_normal', name="dense1")model.add(Dropout(dr))# 添加一个额外的Dense层model.add(Dense(256, activation='relu', kernel_initializer='he_normal', name="dense1")model.add(Dense( len(classes), kernel_initializer='he_normal', name="dense2" ))model.add(Activation('softmax'))model.add(Reshape([len(classes)]))model.compile(loss='categorical_crossentropy', optimizer='Adam',metrics=['accuracy'])model.summary()
最后,很明显你在广泛使用Dropout()。
最后的两点建议:
- 你需要关注验证损失,而不仅仅是准确性
- 如果你的数据样本有限,尝试使用迁移学习。