如何提高Keras中CNN分类器的准确性?

我使用了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()。

最后的两点建议:

  • 你需要关注验证损失,而不仅仅是准确性
  • 如果你的数据样本有限,尝试使用迁移学习。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注