【火炉炼AI】深度学习008-Keras解决多分类问题

栏目: 数据库 · 发布时间: 6年前

内容简介:(本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, Keras 2.1.6, Tensorflow 1.9.0)在我前面的文章为了演示,本次选用了博文

(本文所使用的 Python 库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, Keras 2.1.6, Tensorflow 1.9.0)

在我前面的文章 【火炉炼AI】深度学习005-简单几行Keras代码解决二分类问题 中,介绍了用Keras解决二分类问题。那么多分类问题该怎么解决?有哪些不同?

1. 准备数据集

为了演示,本次选用了博文 keras系列︱图像多分类训练与利用bottleneck features进行微调(三) 中提到的数据集,原始的数据集将所有类别的train照片放到train文件夹中,所有的test照片放在test文件夹中,而用不同数字开头来表示不同类别,比如以3开头的照片就是bus类等。首先将这些不同类别的照片放在不同的文件夹中,最终的train文件夹有5个子文件夹,每个子文件夹中有80张图片,最终的test文件夹中有5个子文件夹,每个子文件夹中有20张图片。总共只有500张图片。

在代码上,需要用ImageDataGenerator来做数据增强,并且用flow_from_directory来从文件夹中产生数据流。

代码和二分类的文章基本相同,此处就不贴出来了,可以去 我的github 直接看全部的代码。

唯一的不同之处是要设置class_mode='categorical',而不是原来二分类问题的class_mode='binary'

2. 模型的构建和训练

基本和二分类一样,如下为模型的构建部分:

# 4,建立Keras模型:模型的建立主要包括模型的搭建,模型的配置
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import optimizers
def build_model(input_shape):
    # 模型的搭建:此处构建三个CNN层+2个全连接层的结构
    model = Sequential()
    model.add(Conv2D(32, (3, 3), input_shape=input_shape))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Conv2D(32, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Conv2D(64, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Flatten())
    model.add(Dense(64))
    model.add(Activation('relu'))
    model.add(Dropout(0.5)) # Dropout防止过拟合
    model.add(Dense(class_num)) # 此处多分类问题,用Dense(class_num)
    model.add(Activation('softmax')) #多分类问题用softmax作为activation function
    
    # 模型的配置
    model.compile(loss='categorical_crossentropy', # 定义模型的loss func,optimizer,
                  optimizer=optimizers.RMSprop(), # 使用默认的lr=0.001
                  metrics=['accuracy'])# 主要优化accuracy

    return model # 返回构建好的模型
复制代码

改变之处是:最后的Dense层需要用Dense(class_num)来代替Dense(1),然后用多分类的标配activation function: softmax。在模型的配置方面,也需要将loss function改为'categorical_crossentropy'。

通过模型的训练后,最终结果如下所示:

【火炉炼AI】深度学习008-Keras解决多分类问题

从结果上看:没有出现过拟合现象,但是test acc不太稳定,变化比较大。在平台期后的test acc约为0.85.

########################小**********结###############################

1,多分类问题和二分类问题基本相同,不同之处在于:1,设置flow_flow_directory时要用设置class_mode='categorical'。2,模型的最后一层要用Dense(class_num)和softmax这个多分类专用激活函数。3,模型的loss function要使用categorical_crossentropy。

#################################################################

注:本部分代码已经全部上传到( 我的github )上,欢迎下载。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Effective Java

Effective Java

Joshua Bloch / Addison-Wesley Professional / 2018-1-6 / USD 54.99

The Definitive Guide to Java Platform Best Practices—Updated for Java 9 Java has changed dramatically since the previous edition of Effective Java was published shortly after the release of Jav......一起来看看 《Effective Java》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具