机器学习

卷积神经网络-Python

2018-05-16  本文已影响2人  灵妍
1、创建CNN模型

(1)导入标准库
代码:

from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense

库解释:
Sequential用于初始化神经网络模型。
Convolution2D用于创建卷积层,2D代表图像是2维的。
可以简写成Conv2D,但是要和代码中对象创建相一致。
MaxPooling2D用于创建最大池化层。
这两层可以变成3D代表三维模型的处理。
Flatten用于扁平化层。
Dense用于创建全连接层。
(2)创建CNN模型
代码:

# Initialising the CNN
classifier = Sequential()

# Step 1 - Convolution
classifier.add(Convolution2D(32, 3, 3, input_shape = (64, 64, 3), activation = 'relu'))

# Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Adding a second convolutional layer
classifier.add(Convolution2D(32, 3, 3, activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
# Step 3 - Flattening
classifier.add(Flatten())

# Step 4 - Full connection
classifier.add(Dense(output_dim = 128, activation = 'relu'))
classifier.add(Dense(output_dim = 1, activation = 'sigmoid'))

# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
初始化步骤.PNG
卷积层1.PNG
卷积层2.PNG
图片数据.PNG
图片矩阵.PNG
最大池化层.PNG
CNN结构.PNG
扁平化.PNG
全连接层.PNG

代码解释:
我们在添加卷积层的时候,要特征图的个数,过滤器的尺寸,输入图片的大小,以及激活函数的类型。
我们在添加最大池化层的时候,要设置最大池化层的尺寸,这里设置的2*2,图片的大小将会变成原图的1/2。
我们再添加第二层卷积层,有利于提高模型的精度,设置第二层的时候,不用设置输入图形的大小。
增加模型精度还有一种方法,就是增加输入图片的尺寸。
扁平化就是将所有最大池化后的图形列成向量的形式,我们可以知道这个数量是非常大的。
全连接我们要设置神经元的个数,前面讲ANN说过是输入层的个数与输出层的个数的和除以2,但是这个输入层数量是巨大的,我们按经验设置为128。输出层由于只有两种分类,我们只用设置一个神经元。
编译CNN,我们要设置参数优化算法,这里选择随机梯度下降算法的Adam方法,比普通的随机梯度下降算法更高级,损害函数选择binery_crossentropy,因为分类结果是二值,不是多值,如果是多值,就选用categorical_crossentropy。评判标准选择精确度就可以了。

3、用图像拟合CNN模型

代码:

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('dataset/training_set',
                                                 target_size = (64, 64),
                                                 batch_size = 32,
                                                 class_mode = 'binary')

test_set = test_datagen.flow_from_directory('dataset/test_set',
                                            target_size = (64, 64),
                                            batch_size = 32,
                                            class_mode = 'binary')

classifier.fit_generator(training_set,
                         samples_per_epoch = 8000,
                         nb_epoch = 25,
                         validation_data = test_set,
                         nb_val_samples = 2000)
keras文档.PNG

我们可以百度keras,然后查阅keras的中文文档,在中文文档的数据预处理里有图像预处理,利用这里提供的代码就可以对文件夹里的图像进行预处理,前面说到我们之所以不把原图形直接进行扁平化的原因一方面是原图像的数据量太大,另一更重要的方面是原图形无法反应像素间的联系,也就是由像素及其周围像素组成的特征之间的关系,换句话说,在图片经过旋转,截图,放大缩小处理后,各个像素点的绝对位置发生变化后,我们是否人能够通过关键像素的相对位置辨别出图像。
这里我们要通过图像生成器对图像进行预处理,代码是在说明文档中找到的。


数据路径.PNG
数据名设置.PNG

代码解释:
首先,我们在keras中导入图像生成器对象,将训练集的图像生成器设置为像素值缩小为原来的1/255,也就是在0~1之间,这样有利于后续的处理不至于使数值过大,难于计算。上面的两个点向右偏移0.2,图片缩小到原来的0.2,并且水平翻转,也就是在水平方向上镜像。
测试集的对象初始化就简单多了,直接缩小像素值就是了。
我们对训练集进行初始化,首先设置路径,训练集的文件夹下有猫和狗两个文件,我们就是通过文件名来对图像的类别加以区分。规定图像的尺寸为初始化CNN模型规定的输入图像的大小,设置批处理的图像个数,也就是对多少个观察值求一次损失函数进行优化。
分类类型为2值,是由于分类结果是2,如果是多类,就要选择categorical。
对测试集的图片初始化,也和训练集一样。
之后我们来拟合CNN,输入初始化好的训练集,设置每期处理多少样本,我们的总样本数是8000,我们要设置每期的样本数是8000,这里还可以用每期的步数代替,这里的步数是指优化参数的次数,为:steps_per_epoch=8000/32=250,同理,设置验证集的步数为:epochs=25,代表优化25轮,validation_steps=2000/32=62.5。
运行时间有点长。
我们再聊一下,看中文文档的重要性,因为当你了解一个算法的原理之后,你并不是自己去编写这个算法,而要借助库函数,这个库函数的使用要遵循一定的规则,只有这个库的说明文档告诉你这个规则,所以使用算法并不难,只要理解原理之后,看下相关的说明文档,在IDE中导入相关库,应用相关算法就可以了。
运行结果

运行结果.PNG
上一篇 下一篇

猜你喜欢

热点阅读