深度学习(1) ——图像分类

article/2025/11/7 15:50:26

图像分类概述

  • 图像分类实质上就是从给定的类别集合中为图像分配对应标签的任务,当我们输入一张图片,返回一个该图像类别的标签。
  • 限制条件:只能输入单目标图像。
  • 常用数据集:mnist、CIFAR-10、CIFAR-100、ImageNet

图像分类算法

这里介绍四种。

  • LeNet-5

    • 意义:LeNet-5是最早的卷积神经网络,是其他深度学习模型的基础, 主要用来做手写数字识别。

    • 结构:2个5x5卷积层 + 2个全连接层+ 输出层

    在这里插入图片描述

    • 输入:32x32

    • 输出:10分类

    • tensorflow实现:

      import numpy as np
      import matplotlib.pyplot as plt
      import tensorflow as tf
      from tensorflow.keras import layers, models, utils, optimizers, losses
      from tensorflow.keras.datasets import mnist# 1 数据获取
      (X_train, y_train), (X_test, y_test) = mnist.load_data()
      print('训练集大小:', X_train.shape, '测试集大小:', X_test.shape)# 2数据处理
      # 添加通道数
      X_train = tf.expand_dims(X_train, 3)
      X_test = tf.expand_dims(X_test, 3)
      # 3模型搭建
      net = models.Sequential([# 卷积层1layers.Conv2D(filters=6, kernel_size=5, activation='sigmoid', 			     input_shape=(28, 28, 1)),# 池化层1layers.MaxPool2D(pool_size=2),# 卷积层2layers.Conv2D(filters=16, kernel_size=5, activation='sigmoid'),# 池化层2layers.MaxPool2D(pool_size=2),# 更改维度layers.Flatten(),# 全连接层layers.Dense(120, activation='sigmoid'),layers.Dense(84, activation='sigmoid'),layers.Dense(10, activation='softmax')], name='LeNet-5')
      # 4模型编译和训练
      sgd = optimizers.SGD(learning_rate=0.9, momentum=0.5)
      net.compile(optimizer=sgd, loss='SparseCategoricalCrossentropy', metrics=['accuracy'])
      # history = net.fit(X_train, y_train, epochs=100, batch_size=128)    # 5模型评估和预测
      history = net.fit(X_train, y_train, validation_data=(X_test[:100], y_test[:100]), epochs=80, batch_size=128)
      # 评估
      loss, accuracy = net.evaluate(X_test[101:], y_test[101:], verbose=True)
  • AlexNet

    • 意义:开山之作,证明学习到的特征可以超越手工设计的特征,打破了cv的研究方向

    • 网络特点:
      在这里插入图片描述

      • 8层网络:5个卷积层+2个全连接层+1个输出层

        其中使用了1个11x11、1个5x5和3个3x3的卷积核

    • 输入:227x227的图像

    • 输出:1000分类

    • Tensor flow 实现:

      import tensorflow as tf
      from tensorflow.keras import models, layers
      import numpy as npclass MyModel(models.Model):def __init__(self):super(MyModel, self).__init__()self.conv1 = layers.Conv2D(96, kernel_size=11, strides=4, activation='relu')self.maxpool1 = layers.MaxPool2D(pool_size=3, strides=2)self.conv2 = layers.Conv2D(256, kernel_size=5, padding='same', activation='relu')self.maxpool2 = layers.MaxPool2D(pool_size=3, strides=2)self.conv3 = layers.Conv2D(384, kernel_size=3, padding='same', activation='relu')self.conv4 = layers.Conv2D(384, kernel_size=3, padding='same', activation='relu')self.conv5 = layers.Conv2D(256, kernel_size=3, padding='same', activation='relu')self.maxpool3 = layers.MaxPool2D(pool_size=3, strides=2)self.flat = layers.Flatten()self.fc1 = layers.Dense(4096, activation='relu')self.dropout1 = layers.Dropout(0.5)self.fc2 = layers.Dense(4096, activation='relu')self.dropout2 = layers.Dropout(0.5)self.out = layers.Dense(1000, activation='softmax')def call(self, inputs):x = self.conv1(inputs)x = self.maxpool1(x)x = self.conv2(x)x = self.maxpool2(x)x = self.conv3(x)x = self.conv4(x)x = self.conv5(x)x = self.maxpool3(x)x = self.flat(x)x = self.fc1(x)x = self.fc2(x)x = self.out(x)return xmodel = MyModel()
      input = tf.random.uniform((1, 227, 227, 1))
      y = model(input)
      print(model.summary())
      
  • VGG-16

    • 意义:2014年牛津大学计算机视觉组和Google一起研发的新的神经网络,取得了ILSVR2014年比赛分类项目的第二名,主要贡献是使用很小的卷积核构建卷积神经网络结构,展现出深度是算法优良性能的关键部分。

    • 网络架构:

      在这里插入图片描述

      VGG使用的基本结构是vgg块,一共有5个卷积块,前2块使用两个卷积层、而后3块使用三个卷积层,第一个输出通道是64,之后每次对输出通道数翻倍,知道变为512

    • 输入:224x224

    • 输出:1000分类,也是在ImageNet中训练的

    • vgg块的实现:

    # 定义VGG网络中的卷积块:卷积层的个数,卷积层中卷积核的个数
    def vgg_block(num_convs, num_filters):# 构建序列模型blk = tf.keras.models.Sequential()# 遍历所有的卷积层for _ in range(num_convs):# 每个卷积层:num_filter个卷积核,卷积核大小为3*3,padding是same,激活函数是relublk.add(tf.keras.layers.Conv2D(num_filters,kernel_size=3,padding='same',activation='relu'))# 卷积块最后是一个最大池化,窗口大小为2*2,步长为2blk.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))return blk
    
  • GoogLeNet

    • 意义:这里应该注意不是googleNet,而是GooLeNet,是为了致敬LeNet。GoogLeNet和AlexNet/VGGNet这类依靠加深网络结构的深度的思想不完全一样。GoogLeNet在加深度的同时做了结构上的创新,引入了一个叫做Inception的结构来代替之前的卷积加激活的经典组件。GoogLeNet在ImageNet分类比赛上的Top-5错误率降低到了6.7%。

    • 网络结构:

      • inception块:

        在这里插入图片描述

      这里大量使用了1x1的卷积,主要作用是实现跨通道的语义信息融合和降维减少参数量。

      实现:

      class Inception(tf.keras.layers.Layer):# 输入参数为各个卷积的卷积核个数def __init__(self, c1, c2, c3, c4):super().__init__()# 线路1:1 x 1卷积层,激活函数是RELU,padding是sameself.p1_1 = tf.keras.layers.Conv2D(c1, kernel_size=1, activation='relu', padding='same')# 线路2,1 x 1卷积层后接3 x 3卷积层,激活函数是RELU,padding是sameself.p2_1 = tf.keras.layers.Conv2D(c2[0], kernel_size=1, padding='same', activation='relu')self.p2_2 = tf.keras.layers.Conv2D(c2[1], kernel_size=3, padding='same',activation='relu')# 线路3,1 x 1卷积层后接5 x 5卷积层,激活函数是RELU,padding是sameself.p3_1 = tf.keras.layers.Conv2D(c3[0], kernel_size=1, padding='same', activation='relu')self.p3_2 = tf.keras.layers.Conv2D(c3[1], kernel_size=5, padding='same',activation='relu')# 线路4,3 x 3最大池化层后接1 x 1卷积层,激活函数是RELU,padding是sameself.p4_1 = tf.keras.layers.MaxPool2D(pool_size=3, padding='same', strides=1)self.p4_2 = tf.keras.layers.Conv2D(c4, kernel_size=1, padding='same', activation='relu')# 完成前向传播过程def call(self, x):# 线路1p1 = self.p1_1(x)# 线路2p2 = self.p2_2(self.p2_1(x))# 线路3p3 = self.p3_2(self.p3_1(x))# 线路4p4 = self.p4_2(self.p4_1(x))# 在通道维上concat输出outputs = tf.concat([p1, p2, p3, p4], axis=-1)return outputs  
      
      • GoogLeNet:

        共分为5个模块:

        1. B1模块:64个 7x7卷积层

        2. B2模块:64个1x1卷积层 + 1个3x3卷积层+1个3x3池化层

        3. B3模块:2个Inception模块 + 3x3最大池化

        4. B4模块:5个Inception + 3x3最大池化,还有两个辅助输出类,防止网络太深过拟合

        5. B5模块:2个Inception + GAP全局平均池化 + 全连接层输出分类结果

  • ResNet

    在这之前,所有研究都倾向于通过加深网络来提高网络的精度,大家一致认为网络越深,获取的信息就越多,特征就越丰富。但在实践中,随着网络的加深,优化效果反而越差,测试数据和训练数据的准确率反而降低了。

    • 意义:提出了残差连接结构,解决了网络退化的问题

    • 网络结构:

在这里插入图片描述

残差块:
在这里插入图片描述
一共是两种残差块,右边的残差块中1x1的卷积,用来改变输入图像的通道数

残差块实现:

  ```python# ResNet网络中模块的构成class ResnetBlock(tf.keras.layers.Layer):# 网络层的定义:输出通道数(卷积核个数),模块中包含的残差块个数,是否为第一个模块def __init__(self,num_channels, num_residuals, first_block=False):super(ResnetBlock, self).__init__()# 模块中的网络层self.listLayers=[]# 遍历模块中所有的层for i in range(num_residuals):# 若为第一个残差块并且不是第一个模块,则使用1*1卷积,步长为2(目的是减小特征图,并增大通道数)if i == 0 and not first_block:self.listLayers.append(Residual(num_channels, use_1x1conv=True, strides=2))# 否则不使用1*1卷积,步长为1 else:self.listLayers.append(Residual(num_channels))      # 定义前向传播过程def call(self, X):# 所有层依次向前传播即可for layer in self.listLayers.layers:X = layer(X)return X```

http://chatgpt.dhexx.cn/article/mEqbwpB9.shtml

相关文章

CNN图片分类(Pytorch)

这篇文章主要讲述用 pytorch 完成简单 CNN 图片分类任务,如果想对 CNN 的理论知识进行了解,可以看我的这篇文章,深度学习(一)——CNN卷积神经网络。 图片分类 我们以美食图片分类为例,有testing、training、validation文件夹。下…

JavaWeb学习思维导图

这是我最近总结的JavaWeb学习思维导图,希望可以帮到大家:

javaweb学习总结

重定向 请求转发 区别:重定向后浏览器地址值会发生改变。 重定向request域对象不能共享数据,因为request域的范围是一次请求一次响应。而转发能够共享数据 请求转发的路径写法,只是需要写url-pattern的地址即可,不用带项目名&am…

JavaWeb学习心得总结

JavaWeb(JSPServlet)新手学习心得总结 说明: 由于篇幅的原因,本文只是对于JavaWeb项目的大致数据流程做一个介绍,同时引出一些JavaWeb开发中很基础的知识点,且不会精确到具体代码实现。 所以本文的适合读…

JavaWeb学习笔记总结(一)

前言:因为我是大三,这学期开课是JavaWeb,前端三剑客htmlcssjs,还有一个springboot框架的课,大二下学期才学的java跟sql,所以跨度直接到springboot有点大吧,ssm框架都没学,但是b站上有挺多教程的&#xff0c…

一.JavaWeb学习路线

Java系统学习路线: 第一阶段 第一阶段: Java 基础,包括 Java 语法,面向对象特征,常见API,集合框架。(基础) 第二阶段:Java API:输入输出,多线程,网络编程,反…

java web学习_JavaWeb学习路线

Java web,是用Java技术来解决相关web互联网领域的技术综合。Web包括:web服务器和web客户端。Java在客户端的应用有Java applet,不过使用很少。Java在服务器端的应用非常的丰富,比如Servlet,JSP和第三方框架等等。java技…

JavaWeb学习笔记

JavaWeb 1.ASP、PHP、JSP ASP: 微软&#xff1a;最早流行的就行ASP 在HTML嵌入VB的脚本 在ASP中&#xff0c;基本一个界面就有几千行代码&#xff0c;页面极其混乱&#xff0c;维护成本高 c#编程语言 IIS服务器 <h1> <% system.out.println("hello") …

javaweb学习路线

一、学习顺序 1、java语法&#xff0c;语法很重要&#xff0c;没有这个根本后面的也进行不下去&#xff0c;建议先学会应用了再去研究jdk源码&#xff0c;本身就是新手就想从原理开始了解&#xff0c;估计非常吃力&#xff0c;效果也不一定好。 2、数据库&#xff0c;首先学关…

JavaWeb知识点汇总

JavaWeb知识点汇总 前言&#xff1a;跟了狂神javaweb学习有一阵子了&#xff0c;这里简单进行笔记总结&#xff0c;也是第一次使用markdown写这么长的文章&#xff0c;虽然是跟着敲的&#xff0c;也是多理解了一遍&#xff0c;以及具体上手自己写的代码和相应效果图。发布于此…

JAVAweb入门基础

1、JAVAweb开发原理 2、web服务器 2.1、技术服务 ASP&#xff08;微软 国内最早流行;在HTML中嵌入了VB的脚本&#xff0c;ASPCom;在ASp开发中&#xff0c;基本一个页面都有几千行的业务代码&#xff0c;页面及其混乱&#xff1b;维护成本高&#xff01;&#xff09; PHP(PHP…

JavaWeb学习知识总结

1.自定义 servlet 的三种方式&#xff0c;及区别? 方式一&#xff1a;编写一个类去实现Servlet接口(必须重写Servlet接口里面所有的抽象方法)方式二&#xff1a;编写一个类去继承GenericServlet抽象类(重写生命周期的service方法&#xff08;抽象法&#xff09;)GenericServle…

JavaWeb学习路线(总结自尚硅谷雷神SSM|极其详细|思路清晰|适合入门/总复习)

文章目录 JavaWeb前言说明前端技术html&#xff08;掌握&#xff09;1.标签 css&#xff08;了解&#xff09;1.简介2.常用样式定义 JavaScript&#xff08;掌握&#xff09;1.简介2.基本语法2.1声明变量2.2声明对象2.3声明方法 3.事件 JQuery&#xff08;精通&#xff09;1.简…

https证书安装部署 https证书怎么安装

http和https是我们上网的时候经常见到的网络协议&#xff0c;当我们进入一个网站的时候&#xff0c;网站的域名有时候是http开头的&#xff0c;有时候又是https开头的&#xff0c;可能你们会好奇&#xff0c;这两者究竟有什么区别呢&#xff1f;https证书又是什么呢&#xff1f…

申请SSL证书,并给域名配置SSL证书,并部署服务器;SSL证书的下载和安装

注&#xff1a;本文相关操作皆由黄色荧光笔标注 申请SSL 我这里以阿里云服务器为例&#xff0c;SSL证书是从阿里云申请的一年免费的证书&#xff0c;付费的也可以参考。 先是登录阿里云控制台&#xff0c;进入&#xff1a;SSL证书&#xff08;数字证书管理服务&#xff09;。…

SSL证书安装部署

微信小程序时刻监控产品的信息&#xff0c;夜里突然没了数据。阿里云服务器故障&#xff1f; 登录云管理&#xff0c;查看一切正常&#xff0c;e-mail有一封邮件显示ssl证书到期&#xff0c;需重新部署。 申请证书 创建证书 在Apache服务器上安装SSL证书 - 数字证书管理服务 -…

如何给网站安装SSL证书?

视频教程&#xff1a;ssl证书安装视频教程&#xff08;b站&#xff09;https://www.bilibili.com/video/BV1P3411h7je 每个站长都有必要为网站安装SSL证书。 首先&#xff0c;我们需要获得一个SSL证书&#xff0c;也称为HTTPS证书。 筛选SSL证书类别需要的思考不亚于流行的垃…

Https证书怎么安装

第一步&#xff1a;首先我们去阿里云申请证书&#xff0c;证书审核完成下载进行部署。至于部署什么类型的&#xff0c;需要跟服务器商确认。 第二步&#xff1a;去服务器端找到SSL部署的配置。 下载申请下来的密钥。填入对应的账户&#xff0c; 完成&#xff01;提示已部署

ssl证书下载与安装 – 如何下载ssl证书

证书是审核完毕后您将会收到&#xff1a; 1. 服务器证书 2. 服务器中级 CA 证书 1、 配置 Apache 打开 apache 安装目录下 /etc/httpd/conf/httpd.conf 文件&#xff0c;找到 #LoadModule ssl_module modules/mod_ssl.so 删除行首的配置语句注释符号“ #” 保存退出。 …

华为云ssl证书申请和安装

华为云ssl证书申请和安装 1.打开网站&#xff0c;点击领取免费证书&#xff0c;点击立即购买。 2.打开华为云控制台&#xff0c;找到云证书管理服务。确认付款后自动跳转&#xff0c;点击申请证书。 填写自己的域名。 填写授权人信息&#xff0c;姓名、电话、邮箱。 3.验证域名…