深度学习-机器视觉part2

深度学习-机器视觉part2

文章目录

  • 深度学习-机器视觉part2
    • 一、从卷积到卷积神经网络
    • 二、手撕卷积代码
      • 2.1 动机
      • 2.2 数据集
      • 2.3 卷积操作
        • 2.3.1 填充(padding)
        • 2.3.2 卷积块
        • 2.3.3 池化
        • 2.3.4 Softmax
      • 2.4 完整CNN
      • 2.5 训练改进
    • 三、经典CNN模型介绍
    • 四、CNN模型的实际应用
    • 参考

一、从卷积到卷积神经网络

深度学习-机器视觉part1

二、手撕卷积代码

2.1 动机

通过普通的神经网络可以实现,但是现在图片越来越大,如果通过 NN 来实现,训练的参数太多。例如 224 x 224 x 3 = 150,528,隐藏层设置为 1024 就需要训练参数 150,528 x 1024 = 1.5 亿 个,这还是第一层,因此会导致我们的网络很庞大。

另一个问题就是特征位置在不同的图片中会发生变化。例如小猫的脸在不同图片中可能位于左上角或者右下角,因此小猫的脸不会激活同一个神经元。

2.2 数据集

我们使用手写数字数据集 MNIST 。

在这里插入图片描述

每个数据集都以一个 28x28 像素的数字。

普通的神经网络也可以处理这个数据集,因为图片较小,另外数字都集中在中间位置,但是现实世界中的图片分类问题可就没有这么简单了,这里只是抛砖引玉哈。

2.3 卷积操作

CNN 相较于 NN 来说主要是增加了基于 convolution 的卷积层。卷基层包含一组 filter,每一个 filter 都是一个 2 维的矩阵。以下为 3x3 filter:

我们可以通过输入的图片和上面的 filter 来做卷积运算,然后输出一个新的图片。包含以下步骤:

    • 将 filter 叠加在图片的顶部,一般是左上角
    • 然后执行对应元素的相乘
    • 将相乘的结果进行求和,得到输出图片的目标像素值
    • 重复以上操作在所有位置上
2.3.1 填充(padding)

可以通过在周围补 0 实现输出前后图像大小一致,如下所示:

在这里插入图片描述

这叫做 “same padding”,不过一般不用 padding,叫做 “valid” padding。

2.3.2 卷积块

CNN 包含卷基层,卷基层通过一组 filter 将输入的图片转为输出的图片。卷基层的主要参数是 filter 的个数。

对于 MNIST CNN,我使用一个含有 8 个 filter 的卷基层,意味着它将 28x28 的输入图片转为 26x26x8 的输出集:

在这里插入图片描述

import numpy as npclass Conv3x3:# A Convolution layer using 3x3 filters.def __init__(self, num_filters):self.num_filters = num_filters# filters is a 3d array with dimensions (num_filters, 3, 3)# We divide by 9 to reduce the variance of our initial valuesself.filters = np.random.randn(num_filters, 3, 3) / 9

接下来,具体实现卷基层:

class Conv3x3:def iterate_regions(self, image):h,w = image.shapefor i in range(h-2):for j in range(w-2):im_region = image[i:(i+3),j:(j+3)]yield  im_region, i, jdef forward(self, input):h,w = input.shapeoutput = np.zeros((h-2,w-2,self.num_filters))for im_region,i,j in self.iterate_regions(input):output[i,j] = np.sum(im_region * self.filters, axis = (1,2))return output 
2.3.3 池化
import numpy as npclass MaxPool2:# A Max Pooling layer using a pool size of 2.def iterate_regions(self, image):'''Generates non-overlapping 2x2 image regions to pool over.- image is a 2d numpy array'''# image: 26x26x8h, w, _ = image.shapenew_h = h // 2new_w = w // 2for i in range(new_h):for j in range(new_w):im_region = image[(i * 2):(i * 2 + 2), (j * 2):(j * 2 + 2)]yield im_region, i, jdef forward(self, input):'''Performs a forward pass of the maxpool layer using the given input.Returns a 3d numpy array with dimensions (h / 2, w / 2, num_filters).- input is a 3d numpy array with dimensions (h, w, num_filters)'''# input: 卷基层的输出,池化层的输入h, w, num_filters = input.shapeoutput = np.zeros((h // 2, w // 2, num_filters))for im_region, i, j in self.iterate_regions(input):output[i, j] = np.amax(im_region, axis=(0, 1))return output
2.3.4 Softmax
  • 用法

我们将要使用一个含有 10 个节点(分别代表相应数字)的 softmax 层,作为我们 CNN 的最后一层。最后一层为一个全连接层,只是激活函数为 softmax。经过 softmax 的变换,数字就是具有最高概率的节点。

在这里插入图片描述

  • 交叉熵损失函数

交叉熵损失函数用来计算概率间的距离:
H ( p , q ) = − ∑ x p ( x ) l n ( q ( x ) ) H(p,q) = - \sum_xp(x)ln(q(x)) H(p,q)=xp(x)ln(q(x))
其中: p ( x ) p(x) p(x)为真实概率, q ( x ) q(x) q(x)为预测概率, H ( p , q ) H(p,q) Hp,q为预测结果与真实结果的差距

  • 代码
import numpy as npclass Softmax:# A standard fully-connected layer with softmax activation.def __init__(self, input_len, nodes):# We divide by input_len to reduce the variance of our initial values# input_len: 输入层的节点个数,池化层输出拉平之后的# nodes: 输出层的节点个数,本例中为 10# 构建权重矩阵,初始化随机数,不能太大self.weights = np.random.randn(input_len, nodes) / input_lenself.biases = np.zeros(nodes)def forward(self, input):'''Performs a forward pass of the softmax layer using the given input.Returns a 1d numpy array containing the respective probability values.- input can be any array with any dimensions.'''# 3d to 1d,用来构建全连接网络input = input.flatten()input_len, nodes = self.weights.shape# input: 13x13x8 = 1352# self.weights: (1352, 10)# 以上叉乘之后为 向量,1352个节点与对应的权重相乘再加上bias得到输出的节点# totals: 向量, 10totals = np.dot(input, self.weights) + self.biases# exp: 向量, 10exp = np.exp(totals)return exp / np.sum(exp, axis=0)

2.4 完整CNN

import mnist
import numpy as np# We only use the first 1k testing examples (out of 10k total)
# in the interest of time. Feel free to change this if you want.
test_images = mnist.test_images()[:1000]
test_labels = mnist.test_labels()[:1000]conv = Conv3x3(8)                                    # 28x28x1 -> 26x26x8
pool = MaxPool2()                                    # 26x26x8 -> 13x13x8
softmax = Softmax(13 * 13 * 8, 10) # 13x13x8 -> 10def forward(image, label):'''Completes a forward pass of the CNN and calculates the accuracy andcross-entropy loss.- image is a 2d numpy array- label is a digit'''# We transform the image from [0, 255] to [-0.5, 0.5] to make it easier# to work with. This is standard practice.# out 为卷基层的输出, 26x26x8out = conv.forward((image / 255) - 0.5)# out 为池化层的输出, 13x13x8out = pool.forward(out)# out 为 softmax 的输出, 10out = softmax.forward(out)# Calculate cross-entropy loss and accuracy. np.log() is the natural log.# 损失函数的计算只与 label 的数有关,相当于索引loss = -np.log(out[label])# 如果 softmax 输出的最大值就是 label 的值,表示正确,否则错误acc = 1 if np.argmax(out) == label else 0return out, loss, accprint('MNIST CNN initialized!')loss = 0
num_correct = 0
# enumerate 函数用来增加索引值
for i, (im, label) in enumerate(zip(test_images, test_labels)):# Do a forward pass._, l, acc = forward(im, label)loss += lnum_correct += acc# Print stats every 100 steps.if i % 100 == 99:print('[Step %d] Past 100 steps: Average Loss %.3f | Accuracy: %d%%' %(i + 1, loss / 100, num_correct))loss = 0num_correct = 0

此代码为原理代码,使用随机数进行学习和训练,效果不佳,准确率大概为10%左右,还需要改进。

2.5 训练改进

import mnist
import numpy as np# We only use the first 1k examples of each set in the interest of time.
# Feel free to change this if you want.
train_images = mnist.train_images()[:1000]
train_labels = mnist.train_labels()[:1000]
test_images = mnist.test_images()[:1000]
test_labels = mnist.test_labels()[:1000]conv = Conv3x3(8)                                    # 28x28x1 -> 26x26x8
pool = MaxPool2()                                    # 26x26x8 -> 13x13x8
softmax = Softmax(13 * 13 * 8, 10) # 13x13x8 -> 10def forward(image, label):'''Completes a forward pass of the CNN and calculates the accuracy andcross-entropy loss.- image is a 2d numpy array- label is a digit'''# We transform the image from [0, 255] to [-0.5, 0.5] to make it easier# to work with. This is standard practice.out = conv.forward((image / 255) - 0.5)out = pool.forward(out)out = softmax.forward(out)# Calculate cross-entropy loss and accuracy. np.log() is the natural log.loss = -np.log(out[label])acc = 1 if np.argmax(out) == label else 0return out, loss, acc# out: vertor of probability# loss: num# acc: 1 or 0def train(im, label, lr=.005):'''Completes a full training step on the given image and label.Returns the cross-entropy loss and accuracy.- image is a 2d numpy array- label is a digit- lr is the learning rate'''# Forwardout, loss, acc = forward(im, label)# Calculate initial gradientgradient = np.zeros(10)gradient[label] = -1 / out[label]# Backpropgradient = softmax.backprop(gradient, lr)gradient = pool.backprop(gradient)gradient = conv.backprop(gradient, lr)return loss, accprint('MNIST CNN initialized!')# Train the CNN for 3 epochs
for epoch in range(3):print('--- Epoch %d ---' % (epoch + 1))# Shuffle the training datapermutation = np.random.permutation(len(train_images))train_images = train_images[permutation]train_labels = train_labels[permutation]# Train!loss = 0num_correct = 0# i: index# im: image# label: labelfor i, (im, label) in enumerate(zip(train_images, train_labels)):if i > 0 and i % 100 == 99:print('[Step %d] Past 100 steps: Average Loss %.3f | Accuracy: %d%%' %(i + 1, loss / 100, num_correct))loss = 0num_correct = 0l, acc = train(im, label)loss += lnum_correct += acc# Test the CNN
print('\n--- Testing the CNN ---')
loss = 0
num_correct = 0
for im, label in zip(test_images, test_labels):_, l, acc = forward(im, label)loss += lnum_correct += accnum_tests = len(test_images)
print('Test Loss:', loss / num_tests)
print('Test Accuracy:', num_correct / num_tests)

三、经典CNN模型介绍

未完待续

四、CNN模型的实际应用

未完待续

参考

Python 徒手实现 卷积神经网络 CNN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.Net添加Swagger注释

文章目录 Swagger添加Swagger注释 Swagger 添加Swagger注释 1、右击项目->选择属性->点击生成->输出,选中文档文件 2、配置服务 在program.cs 文件里配置SwaggerUI //增加项一 builder.Services.AddSwaggerGen(c> {c.SwaggerDoc("v1", ne…

如何将本地仓库放到远程仓库中

在我们仓库创建好之后&#xff0c;我们复制好ssh 接着我们需要使用git remote add<shortname><url>这个命令 shortname就是我们远程仓库的别名 接着使用git remote -v这个命令查看一下目前远程仓库的别名和地址 原本还有一个指令git branch -M main 指定分支的名…

软考高级架构师:嵌入式数据库概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

EXCEL地理数据处理工具(地图任务)

版本号 作者 修订内容 发布日期 1.0 小O 更新至0705版 2022-4-28 1.1 小O 更新至0772版 2024年4月3日 一、概述 小O地图EXCEL插件版提供基于EXCEL表格进行地理数据处理、地图可视化、地图绘图等功能&#xff0c;地理工具是用户使用频率很高的功能模块。地理工具能…

京东云服务器4核8G主机租用价格418元一年,1899元3年

京东云轻量云主机4核8G服务器租用价格418元一年&#xff0c;1899元3年&#xff0c;配置为&#xff1a;轻量云主机4C8G-180G SSD系统盘-5M带宽-500G月流量&#xff0c;京东云主机优惠活动 yunfuwuqiba.com/go/jd 可以查看京东云服务器详细配置和精准报价单&#xff0c;活动打开如…

Day108:代码审计-PHP模型开发篇MVC层动态调试未授权脆弱鉴权未引用错误逻辑

目录 案例1-Xhcms-动态调试-脆弱的鉴权逻辑 案例2-Cwcms-动态调试-未引用鉴权逻辑 案例3-Bosscms-动态调试-不严谨的鉴权逻辑 知识点&#xff1a; 1、PHP审计-动态调试-未授权安全 2、PHP审计-文件对比-未授权安全 3、PHP审计-未授权访问-三种形态 动态调试优点: 环境配置&…

BFS(扫雷游戏、Tokitsukaze and Development Task、全球变暖)

注&#xff1a;1. 列举搜索方位dx,dy 2. 借助队列queue<> 3. 出队&#xff0c;入队操作 题目1:P2670 [NOIP2015 普及组] 扫雷游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码&#xff1a; #include<bits/stdc.h> using namespace std; char c[105][105…

Linux--03---虚拟机网络配置、拍摄快照和克隆

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.虚拟机网络配置1.虚拟机的联网模式模式1 仅主机模式特点模式2 桥接模式特点模式3 NAT模式特点关于模式的选择 2. 修改网络配置信息3.修改虚拟机ens33网卡的网络配…

2. Django配置信息

第2章 Django配置信息 Django的配置文件settings.py用于配置整个网站的环境和功能, 核心配置必须有项目路径, 密钥配置, 域名访问权限, App列表, 中间件, 资源文件, 模板配置, 数据库的连接方式.* 项目运行时, 如果修改代码, 项目会自动检测发现改动后会重新运行, 除非报错否…

Tomcat管理配置

Tomcat管理配置 1 host-manager项目2 manager项目 Tomcat 提供了Web版的管理控制台&#xff0c;位于webapps目录下。Tomcat 提供了用于管理Host的host-manager和用于管理Web应用的manager。 1 host-manager项目 Tomcat启动之后&#xff0c;可以通过 http://localhost:8080/ho…

Android 的网络加载

发起网络请求的过程 当用户在应用程序中输入网址或关键字时&#xff0c;应用程序会发起网络请求。这个过程大致如下&#xff1a; 应用程序将请求发送到服务器&#xff0c;服务器返回响应数据。应用程序接收到响应数据后&#xff0c;将其转换为应用程序可识别的数据格式。应用…

qt-C++笔记之QLabel加载图片

qt-C笔记之QLabel加载图片 —— 2024-04-06 夜 code review! 文章目录 qt-C笔记之QLabel加载图片0.文件结构1.方法一&#xff1a;把图片放在项目路径下&#xff0c;在 .pro 文件中使用 DISTFILES添加图片文件1.1.运行1.2.qt_test.pro1.3.main.cpp 2.方法二&#xff1a;不在 .pr…

院内感染的相关因素分析(Boruta联合SHAP分析2)R

院内感染的相关因素分析&#xff08;Boruta联合SHAP分析2&#xff09;R 和鲸社区一键运行代码 院内感染是指住院患者在医疗机构内发生的感染&#xff0c;是医院管理中常见且严重的问题。院内感染不仅会延长患者住院时间&#xff0c;增加医疗费用&#xff0c;还会严重威胁患者生…

vim美化配置(懒人版)

文章目录 配置vim&#xff08;懒人版&#xff09;1.搜索资源2.安装3.自定义缩进4.卸载方法 配置vim&#xff08;懒人版&#xff09; 1.搜索资源 打开gitee&#xff0c;注意到上面的搜索框 搜索 vimforcpp 进入&#xff0c;找到安装方法中的链接 2.安装 复制粘贴到linux中的命…

Windows IIS搭建FTP服务器、FTP用户隔离、Serv-U搭建FTP服务器

一、搭建FTP服务器 Server: 新建文件夹bbb&#xff0c;里面存放两个文件 Client: &#xff08;1&#xff09;通过资源管理器访问FTP &#xff08;2&#xff09;DOS命令访问FTP 下载bbb..txt 上传aaa.txt文件 查看上传情况 二、通过IIS服务中的FTP实现隔离用户 Server&#x…

doccano标注工具|为机器学习建模做数据标注

目录 一、标记流程 二、配置环境 2.1 安装 2.2 运行doccano 三、案例 3.1 创建项目 3.2 上传数据 3.3 定义标签 3.4 添加成员 3.5 开始标注 3.6 导出数据 3.7 导出数据 doccano doccano是开源的数据…

java小作业(5)--编写一个三角形类(第一遍)

1.题目&#xff1a; 2.代码&#xff1a; public class Xain{ //定义类名&#xff0c;要与文件.class名字一样private double yibian; //封装private double erbian;private double sanbian;public Xain(double yibian,double erbian,double sanbian){ //初始化…

分享three.js实现乐高小汽车

前言 Web脚本语言JavaScript入门容易&#xff0c;但是想要熟练掌握却需要几年的学习与实践&#xff0c;还要在弱类型开发语言中习惯于使用模块来构建你的代码&#xff0c;就像小时候玩的乐高积木一样。 应用程序的模块化理念&#xff0c;通过将实现隐藏在一个简单的接口后面&a…

Azkaban集群模式部署详细教程

序言 Azkaban是一个用于工作流程调度和任务调度的开源工具&#xff0c;它可以帮助用户轻松地管理和监控复杂的工作流程。Azkaban的架构设计旨在提供高度可扩展性和可靠性&#xff0c;同时保持易用性和灵活性。 Azkaban的架构可以分为三个主要组件:Executor、Web Server和db数据…

【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历

先序遍历&#xff1a;根-左-右中序遍历&#xff1a;左-根-右后序遍历&#xff1a;左-右-根 94. 二叉树的中序遍历 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3…