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

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


相关推荐
池央11 分钟前
AI性能极致体验:通过阿里云平台高效调用满血版DeepSeek-R1模型
人工智能·阿里云·云计算
我们的五年12 分钟前
DeepSeek 和 ChatGPT 在特定任务中的表现:逻辑推理与创意生成
人工智能·chatgpt·ai作画·deepseek
Yan-英杰13 分钟前
百度搜索和文心智能体接入DeepSeek满血版——AI搜索的新纪元
图像处理·人工智能·python·深度学习·deepseek
Fuweizn15 分钟前
富唯智能可重构柔性装配产线:以智能协同赋能制造业升级
人工智能·智能机器人·复合机器人
taoqick2 小时前
对PosWiseFFN的改进: MoE、PKM、UltraMem
人工智能·pytorch·深度学习
suibian52352 小时前
AI时代:前端开发的职业发展路径拓宽
前端·人工智能
预测模型的开发与应用研究3 小时前
数据分析的AI+流程(个人经验)
人工智能·数据挖掘·数据分析
源大模型3 小时前
OS-Genesis:基于逆向任务合成的 GUI 代理轨迹自动化生成
人工智能·gpt·智能体
PowerBI学谦5 小时前
Python in Excel高级分析:一键RFM分析
大数据·人工智能·pandas
运维开发王义杰5 小时前
AI: Unsloth + Llama 3 微调实践,基于Colab
人工智能·llama