该项目将使用卷积神经网络算法,识别图片中的动物是猫还是狗。
其中,训练用的图片数据集在dogs_cats/data文件夹下,整个数据集分为训练集和测试集,其中训练集在dogs_cats/data/train文件夹内,有25000张图片,猫狗各12500张。而测试集在dogs_cats/data/test文件夹内有12500张,没有标明是猫还是狗
可以通过下图进行理解神经网络的基本构成:
图片在计算机储存由像素点矩阵组成,黑白图片的像素点是0-255或者0-1之间的数值,代表明暗程度;彩色图片是RGB图像,RGB表示红,绿,蓝三原色,计算机里所有的颜色都是三原色不同比例组成的,即三色通道。
输入一组照片,通过全连接层的处理输出预测值和损失,损失越小越接近真实结果,因此需要找到最好的参数,即让所有的损失和最小,那么如何找到最好的参数呢?
通过梯度下降不断迭代,调整初始参数,找到总损失比较小的最佳参数
同样的模式可能出现在图像的不同区域
当图片很大时,图片的像素点也会很多,那么图片传入神经网络后连接数就会很多,参数就会多。缩放后可以使参数减少,简化问题
不同的卷积核有不同的效果,而其中的值都是需要学习的参数
例:原始图片是8x8像素的,卷积核是3x3像素的,卷积结果是多少像素的?
Stride:卷积核每次移动的步长
Flatten层将二维图像经过flatten展开成一维输入全连接层中
kerasSequential模型:非常简单,只支持单输入,单输出的模型,适用于70%的应用场景
函数式API:支持多输入,多输出模型,适用于95%的应用场景
建立一个全连接层:
importkerasfromkerasimportlayers#导入层结构model=keras.Sequential()#建立序列模型#全连接层(本层神经元个数,激活函数,输入图片参数值数量)model.add(layers.Dense(20,activation='relu',input_shape=(10,)))model.add(layers.Dense(20,activation='relu'))model.add(layers.Dense(10,activation='softmax'))#训练模型#x-样本数据即图片,y-图片标签,epochs=处理图片的次数,batch_size=一次性处理几张图片model.fit(x,y,epochs=10,batch_size=32)建立一个卷积层:
keras.layers.Conv2D(filters,kernel_size,strides=(1,1),padding='valid',data_format=None)#filters:输出空间的维度#kernel_size:1个整数或2个整数表示的元组,2D卷积窗口的宽度和高度#strides:2个整数表示的元组,卷积沿宽度和高度方向的步长#padding:边界处理的方法,"valid"或"same"建立一个最大池化层:
keras.layers.MaxPooling2D(pool_size=(2,2),strides=None,padding='valid',data_format=None)#pool_size:沿(垂直,水平)方向缩小比例的因数,如果只有一个整数,则两个维度使用相同窗口长度#strides:2个整数表示的元组,步长值,None表示默认值pool_size#padding:边界处理的方法,"valid"或"same"四、代码实现1.定义一个基础CNN模型其中卷积层的卷积核数量为32,卷积核尺寸为3x3,激活函数为ReLU,padding设置为same,最大池化层的尺寸为2x2
#训练模型deftrain_cnn_model():#实例化模型model=define_cnn_model()#创建图片生成器,产生图片并输入datagen=ImageDataGenerator(rescale=1.0/225.0)train_it=datagen.flow_from_directory('C:\\Users\\Alixy\\Desktop\\ma1ogo3ushu4ju4ji2\\dogs_cats\\data\\train',class_mode='binary',batch_size=64,#一次产生并输入64张图片target_size=(200,200)#缩放图片为200x200,和输入图片大小相同!!!)#训练模型model.fit_generator(train_it,steps_per_epoch=len(train_it),epochs=20,verbose=1)#把模型保存到文件夹,basic_cnn_result.h5是提前就创建好的,用来保存模型的model.save("D:\\python\\python\\MCM\\Data_clean\\basic_cnn_result.h5")运行训练模型:
if__name__=="__main__":train_cnn_model()这个构建的CNN模型在迭代20个epoch时,可以达到约95%的准确率,是一个不错的结果