【python】keras包:深度学习( CNN卷积神经网络 convolution nulear network)

news2024/11/22 14:08:01

CNN卷积神经网络 convolution nulear network

应用场景

图像识别、根据轮廓识别的图像识别

算法逻辑

算法学得好的话,一眼就可以看出MLP就是暴力算法,时间效率低。因此希望提升效率。
剪枝方法: 先提取图像的关键信息(轮廓),再对其进行mlp模型训练
图像卷积运算: 用于提取图像的关键信息。数学原理是,对图像矩阵与滤波器矩阵进行对应相乘再求和运算,从而得到新的矩阵,这样

轮廓过滤器

数学原理讲解链接
轮廓过滤器: 根据上述数学原理证明,在这样的矩阵乘法下, 可以快速定位轮廓特征。可以寻找横向轮廓过滤器纵向轮廓过滤器sobel过滤器
在这里插入图片描述
对于彩色图片,彩色图片是由三张图组成(即red,green,blue),图片是单张图的规格是xy3大小,因此需要对3个图分别进行卷积,再相加

池化

池化层实现维度缩减: 按照一定规则对图像矩阵进行处理,将其转换为更低维度的矩阵
最大池化法
在这里插入图片描述
poolint_size 指 滑动窗口的大小
stride(2,2) 表示窗口的滑动步长
平均法池化
在这里插入图片描述

激活函数relu函数

f(x) = max(x,0)
作用:使得部分神经元为0,防止过拟合;有助于模型求解

算法效果

参数共享

同一个特征过滤器可以用于整张图片。
(可以用竖向特征过滤器,将整个图片中的竖向轮廓获取)

稀疏连接

生成的特征图片的每个节点只与原图中的特殊节点连接
依据:轮廓具有连续性,因此可以降低计算数据量的同时,不会对核心信息折损。

边缘信息折损

滑动窗口方法带来的问题:边缘信息只被计算少次,而中间信息会被多次计算
解决:图像填充在边缘添加新的空像素。

经典的CNN模型

LeNet-5

输入:32*32灰度图
训练参数:约60,000个
特点:1. 随着网络越深,图像高度和宽度越小,通道数增加
2. 卷积与池化先后成对使用
LeNet-5 论文

流程图流程图

AlexNet

输入:2272273 RGB图(彩色图)
训练参数:60,000,000个
特点:1. 适用于识别较为复杂的彩色图,可识别1000种类别
2. 结构比LeNet更复杂,使用Relu作为激活函数

AlexNet 论文

VGG-16

输入:2242243 RGB图(彩色图)
训练参数:138,000,000个
特点:1. 所有卷积层的filter的宽和高都是3,步长为1
2. 所有池化层filter的宽和高都是2,步长为2
3. 相比alexnet,有更多的filter用于提取轮廓信息,具更高精准性
使用介绍
python中的VGG包,主要用于抓取图片特征;一般借助VGG算法抓取特征后,通过MLP算法进行训练和预测

算法流程

step1. 图像加载

step 2. 图像预处理

图像增强
图像预处理
数值归一化
旋转、缩放、平移

step 3. 建立模型

模型结构
卷积层
池化层

CNN实战

任务一:猫和狗识别 (基于CNN模型实现)

基于dataset\training_set数据,建立CNN模型
进行训练数据集的训练,并从网上下载任意猫和狗的图片,对其进行预测
数据加载与预处理

from keras.preprocessing.image import ImageDataGenerator
#图像预处理
train_datagen = ImageDataGenerator (rescale = 1./255)
#图像加载
training_set = train_datagen.flow_from_directory(
	'./Dataset/training_set',  # 从文件夹加载图像
	target_size = (50,50),  #图像尺寸转换为 50*50
	batch_size =32,  #CNN求解时,每次选取32个图片进行求解
	#batchsize越小,loss函数下降越不稳定
	class_mode = 'binary' #采取二分类模式
)

建立CNN模型

from keras.models import Sequential
from keras.layers import Conv2D,MaxPooling2D,Flatten,Dense
#顺序模型
model = Sequential()
#卷积层
model.add( 
    Conv2D(
		32,(3,3), #32个 3*3 大小的 过滤器
		input_shape = (50,50,3), #输入数据为50*50的RBG图
		activation = 'relu',#  激活函数用relu
    )
)
#池化层
model.add(
    MaxPooling2D(
        pool_size=(2,2),#用2*2大小的池子
        strides=None, #步幅大小默认为1
    )
)
# 根据情况多添加几个(卷积、池化)层组

#Flattening层
model.add(Flatten()) #作用:把m行n列,转换为m*n行1列

#隐藏层
model.add(Dense(units=128,activation='relu'))
#输出层
model.add(Dense(units=1,activation='sigmoid'))

训练与评估

#配置模型
#参数配置
model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy']
)
#查看模型结构
model.summary()
#训练模型
model.fit_generator(training_set, epochs=25)
#评估模型
model.evaluate_generator(training_set)

标签编码表

training_set.class_indices

任务二:猫狗识别(基于VGG16模型,结合MLP模型实现)

基于dataset\data_vgg数据,建立CNN模型
进行训练数据集的训练,并从网上下载任意猫和狗的图片,对其进行预测

Step1. 构建特征抓取函数(VGG-16算法)
‘-VGG模型建立-’

from keras.applications.vgg16 import VGG16
from keras.applications.vgg16 import preprocess_input
#VGG 模型
model_vgg = VGG16(
    weights='imagenet', #图像的特征提取结构
    include_top=False # 不需要全连接层
)

‘-特征抓取函数-’ :仅保留图片的特征部分,返回值仍为图片

import numpy as np
from keras.utils import image_utils
#抓取函数
def feature_catch(img_path,model):
    img = image_utils.load_img( 
        img_path,
        target_size=(224,224)
    )
    img = image_utils.img_to_array(img)
    x = np.expand_dims(img,axis=0) #x是 增加一个维度后的img
    x = preprocess_input(x)
    x_vgg = model.predict(x) #x仍为图片形式
    x_vgg = x_vgg.reshape(1,7*7*512) #x被摊开为一维数组
    #  7*7*512这个参数,源自于单图特征抓取实验后显示的结果
    return x_vgg
# 调用即可

Step 2. 训练数据集导入 与 特征抓取

features = []
label = []
num = int(input("从训练集提取多少张图片进行训练?(1.2w以内整数)"))
#猫图特征抓取
for i in range(0,num):
    img_path = './文件夹/cat.'+str(i)+'.jpg'
    res = feature_catch(img_path,model_vgg)
    res = res.reshape(7*7*512)
    features.append(res)
    label.append('cat')
#狗图特征抓取
for i in range(0,num):
    img_path = './文件夹/dog.'+str(i)+'.jpg'
    res = feature_catch(img_path,model_vgg)
    res = res.reshape(7*7*512)
    features.append(res)
    label.append('dog')
print('-----------Feature-Catch finished--------------')

Step 3. 数据分离
Step 4. MLP模型建立
Step 5. MLP模型训练
Step 6. 预测与评估
step3 ~ step6 与 前文提到的MLP算法一致。

小结
即:从逻辑上来说,VGG算法的作用就是,把图像信息中重要的特征进行了抓取,每张图片的特征信息最终都被转换为一维数组的形式。
设 特征信息的像素 有n个点,
则 问题转换为:n维数据 与 标签 的分类问题
因此后续直接使用MLP求解即可。

补:单图预测的代码

from keras.utils import image_utils
from matplotlib import pyplot as plt
#图片导入
img_path = '1.jpg'
img = image_utils.load_img( 
    img_path,
    target_size=(224,224)
)
plt.imshow(img)
plt.show()
img = image_utils.img_to_array(img)
type(img)
# 图片特征抓取
from keras.applications.vgg16 import VGG16
from keras.applications.vgg16 import preprocess_input
import numpy as np
#格式转换
x = np.expand_dims(img,axis=0) #x是 增加一个维度后的img
x = preprocess_input(x) 
print(x.shape)
#特征提取
features = model_vgg.predict(x)
print('features.shape',features.shape)
#flatten,摊开成一维数组
features = features.reshape(1,7*7*512)
#prediction
result = model.predict(features)
result=np.argmax(result,axis=1)
print(result,end=":")
if(result[0]==1):
    print("This is a dog!")

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

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

相关文章

树莓派系统配置-raspi-config

在终端内输入 sudo raspi-config 显示如下界面,左上方是树梅派的型号及版本信息。: 设置界面操作介绍 该配置工具中可以用键盘 ↑ ↓ ← → 进行选择,按 tab 在条目间切换,按 enter 确认,按 esc 返回。在二三级菜单…

(二)PID控制的Anti-windup

比例环节:快速接近目标积分环节:防止稳态误差微分环节:减少振荡 被控对象可以分为两个部分,分别是执行器,用于产生力或者能量从而改变系统,和处理,比如说温控的加热过程。在现实世界中&#xf…

PCL学习六:Filtering-滤波

参考引用 Point Cloud Library黑马机器人 | PCL-3D点云 1. 点云滤波概述 1.1 背景 在获取点云数据时,由于设备精度、操作者经验、环境因素等带来的影响,以及电磁波衍射特性、被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中将…

java的spi机制使用场景讲解和具体使用

八股文背多了,相信大家都听说过一个词,SPI扩展。 有的面试官就很喜欢问这个问题,SpringBoot的自动装配是如何实现的? 基本上,你一说是基于spring的SPI扩展机制,再把spring.factories文件和EnableAutoConf…

回收站文件恢复,分享4个巧妙解决方法!

案例:回收站文件怎么恢复 【清理电脑时一不小心清空了我的回收站,有朋友知道该怎么恢复吗?急急急!】 回收站对于电脑用户来说,可以带来很多的方便,能让用户能够在删除文件后将其恢复。但是,有…

C++之正则表达式

目录 #include • .:换行符以外的任何字符 • […]:…字符中的任何一个 • [^…]:…字符之外的任何一个 • [[:charclass:]]:指定之字符类charclass中的一个 • \n, \t, \f, \r, \v:换行符,tab符号&#xf…

协程实现原理

大家好,我是易安!今天我们来探讨一个问题,Go 协程的实现原理。此“协程”非彼”携程“。 线程实现模型 讲协程之前,我们先看下线程的模型。 实现线程主要有三种方式:轻量级进程和内核线程一对一相互映射实现的1:1线程…

自动驾驶经验分享

人生经验总结 第一个要聊的就是在自动驾驶行业工作的这几年,有什么人生经验可以总结一下。 我觉得从这几个方面,首先第一个是能力上,能力上你需要去锻炼,做成功一件事情的一个能力;技术上,对前沿的技术要…

并发编程java

1、CountDownLatch: 如果我们知道了我们的需要执行的任务数,那么我们可以用java并发包下的CountDownLatch,直接上代码: public class CountDownLaunch {private static final Executor executor Executors.newFixedThreadPool(…

SpringBoot参数校验

简单数据类型 SpringBoot自带了validation工具可以从后端对前端传来的参数进行校验&#xff0c;用法如下&#xff1a; 引入validation起步依赖 <!-- 参数校验 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>sprin…

springboot、SpringCloud 常见版本版本介绍

官方版本号&#xff08;2023年5月6日&#xff09; Spring Boot 版本说明 Spring Boot的版本号分析&#xff1a; Spring Boot的版本以数字表示。例如&#xff1a;Spring Boot 2.4.1.RELEASE --> 主版本.次版本.增量版本&#xff08;Bug修复&#xff09; 主版本&#xff0c…

学系统集成项目管理工程师(中项)系列18a_进度管理(上)

1. 规划项目进度管理 1.1. 为实施项目进度管理制定政策、程序&#xff0c;并形成文档化的项目进度管理计划的过程 1.2. 输入 1.2.1. 项目管理计划 1.2.1.1. 范围基准 1.2.1.2. 其他信息 1.2.2. 项目章程 1.2.2.1. 【19下选43】 1.2.2.2. 项目章程中规定的项目审批要求和总…

python ---->>利用 urllib 库获取网络资源

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 &#xff08;1&#xff09;关于Python基本语法学习---->可以参考我的这篇博客《我在VScode学Python》 &#xff08;2&#xff09;pip是必须的在我们学习python这门语言的过程中Python ----&#xff1e;&a…

SAP: SMARTFORMS

事务码&#xff1a;SMARTFORMS 1、输入表格名&#xff0c;点击创建/更改/显示 2、设置页格式 查看页格式事务码&#xff1a;SPAD 创建的详细流程&#xff1a;详见博客ABAP开发Smartform实例_abap smartform_小强pp的博客-CSDN博客 SMARTFORMS TEMPLATE使用方法_Seele_1018的…

MT6771安卓手机核心板MT6771核心板方案智能模块

MT6771核心板是一款基于MTK平台、工业级高性能、可运行android10.0操作系统的4GAI安卓智能模块&#xff0c;核心处理器架构采用ARM4xCortex-A73upto2.0GHzARM4xCortex-A53upto2.0GHz&#xff0c;为智能设备提供了很好的运算支持。很高兴看到这个模块集成了4G LTE连接和高能效。…

界面开发框架Qt新手入门 - 自定义排序/筛选模型示例(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 自定义排序/筛选模型…

ALOHA 开源机械臂(Viper 300 Widow X 250 6DOF机械臂组成)第一部分

软件简介&#xff1a; ALOHA 即 A Low-cost Open-source Hardware System for Bimanual Teleoperation&#xff0c;是一个低成本的开源双手遥控操作硬件系统&#xff0c;即开源机械臂。其算法 Action Chunking with Transformers (ACT) 采用了神经网络模型 Transformers&#…

#杂谈 个人嵌入式开发的学习

本人目前从事的是嵌入式软件开发的相关工作。这是一个关于个人做项目时用过的开发工具的杂谈&#xff0c;仅是为了记录学习经历&#xff0c;同时也为和我有同样瞎搞东西的爱好者提供一个学习思路。 前言 我的技术栈&#xff1a; 下面介绍一下我用过在或者还在用的开发工具&…

JavaWeb综合案例-Servlet优化

将WebServlet的访问路径不要写死&#xff0c;写成通配符的形式 1. 反射笔记&#xff08;后续代码会用到该机制&#xff09; 1.1 基础概念 JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&am…

【Nodejs】Express实现接口

介绍 Express 是一个第三方模块&#xff0c;用于快速搭建服务器 类似于jquery与DOMExpress 是一个基于 Node.js 平台&#xff0c;快速、开放、极简的 web 开发框架。express保留了http模块的基本API&#xff0c;使用express的时候&#xff0c;也能使用http的APIexpress还额外封…