CV预测:快速使用ResNet深度残差神经网络并创建自己的训练集

AI预测相关目录

AI预测流程,包括ETL、算法策略、算法模型、模型评估、可视化等相关内容
最好有基础的python算法预测经验

  1. EEMD策略及踩坑
  2. VMD-CNN-LSTM时序预测
  3. 对双向LSTM等模型添加自注意力机制
  4. K折叠交叉验证
  5. optuna超参数优化框架
  6. 多任务学习-模型融合策略
  7. Transformer模型及Paddle实现
  8. 迁移学习在预测任务上的tensoflow2.0实现
  9. holt提取时序序列特征
  10. TCN时序预测及tf实现
  11. 注意力机制/多头注意力机制及其tensorflow实现
  12. 一文解析AI预测数据工程
  13. FITS:一个轻量级而又功能强大的时间序列分析模型
  14. DLinear:未来预测聚合历史信息的最简单网络
  15. LightGBM:更好更快地用于工业实践集成学习算法
  16. 面向多特征的AI预测指南
  17. 大模型时序预测初步调研【20240506】
  18. Time-LLM :超越了现有时间序列预测模型的学习器
  19. CV预测:快速使用LeNet-5卷积神经网络
  20. CV预测:快速使用ResNet深度残差神经网络并创建自己的训练集

文章目录

  • AI预测相关目录
  • 研究背景
  • 算法设计
  • 实际应用
    • 数据集构建及训练代码:
    • 预测代码:
    • Resnet源码


研究背景

网络的层数越深,理想情况下,网络模型的学习效果越好。但是实际中,单纯地增加网络的深度,网络会变得越来越难训练,而且精度会达到饱和。这主要是由于两种问题造成的:

  • (1)梯度弥散/爆炸现象
  • (2)退化问题

梯度弥散:又称为梯度消失。在深度神经网络中,如果梯度在反向传播过程中变得非常小,那么权重更新将非常缓慢,导致模型训练非常缓慢或无法收敛。这通常发生在使用Sigmoid或Tanh激活函数的深层网络中。
梯度爆炸:与梯度消失相反,梯度爆炸发生在梯度变得非常大,导致权重更新过大,模型变得不稳定,甚至导致训练过程崩溃。
此外,当模型在训练过程中逐渐失去对某些特征的敏感性,而过度依赖其他特征时,可能会发生特征退化。

解决这些退化现象的方法包括但不限于:使用正则化技术(如L1、L2正则化)、使用不同的激活函数、调整学习率、使用更复杂的优化算法、数据增强、早停法等。
但都治标不治本
直到深度残差网络思想的出现,它直接改进网络架构

算法设计

残差学习的基本思想是,如果一个较浅的网络已经能够学习到某些特征,那么在增加网络深度时,可以通过添加恒等映射(即直接将输入复制到输出)来保持这些特征,而不是强迫网络学习恒等函数。这样,即使网络非常深,也能保证网络性能不会下降。
ResNet由多个残差块(Residual Blocks)组成,每个残差块包含两个卷积层,以及一个跳过连接(Skip Connection),它将块的输入直接添加到块的输出。这种设计允许梯度在网络中直接流动,从而缓解了梯度消失问题。
具体如下所示:
在这里插入图片描述
在这里插入图片描述
当然,残差块中的卷积层数量、大小可以进行定制,这在学术上叫做“瓶颈结构”,可灵活升降维处理特征;残差可直接加到输出结果中,也可以进行采样,这在学术上叫做“尺寸匹配”,以上种种。但实际的应用开发中,我们其实并不需要关心这些细节设计,了解其架构总体思想即可
因为其思想下的优秀设计已经有了开源的现成品可以直接使用。
经典设计:
在这里插入图片描述

实际应用

数据集构建及训练代码:

数据集长成这样:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码:

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import numpy as np
from tensorflow import keras
from tensorflow.keras import layers, optimizers, datasets, Sequential, metrics,models  # 导入TF子库
from resnet import resnet18


#数据准备
train_dir = r'C:\Users\12258\Desktop\maoniushibie1221\data\train'


#数据处理
def get_files(file_dir):
	# 存放图片类别和标签的列表:第0类
	list_0 = []
	label_0 = []
	# 存放图片类别和标签的列表:第1类
	list_1 = []
	label_1 = []
	# 存放图片类别和标签的列表:第2类
	list_2 = []
	label_2 = []
	# 存放图片类别和标签的列表:第3类
	list_3 = []
	label_3 = []
	# 存放图片类别和标签的列表:第4类
	list_4 = []
	label_4 = []
	list_5 = []
	label_5 = []
	list_6 = []
	label_6 = []


	for file in os.listdir(file_dir):
		# print(file)
		#拼接出图片文件路径
		image_file_path = os.path.join(file_dir,file)
		for image_name in os.listdir(image_file_path):
			# print('image_name',image_name)
			#图片的完整路径
			image_name_path = os.path.join(image_file_path,image_name)
			# print('image_name_path',image_name_path)
			#将图片存放入对应的列表
			if image_file_path[-1:] == '1':
				list_0.append(image_name_path)
				label_0.append(0)
			elif image_file_path[-1:] == '2': 
				list_1.append(image_name_path)
				label_1.append(1)
			elif image_file_path[-1:] == '3':
				list_2.append(image_name_path)
				label_2.append(2)
			elif image_file_path[-1:] == '4':
				list_3.append(image_name_path)
				label_3.append(3)
			elif image_file_path[-1:] == '5':
				list_3.append(image_name_path)
				label_3.append(4)
			elif image_file_path[-1:] == '6':
				list_3.append(image_name_path)
				label_3.append(5)
			else :
				list_4.append(image_name_path)
				label_4.append(6)
            

	# 合并数据
	image_list = np.hstack((list_0, list_1, list_2, list_3, list_4,list_5,list_6))
	label_list = np.hstack((label_0, label_1, label_2, label_3, label_4,label_5,label_6))
	#利用shuffle打乱数据
	temp = np.array([image_list, label_list])
	temp = temp.transpose()  # 转置
	np.random.shuffle(temp)
	
	#将所有的image和label转换成list
	image_list = list(temp[:, 0])
	image_list = [i for i in image_list]
	label_list = list(temp[:, 1])
	label_list = [int(float(i)) for i in label_list]
	# print(image_list)
	# print(label_list)
	return image_list, label_list

def get_tensor(image_list, label_list):
	ims = []
	for image in image_list:
		#读取路径下的图片
		x = tf.io.read_file(image)
		#将路径映射为照片,3通道
		x = tf.image.decode_jpeg(x,channels=3)
		#修改图像大小
		x = tf.image.resize(x,[56,56])
		#将图像压入列表中
		ims.append(x)
	#将列表转换成tensor类型
	img = tf.convert_to_tensor(ims)
	y = tf.convert_to_tensor(label_list)
	return img,y


def preprocess(x,y):
	#归一化
	x = tf.cast(x,dtype=tf.float32) / 255.0
	y = tf.cast(y, dtype=tf.int32)
	return x,y
#训练图片与标签
image_list, label_list = get_files(train_dir)

x_train, y_train = get_tensor(image_list, label_list)

#载入训练数据集
db_train = tf.data.Dataset.from_tensor_slices((x_train, y_train))
# # shuffle:打乱数据,map:数据预处理,batch:一次取喂入10样本训练
db_train = db_train.shuffle(1000).map(preprocess).batch(10)


# 模型搭建
model = resnet18()
model.build(input_shape=(None, 56, 56, 3))
model.summary()
# 模型装配
model.compile(optimizer=optimizers.SGD(lr=0.03),  # 指定Adam优化器,学习率为0.01
              loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),  # 指定采用交叉熵损失函数,包含Softmax
              metrics=['accuracy'])  # 指定评价指标为准备率
# 模型训练
# 输入训练集train_dataset,训练8个epochs; 每训练完2个epochs,对验证集val_dataset验证一次
model.fit(db_train, epochs=8)
model.save_weights('model_weight')

预测代码:

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import numpy as np
from tensorflow import keras
from tensorflow.keras import layers, optimizers, datasets, Sequential, metrics,models  # 导入TF子库
from resnet import resnet18


#数据准备
train_dir = r'C:\Users\12258\Desktop\maoniushibie1221\data\train'


#数据处理
def get_files(file_dir):
	# 存放图片类别和标签的列表:第0类
	list_0 = []
	label_0 = []
	# 存放图片类别和标签的列表:第1类
	list_1 = []
	label_1 = []
	# 存放图片类别和标签的列表:第2类
	list_2 = []
	label_2 = []
	# 存放图片类别和标签的列表:第3类
	list_3 = []
	label_3 = []
	# 存放图片类别和标签的列表:第4类
	list_4 = []
	label_4 = []
	list_5 = []
	label_5 = []
	list_6 = []
	label_6 = []


	for file in os.listdir(file_dir):
		# print(file)
		#拼接出图片文件路径
		image_file_path = os.path.join(file_dir,file)
		for image_name in os.listdir(image_file_path):
			# print('image_name',image_name)
			#图片的完整路径
			image_name_path = os.path.join(image_file_path,image_name)
			# print('image_name_path',image_name_path)
			#将图片存放入对应的列表
			if image_file_path[-1:] == '1':
				list_0.append(image_name_path)
				label_0.append(0)
			elif image_file_path[-1:] == '2': 
				list_1.append(image_name_path)
				label_1.append(1)
			elif image_file_path[-1:] == '3':
				list_2.append(image_name_path)
				label_2.append(2)
			elif image_file_path[-1:] == '4':
				list_3.append(image_name_path)
				label_3.append(3)
			elif image_file_path[-1:] == '5':
				list_3.append(image_name_path)
				label_3.append(4)
			elif image_file_path[-1:] == '6':
				list_3.append(image_name_path)
				label_3.append(5)
			else :
				list_4.append(image_name_path)
				label_4.append(6)
            

	# 合并数据
	image_list = np.hstack((list_0, list_1, list_2, list_3, list_4,list_5,list_6))
	label_list = np.hstack((label_0, label_1, label_2, label_3, label_4,label_5,label_6))
	#利用shuffle打乱数据
	temp = np.array([image_list, label_list])
	temp = temp.transpose()  # 转置
	np.random.shuffle(temp)
	
	#将所有的image和label转换成list
	image_list = list(temp[:, 0])
	image_list = [i for i in image_list]
	label_list = list(temp[:, 1])
	label_list = [int(float(i)) for i in label_list]
	# print(image_list)
	# print(label_list)
	return image_list, label_list

def get_tensor(image_list, label_list):
	ims = []
	for image in image_list:
		#读取路径下的图片
		x = tf.io.read_file(image)
		#将路径映射为照片,3通道
		x = tf.image.decode_jpeg(x,channels=3)
		#修改图像大小
		x = tf.image.resize(x,[56,56])
		#将图像压入列表中
		ims.append(x)
	#将列表转换成tensor类型
	img = tf.convert_to_tensor(ims)
	y = tf.convert_to_tensor(label_list)
	return img,y


def preprocess(x,y):
	#归一化
	x = tf.cast(x,dtype=tf.float32) / 255.0
	y = tf.cast(y, dtype=tf.int32)
	return x,y
#训练图片与标签
image_list, label_list = get_files(train_dir)

x_train, y_train = get_tensor(image_list, label_list)

#载入训练数据集
db_train = tf.data.Dataset.from_tensor_slices((x_train, y_train))
# # shuffle:打乱数据,map:数据预处理,batch:一次取喂入10样本训练
db_train = db_train.shuffle(1000).map(preprocess).batch(10)


# 模型搭建
model = resnet18()
model.build(input_shape=(None, 56, 56, 3))
model.summary()
# 模型装配
model.compile(optimizer=optimizers.SGD(lr=0.03),  # 指定Adam优化器,学习率为0.01
              loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),  # 指定采用交叉熵损失函数,包含Softmax
              metrics=['accuracy'])  # 指定评价指标为准备率
# 模型训练
# 输入训练集train_dataset,训练8个epochs; 每训练完2个epochs,对验证集val_dataset验证一次
model.fit(db_train, epochs=8)
model.save_weights('model_weight')

Resnet源码

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, Sequential

class BasicBlock(layers.Layer):

    def __init__(self, filter_num, stride=1):
        super(BasicBlock, self).__init__()

        self.conv1 = layers.Conv2D(filter_num, (3, 3), strides=stride, padding='same')
        self.bn1 = layers.BatchNormalization()  # BN层
        self.relu = layers.Activation('relu')  # ReLU激活函数

        self.conv2 = layers.Conv2D(filter_num, (3, 3), strides=1, padding='same')
        self.bn2 = layers.BatchNormalization()  # BN层

        if stride != 1:
            self.downsample = Sequential()  # 下采样
            self.downsample.add(layers.Conv2D(filter_num, (1, 1), strides=stride))
        else:
            self.downsample = lambda x:x  # 恒等映射

    def call(self, inputs, training=None):
        out = self.conv1(inputs)
        out = self.bn1(out,training=training)
        out = self.relu(out)

        out = self.conv2(out)
        out = self.bn2(out,training=training)

        identity = self.downsample(inputs)  # 恒等映射

        output = layers.add([out, identity])  # 主路与支路(恒等映射)相加
        output = tf.nn.relu(output)  # ReLU激活函数

        return output

class ResNet(keras.Model):
    def __init__(self, layer_dims, num_classes=100):
        super(ResNet, self).__init__()
        # 第一层
        self.stem = Sequential([layers.Conv2D(64, (3, 3), strides=(1, 1)),
                                layers.BatchNormalization(),
                                layers.Activation('relu'),
                                layers.MaxPool2D(pool_size=(2, 2), strides=(1, 1), padding='same')
                                ])
        # 中间层的四个残差块:conv2_x,conv3_x,conv4_x,conv5_x
        self.layer1 = self.build_resblock(64,  layer_dims[0])
        self.layer2 = self.build_resblock(128, layer_dims[1], stride=2)
        self.layer3 = self.build_resblock(256, layer_dims[2], stride=2)
        self.layer4 = self.build_resblock(512, layer_dims[3], stride=2)
        # 全局平均池化
        self.avgpool = layers.GlobalAveragePooling2D()
        # 全连接层
        self.fc = layers.Dense(num_classes)

    def call(self, inputs, training=None):
        x = self.stem(inputs,training=training)
        x = self.layer1(x,training=training)
        x = self.layer2(x,training=training)
        x = self.layer3(x,training=training)
        x = self.layer4(x,training=training)
        x = self.avgpool(x)
        x = self.fc(x)
        return x

    # 构建残差块(将几个相同的残差模块堆叠在一起)
    def build_resblock(self, filter_num, blocks, stride=1):
        res_blocks = Sequential()
        # 可能会进行下采样
        res_blocks.add(BasicBlock(filter_num, stride))
        for _ in range(1, blocks):
            res_blocks.add(BasicBlock(filter_num, stride=1))
        return res_blocks

def resnet18():
    return ResNet([2, 2, 2, 2])

def resnet34():
    return ResNet([3, 4, 6, 3])

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于BERT微调+模板填充快速实现文本转DSL查询语句

前言 Text2SQL是指将自然语言转化为类SQL查询语句,使得用户的查询文本可以直接实现和数据库交互,本文介绍一种以BERT为基础模型,通过模板填充来实现的Text2SQL算法和产品化。 内容摘要 Text2SQL任务说明模板填充的思路条件列选择子模型搭建…

深度搜索(递归实现)-计算岛屿最大面积

一、问题描述 二、解题思路 该题目采用递归方法:如果当前是“岛屿”,那么计算上下左右四个方向的面积值1作为当前岛屿总面积返回。 三、代码实现 import java.util.*;public class Solution {int maxArea0;/*** 代码中的类名、方法名、参数名已经指定&…

文章MSM_metagenomics(三):Alpha多样性分析

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 本教程使用基于R的函数来估计微生物群落的香农指数和丰富度,使用MetaPhlAn prof…

【UIDynamic-动力学-UIGravityBehavior-重力行为 Objective-C语言】

一、UIGravityBehavior,重力行为, 1.接下来啊,我们一个一个来做, 新建一个项目,叫做:01-重力, 接下来,我们在这个ViewController里边, ViewDidLoad:里边,先写一段简单的代码, 我们写这么一段简单的代码,新建一个红色的UIView,把它显示在屏幕上, UIView *redVie…

03-RAG的核心 -结果召回和重排序

1 完整RAG应用的检索流程 2 Query预处理 2.1 意图识别 判断query问的是什么类型的问题,从而决定是否走RAG链路。 示例1: 深圳有什么好玩的 闲聊问题VDB支持哪些检索算法 产品常见问题 示例2: 为什么某个MongoDB实例内存占用过高 检查类…

博科SAN交换机初始化和Zone创建

1 初始化 博科的SAN交换机默认配置: 地址:10.77.77.77 账户:admin 密码:password 设备硬件查看 ***-SAN-1:admin> chassisshowFAN Unit: 1 Fan Direction: Reverse (Non-portside Intake) Time Awake: 0 daysP…

NOSQL -- ES

第三个我们比较常用的NOSQL类型的数据库 --- ES 介绍: ES的全称(Elasticsearch) ES是一个分布式全文搜索的引擎 也就是我们平常在购物, 搜索东西的时候常用的, 就是一个ES的类型, 分布式全文搜索引擎 查询原理: 1>分词: 在查询之前, 其会将一些数据拆分开, 按照词进行拆分…

计算机木马

病毒具有传播特性、恶意性 木马没有巨大的恶意,主要是帮黑客做些事情,没害你,没有那么广大的传播性

springboot宠物医院信息管理系统-计算机毕业设计源码04164

摘 要 现如今在中国,随着人民生活质量的逐渐提高,以及人民群众消费能力的日渐增长,各种各样的家养小动物,已经逐渐成为人类越来越亲密的生活伴侣。并且,现如今社会竞争及其激烈,人们的生活节奏越发急促、紧…

如何在 Windows 10/11 上编辑 PDF [4 种简单方法]

PDF 在大多数设备上都易于查看,但由于其设计用于查看,因此编辑起来可能比较棘手。编辑 PDF 可能比编辑 Microsoft Office 文档更具挑战性。 不用担心,我们已经为你做好了准备。无论你是想添加、删除还是插入文本或图片,你都可以使…

干部管理软件有哪些

随着信息技术的飞速发展,干部管理软件在各级党政机关、国企事业单位中扮演着越来越重要的角色。这些软件通过整合干部管理的各项业务流程,实现了干部信息的系统化、规范化和高效化管理。以下是几款主流的干部管理软件及其特点: 一、干部信息…

linux下C语言如何操作文件(一)

本篇我们简单介绍一下在linux中如何使用C语言操作文件,首先我们在项目中创建file_util.c源文件和file_util.h头文件如图: 我们先编辑file_util.h文件,定义好常用的函数,源代码如下: #ifndef FILE_UTIL_INCLUDED #define FILE_UTIL_INCLUDED#include <stdbool.h> #i…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 启动多任务排序(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 启动多任务排序(200分) 🌍 评测功能需要订阅专栏后私信联系…

AIGC绘画设计—揭秘Midjourney关键词魔法:让你的AI绘画瞬间起飞

在这个数字化飞速发展的时代&#xff0c;AI技术正以前所未有的速度改变着我们的生活和创作方式。在艺术创作领域&#xff0c;Midjourney作为一款强大的AI绘画工具&#xff0c;正逐渐受到越来越多创作者和爱好者的青睐。今天&#xff0c;我就来为大家揭秘Midjourney背后的关键词…

ORA-27090: Unable to reserve kernel resources for asynchronous disk I/O

一套11.2.0.4的rac库巡检&#xff0c;发现asm实例日志有如下报错 2.5.2 locate alert_${hst}.log tail -n 200 /oracle/app/grid/diag/asm/asm/ASM1/trace/alert_ASM1.log Errors in file /oracle/app/grid/diag/asm/asm/ASM1/trace/ASM1_ora_96212.trc: ORA-27090: Unable to…

工控机与普通电脑的区别对于工业自动化应用至关重要

商用计算机和工业计算机之间的相似之处可能多于差异之处。工业电脑利用了消费技术领域的许多进步&#xff0c;但增加了工业应用所必需的软件、编程、确定性和连接性。 专业人士表示&#xff1a;“从增加内存到摩尔定律所描述的处理能力的指数级增长&#xff0c;工业控制必将受…

吴恩达深度学习笔记:机器学习(ML)策略(1)(ML strategy(1))1.9-1.10

这里写自定义目录标题 第三门课 结构化机器学习项目&#xff08;Structuring Machine Learning Projects&#xff09;第一周 机器学习&#xff08;ML&#xff09;策略&#xff08;1&#xff09;&#xff08;ML strategy&#xff08;1&#xff09;&#xff09;1.9 可避免偏差&am…

新火种AI|苹果终于迈进了AI时代,是创新还是救赎?

作者&#xff1a;一号 编辑&#xff1a;美美 苹果的AI战略&#xff0c;能够成为它的救命稻草吗&#xff1f; 苹果&#xff0c;始终以其独特的创新能力引领着行业的发展方向。在刚结束不久的2024年的全球开发者大会&#xff08;WWDC&#xff09;上&#xff0c;苹果再次证明了…

重生奇迹mu魔剑士简介

出生地&#xff1a;勇者大陆 性 别&#xff1a;男 擅 长&#xff1a;近距离作战、武器特技&攻击魔法使用 转 职&#xff1a;剑圣&#xff08;3转&#xff09; 介 绍&#xff1a;当玩家账号中有一个220级以上的角色时&#xff0c;便可以创建职业为魔剑士的新角色&#x…

远程桌面端口,怎么修改远程桌面端口

修改注册表 打开注册表编辑器&#xff1a; 按下 Windows键R 或者从开始菜单选择“运行”&#xff0c;打开运行窗口。 输入 regedit 命令&#xff0c;然后点击“确定”打开注册表编辑器。 定位到远程桌面服务的端口设置&#xff1a; 在注册表编辑器中&#xff0c;按照以下路径找…