首页 > 分享 > 卷积神经网络

卷积神经网络

一,项目描述

该项目将使用卷积神经网络算法,识别图片中的动物是猫还是狗

数据集地址:https://momodel.cn/explore/5efc77dbc018c95e69fb2a81?type=dataset

其中,训练用的图片数据集在 dogs_cats/data 文件夹下,整个数据集分为训练集和测试集,其中训练集在 dogs_cats/data/train 文件夹内,有 25000 张图片,猫狗各 12500 张。 而测试集在dogs_cats/data/test 文件夹内有 12500 张,没有标明是猫还是狗

部分数据展示如下:

二,神经网络 (1)神经网络结构

可以通过下图进行理解神经网络的基本构成:

(2)图片在计算机内的储存

  图片在计算机储存由像素点矩阵组成,黑白图片的像素点是0-255或者0-1之间的数值,代表明暗程度;彩色图片是RGB图像,RGB表示红,绿,蓝三原色,计算机里所有的颜色都是三原色不同比例组成的,即三色通道

(3)图像的传递

将二维图像经过flatten 展开成一维输入全连接网络中

(4)训练数据

输入一组照片,通过全连接层的处理输出预测值和损失,损失越小越接近真实结果,因此需要找到最好的参数,即让所有的损失和最小,那么如何找到最好的参数呢?

现在选用的方法是梯度下降:

通过梯度下降不断迭代,调整初始参数,找到总损失比较小的最佳参数

三,卷积神经网络 (1)图片的特质

图片的一些模式比整张图片小的多

  比如说要识别猫,可以只通过猫的一部分特征去进行识别,即一个神经元不需要看到整个图像去发现模式,可以通过较少的参数连接到小区域

同样的模式可能出现在图像的不同区域

相同的猫耳检测器可以共享参数

对图像进行缩放不会改变图像中的物体

当图片很大时,图片的像素点也会很多,那么图片传入神经网络后连接数就会很多,参数就会多。缩放后可以使参数减少,简化问题

(2)CNN模型

卷积层

  卷积核在原始图片中起到探测模式的作用。可以发现卷积核的维度比原始图像要小,实现卷积的过程就是开始时,让卷积核从原始图像左上角对齐,对应每个小格子位置相乘,再将所有的结果相加,得到卷积结果矩阵的第一个值;再将卷积核向右移动,遍历原始图像,以此类推

不同的卷积核有不同的效果,而其中的值都是需要学习的参数

例:原始图片是8x8像素的,卷积核是3x3像素的,卷积结果是多少像素的?

答:6x6像素,8x8矩阵减去边缘一圈,即8-2=6

 (1)边界处理

有两种边界处理方式,Full Padding和Same Padding

(2)Stride: 卷积核每次移动的步长

最大池化层

在每个小区域内最大值取出来组合,起到图像缩放的作用,减少参数

Flatten层

将二维图像经过flatten 展开成一维输入全连接层中

(3)keras

Sequential 模型:非常简单,只支持单输入,单输出的模型,适用于70%的应用场景

函数式API:支持多输入,多输出模型,适用于95%的应用场景

建立一个全连接层:

import keras

from keras import layers

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'))

model.fit(x, y, epochs=10, batch_size=32)

建立一个卷积层:

keras.layers.Conv2D(filters, kernel_size, strides=(1,1), padding='valid', data_format=None)

建立一个最大池化层:

keras.layers.MaxPooling2D(pool_size=(2,2), strides=None, padding='valid', data_format=None )

四,代码实现

完整代码在末尾,所有的文件路径都需要修改成自己的文件路径喔!

(1)定义一个基础CNN模型

其中卷积层的卷积核数量为32,卷积核尺寸为3x3,激活函数为ReLU,padding设置为same,最大池化层的尺寸为2x2

def define_cnn_model():

model = Sequential()

model.add(Conv2D(32, (3,3), activation="relu",

kernel_initializer='he_uniform',

padding="same",

input_shape=(200,200,3)))

'''卷积核数量,卷积核维度,激活函数,padding,图片像素200x200,3代表彩色图片'''

model.add(MaxPooling2D((2,2)))

model.add(Flatten())

model.add(Dense(128, activation="relu",kernel_initializer='he_uniform' ))

model.add(Dense(1, activation="sigmoid"))

opt = SGD(lr=0.001, momentum=0.9)

model.compile(optimizer=opt,

loss='binary_crossentropy',

metrics=['accuracy'])

return model

from keras.utils import plot_model

model = define_cnn_model()

plot_model(model,

to_file='cnn_model.png',

dpi = 100,

show_shapes=True,

show_layer_names=True)

打印出卷积神经网络模型图为:

训练模型:

def train_cnn_model():

model = define_cnn_model()

datagen = ImageDataGenerator(rescale=1.0 / 225.0)

train_it = datagen.flow_from_directory(

'C:UsersAlixyDesktopma1ogo3ushu4ju4ji2dogs_catsdatatrain',

class_mode='binary',

batch_size=64,

target_size=(200, 200)

)

model.fit_generator(train_it,

steps_per_epoch=len(train_it),

epochs=20,

verbose=1 )

model.save("D:pythonpythonMCMData_cleanbasic_cnn_result.h5")

运行训练模型:

if __name__ == "__main__":

train_cnn_model()

这个构建的CNN模型在迭代20个epoch时,可以达到约95%的准确率,是一个不错的结果

使用训练好的模型做一些预测:

从测试文件夹中随机读取一张照片,并进行判断

def read_random_image():

folder = r'C:UsersAlixyDesktopma1ogo3ushu4ju4ji2dogs_catsdatatest'

file_path = folder + random.choice(os.listdir(folder))

print(file_path)

pil_im = Image.open(file_path, 'r')

return pil_im

def get_predict(pil_im, model):

pil_im = pil_im.resize((200,200)) 

array_im = np.asarray(pil_im)

array_im = np.expand_dims(array_im, axis=0)

result = model.predict(array_im)

if result[0][0] > 0.5:

print("预测结果是:狗")

else:

print("预测结果是:猫")

pil_im = read_random_image()

get_predict(pil_im, model)

pil_im.show(np.asarray(pil_im))

输出结果:

(2)完整代码

CNN_train.py

import sys

from matplotlib import pyplot

from keras.utils import to_categorical

from keras.models import Sequential

from keras.layers import Conv2D

from keras.layers import MaxPooling2D

from keras.layers import Dense

from keras.layers import Flatten

from keras.optimizers import SGD

from keras.preprocessing.image import ImageDataGenerator

import tensorflow as tf

tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)

def define_cnn_model():

model = Sequential()

model.add(Conv2D(32, (3,3), activation="relu",

kernel_initializer='he_uniform',

padding="same",

input_shape=(200,200,3)))

'''卷积核数量,卷积核维度,激活函数,padding,图片像素200x200'''

model.add(MaxPooling2D((2,2)))

model.add(Flatten())

model.add(Dense(128, activation="relu",kernel_initializer='he_uniform' ))

model.add(Dense(1, activation="sigmoid"))

opt = SGD(lr=0.001, momentum=0.9)

model.compile(optimizer=opt,

loss='binary_crossentropy',

metrics=['accuracy'])

return model

from keras.utils import plot_model

model = define_cnn_model()

plot_model(model,

to_file='cnn_model_basic.png',

dpi = 100,

show_shapes=True,

show_layer_names=True)

def train_cnn_model():

model = define_cnn_model()

datagen = ImageDataGenerator(rescale=1.0 / 225.0)

train_it = datagen.flow_from_directory(

'C:UsersAlixyDesktopma1ogo3ushu4ju4ji2dogs_catsdatatrain',

class_mode='binary',

batch_size=64,

target_size=(200, 200)

)

model.fit_generator(train_it,

steps_per_epoch=len(train_it),

epochs=20,

verbose=1 )

model.save("D:pythonpythonMCMData_cleanbasic_cnn_result.h5")

if __name__ == "__main__":

train_cnn_model()

CNN_predict.py

from keras.models import load_model

model_path = 'D:pythonpythonMCMData_cleanbasic_cnn_result.h5'

model = load_model(model_path)

import os, random

import numpy as np

from PIL import Image

def read_random_image():

folder = r'C:UsersAlixyDesktopma1ogo3ushu4ju4ji2dogs_catsdatatest'

file_path = folder + random.choice(os.listdir(folder))

print(file_path)

pil_im = Image.open(file_path, 'r')

return pil_im

def get_predict(pil_im, model):

pil_im = pil_im.resize((200,200))

array_im = np.asarray(pil_im)

array_im = np.expand_dims(array_im, axis=0)

result = model.predict(array_im)

if result[0][0] > 0.5:

print("预测结果是:狗")

else:

print("预测结果是:猫")

pil_im = read_random_image()

get_predict(pil_im, model)

pil_im.show(np.asarray(pil_im))

有错误欢迎指正!

相关知识

卷积神经网络
基于卷积神经网络的宠物识别
基于卷积神经网络的宠物猫品种分类研究 csdn
基于卷积神经网络的猫种类的识别
基于卷积神经网络的宠物猫品种分类研究
基于卷积神经网络通过声音识别动物情绪的方法及系统
一种基于深度卷积神经网络的禽类动物行为识别方法与流程
【卷积神经网络】CNN详解以及猫狗识别实例
基于卷积神经网络通过声音识别动物情绪的方法及系统与流程
基于卷积神经网络的宠物识别 Pet Recognition Based on Convolutional Neural Network

网址: 卷积神经网络 https://m.mcbbbk.com/newsview669495.html

所属分类:萌宠日常
上一篇: 宠物鸟的逃脱下载
下一篇: 史上最全Python图像识别:从