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

课程来自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=是否包括推理部分


相关推荐
光锥智能33 分钟前
快手AI的围城与重构
人工智能·重构
老蒋新思维41 分钟前
创客匠人峰会深度复盘:AI 智能体驱动,知识变现的业务重构与实战路径
网络·人工智能·网络协议·tcp/ip·重构·创始人ip·创客匠人
sali-tec8 小时前
C# 基于halcon的视觉工作流-章66 四目匹配
开发语言·人工智能·数码相机·算法·计算机视觉·c#
这张生成的图像能检测吗8 小时前
(论文速读)ParaDiffusion:基于信息扩散模型的段落到图像生成
人工智能·机器学习·计算机视觉·文生图·图像生成·视觉语言模型
新程记8 小时前
2025年,上海CAIE认证报考指南:把握AI机遇的实用起点
人工智能·百度
unicrom_深圳市由你创科技8 小时前
汽修AI智能体V1.0——从模型微调到应用部署
人工智能
路边草随风8 小时前
milvus向量数据库使用尝试
人工智能·python·milvus
irizhao8 小时前
基于深度学习的智能停车场系统设计与实现
人工智能·深度学习
九河云9 小时前
华为云 ECS 弹性伸缩技术:应对业务峰值的算力动态调度策略
大数据·服务器·人工智能·物联网·华为云
IT空门:门主10 小时前
Spring AI的教程,持续更新......
java·人工智能·spring·spring ai