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

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


相关推荐
学术小白人20 小时前
【EI会议征稿通知】2026年智能感知与自主控制国际学术会议(IPAC 2026)
人工智能·物联网·数据分析·区块链·能源
HyperAI超神经21 小时前
在线教程丨 David Baker 团队开源 RFdiffusion3,实现全原子蛋白质设计的生成式突破
人工智能·深度学习·学习·机器学习·ai·cpu·gpu
ASKED_20191 天前
End-To-End之于推荐: Meta GRs & HSTU 生成式推荐革命之作
人工智能
liulanba1 天前
AI Agent技术完整指南 第一部分:基础理论
数据库·人工智能·oracle
自动化代码美学1 天前
【AI白皮书】AI应用运行时
人工智能
小CC吃豆子1 天前
openGauss :核心定位 + 核心优势 + 适用场景
人工智能
一瞬祈望1 天前
⭐ 深度学习入门体系(第 7 篇): 什么是损失函数?
人工智能·深度学习·cnn·损失函数
徐小夕@趣谈前端1 天前
15k star的开源项目 Next AI Draw.io:AI 加持下的图表绘制工具
人工智能·开源·draw.io
优爱蛋白1 天前
MMP-9(20-469) His Tag 蛋白:高活性可溶性催化结构域的研究工具
人工智能·健康医疗
阿正的梦工坊1 天前
Kronecker积详解
人工智能·深度学习·机器学习