卷积神经网络-猫狗识别实战

课程来自bilibili@Momodel平台 全长只有两个小时,理论部分讲得很粗糙

1 人的视觉和计算机视觉

人的大脑:神经元细胞,轴突发送信号,树突接收信号,互相连接,连接的强度和状态会随着新的经历刺激而变化。

用计算机模拟大脑,每个神经元的输入有很多,有很多权重,经过激活函数,输出一个值。

全连接网络:略

计算机图像的一些基础概念:略

图像-flatten(二维展开成一维)->全连接网络

2 神经网络介绍

人工设计神经网络(结构);参数是学习训练出来的。需要数据和相应标签。

与真实值的偏差是损失。使得损失最小的算法:梯度下降,反向传播。

3 卷积神经网络

处理图像时,全连接网络的第一层将会非常大,如100*100*3的图片,有1000个神经元,会有3e7的连接,这样就太大了。

卷积层->最大池化层(多次)-flatten>全连接网络

模式1比整张图片要小;2模式可能出现在图像的不同区域。如"猫耳检测器",可以复用;3对图像进行缩小并不会改变图像,而可以使得参数大量减少。

1.2属性导致了卷积层的存在。不同的卷积核有不同的效果,如边缘检测、锐化等。

边界可以padding。full padding:卷积结果比原图片大,对任何一个像素都不放过。same padding:卷积结果与原图片一样大。

Stride:卷积核每次移动的步长。

彩色图片:三通道,处理后相加。

3属性导致了池化层的存在。起到了图像缩小的效果。

逐步抽象。

框架 Keras

是一个用python编写的高级神经网络API

Keras现在已经被收入tensorflow里了

方式1

Sequenttial序列模型

非常简单,只支持单输入,单输出(适合猫狗识别)

方式2

函数式API

支持多输入多输出

python 复制代码
import keras
from keras import layers #层

model=keras.Sequential() #建立序列模型
model.add(layers.Dense(20,activation='relu',input_shape=(10,))) #加层,Dense表示全连接层
#参数是神经元数量、激活函数,输入的参数值数量
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)

#Conv2D 创造卷积核
#参数,filters=输出空间的维度,kernel_size:卷积核的宽高,strides=步长,padding选择valid或same
keras.layers.Conv2D(filters,kernel_size,strides=(1,1),padding='valid',data_format=None)

#MaxPooling2D 池化层
#参数,pool_size缩小比例的因数,strides,padding
keras.layers.MaxPooling2D(pool_size=(2,2),strides=None,padding='valid',data_format=None)

导入数据集

从momodel里直接导入

导包

python 复制代码
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)

基础CNN模型

python 复制代码
def define_cnn_model():
    model=Sequential() #建立序列模型
    #卷积层
    model.add(Conv2D(32,(3,3),activation='relu',padding='same',input_shape=(200,200,3)))
    #最大池化层
    model.add(MaxPooling2D((2,2)))
    #Flatten层
    model.add(Flatten())
    #全连接层
    model.add(Dense(128,activation='relu',))
    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

打印模型结构

python 复制代码
model=define_cnn_model()
plot_model(model,to_file='cnn_model.png',dpi=100,show_shapes=True,show_layer_names=True)
python 复制代码
def train_cnn_model():
    model=define_cnn_model()
    #图片生成器
    datagen=ImageDataGenerator(rescale=1.0/255.0)
    train_it=datagen.flow_from_directory(
        '/home/jovyan/work/datasets/ma1ogo3ushu4ju4ji2-momodel/dogs_cats/data/train',
        class_mode='binary',
        batch_size=64,
        target_size=(200,200)
    )
    #训练模型
    model.fit_generator(train_it,
                       steps_per_epoch=len(train_it),
                       epochs=1,
                       verbose=1)

使用gpu添加任务进行训练

python 复制代码
train_cnn_model()

epochs=1时结果为58%的准确率

epochs=20时,准确率达到了92.8%

预测

python 复制代码
from keras.models import load_model
model_path='/home/jovyan/work/datasets/ma1ogo3ushu4ju4ji2-momodel/dogs_cats/model/basic_cnn_model.h5'
model=load_model(model_path)

import os,random
from matplotlib.pyplot import imshow
import numpy as np
from PIL import Image
%matplotlib inline

def read_random_image():
    folder='/home/jovyan/work/datasets/ma1ogo3ushu4ju4ji2-momodel/dogs_cats/data/test/'
    file_path=folder+random.choice(os.listdir(folder))
    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 = array_im[np.newaxis,:]
    result=model.predict([[array_im]])
    if result[0][0]>0.5:
        print('狗')
    else:
        print('猫')
      
pil_im=read_random_image()
imshow(np.asarray(pil_im))
get_predict(pil_im,model)

预测结果:

迁移学习

是一种机器学习方法,把为A任务开发的模型拿出来复用。即使用预训练的模型。

基于inceptionV3模型做迁移学习

include_top=是否包括推理部分


相关推荐
曼城周杰伦7 分钟前
自然语言处理:第六十三章 阿里Qwen2 & 2.5系列
人工智能·阿里云·语言模型·自然语言处理·chatgpt·nlp·gpt-3
余炜yw1 小时前
【LSTM实战】跨越千年,赋诗成文:用LSTM重现唐诗的韵律与情感
人工智能·rnn·深度学习
莫叫石榴姐1 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
如若1231 小时前
利用 `OpenCV` 和 `Matplotlib` 库进行图像读取、颜色空间转换、掩膜创建、颜色替换
人工智能·opencv·matplotlib
YRr YRr2 小时前
深度学习:神经网络中的损失函数的使用
人工智能·深度学习·神经网络
ChaseDreamRunner2 小时前
迁移学习理论与应用
人工智能·机器学习·迁移学习
Guofu_Liao2 小时前
大语言模型---梯度的简单介绍;梯度的定义;梯度计算的方法
人工智能·语言模型·矩阵·llama
我爱学Python!2 小时前
大语言模型与图结构的融合: 推荐系统中的新兴范式
人工智能·语言模型·自然语言处理·langchain·llm·大语言模型·推荐系统
果冻人工智能2 小时前
OpenAI 是怎么“压力测试”大型语言模型的?
人工智能·语言模型·压力测试
日出等日落2 小时前
Windows电脑本地部署llamafile并接入Qwen大语言模型远程AI对话实战
人工智能·语言模型·自然语言处理