TensorFlow2实战-系列教程13:Resnet实战1

🧡💛💚TensorFlow2实战-系列教程 总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Jupyter Notebook中进行
本篇文章配套的代码资源已经上传

Resnet实战1
Resnet实战2
Resnet实战3

1、残差连接

深度学习中出现了随着网络的堆叠效果下降的现象,Resnet使用残差连接的方法解决了这个问题,让深度学习从此变得深了起来。
残差连接的做法可以表示为:
y = f ( x ) + x ( s h o r t c u t ) y = f(x)+x(shortcut) y=f(x)+x(shortcut)
其中y表示网络最后的输出,x为输入,f(x)则表示输入经过几层网络的输出结果,比如三次卷积+三次批归一化+三次relu,一般情况下f(x)就是网络的最终输出,这里再加上x就是一个残差连接的操作。

残差连接的操作保证了,x经过网络后得到的y一定比f(x)更好的结果,最差是同等效果,也就是保证了不会出现效果降低的情况。

这个shortcut是什么意思呢?因为x经过几次卷积后,可能会出现多个特征图,也就是f(x)和x的通道数不一样了,这个时候就需要对x的通道数进行调整再与f(x)相加得到y,如果通道数一样就不需要调整了
在这里插入图片描述
上图就是通道数没有发生变化的情况, y = f ( x ) + x y = f(x)+x y=f(x)+x,x经过两次(卷积+批归一化+ReLU)和一次(卷积+批归一化)后得到f(x),再加上x后经过ReLU就得到了最终的y
在这里插入图片描述
上图就是通道数发生变化的情况, y = f ( x ) + C o n v 2 d ( x ) y = f(x)+Conv2d(x) y=f(x)+Conv2d(x),x经过两次(卷积+批归一化+ReLU)和一次(卷积+批归一化)后得到f(x),x再经过一次(二维卷积+批归一化),这个二维卷积的卷积核是1x1的,经过这个二维卷积的x再加上f(x)后经过ReLU就得到了最终的y

2、项目介绍

在这里插入图片描述

  1. dataset文件夹,将原始数据分割成训练、验证、测试三个数据集
  2. models构建模型的代码,包含resnet31、resnet50、resnet101、resnet152的构建代码,以及残差模块实现的代码
  3. original_dataset,原始数据,包含猫、狗、熊猫3个类别的数据,每个类别1000张图像
  4. save_model,训练模型保存的路径
  5. config.py 设置配置参数的代码
  6. evaluate.py 使用测试集对模型进行测试的代码
  7. prepare_data.py 数据预处理的辅助函数代码
  8. split_dataset.py 将原始数据集分割成训练集、验证集、测试集的代码
  9. train.py 训练验证的代码

3、训练脚本train.py解读------数据预处理

from __future__ import absolute_import, division, print_function
import tensorflow as tf
from models import resnet50, resnet101, resnet152, resnet34
import config
from prepare_data import generate_datasets
import mathif __name__ == '__main__':# GPU settingsgpus = tf.config.experimental.list_physical_devices('GPU')if gpus:for gpu in gpus:tf.config.experimental.set_memory_growth(gpu, True)

导入项目工具包和辅助函数
配置 TensorFlow 中的 GPU 内存,:

  1. tf.config.experimental.list_physical_devices('GPU'):这个函数调用列出了 TensorFlow 在你的机器上可用的所有 GPU
  2. if gpus: 这个检查用来确认是否有可用的 GPU。如果有,它将继续对每一个 GPU 进行配置
  3. 在循环内部,对每一个 GPU 调用 tf.config.experimental.set_memory_growth(gpu, True),这使得 GPU 上的内存增长被启用
# get the original_datasettrain_dataset, valid_dataset, test_dataset, train_count, valid_count, test_count = generate_datasets()
def generate_datasets():train_dataset, train_count = get_dataset(dataset_root_dir=config.train_dir)valid_dataset, valid_count = get_dataset(dataset_root_dir=config.valid_dir)test_dataset, test_count = get_dataset(dataset_root_dir=config.test_dir)# read the original_dataset in the form of batchtrain_dataset = train_dataset.shuffle(buffer_size=train_count).batch(batch_size=config.BATCH_SIZE)valid_dataset = valid_dataset.batch(batch_size=config.BATCH_SIZE)test_dataset = test_dataset.batch(batch_size=config.BATCH_SIZE)return train_dataset, valid_dataset, test_dataset, train_count, valid_count, test_count
def get_dataset(dataset_root_dir):all_image_path, all_image_label = get_images_and_labels(data_root_dir=dataset_root_dir)# print("image_path: {}".format(all_image_path[:]))# print("image_label: {}".format(all_image_label[:]))# load the dataset and preprocess imagesimage_dataset = tf.data.Dataset.from_tensor_slices(all_image_path).map(load_and_preprocess_image)label_dataset = tf.data.Dataset.from_tensor_slices(all_image_label)dataset = tf.data.Dataset.zip((image_dataset, label_dataset))image_count = len(all_image_path)return dataset, image_count
def get_images_and_labels(data_root_dir):# 得到所有图像路径data_root = pathlib.Path(data_root_dir)all_image_path = [str(path) for path in list(data_root.glob('*/*'))]# 得到标签名字label_names = sorted(item.name for item in data_root.glob('*/'))# 例如:{'cats': 0, 'dogs': 1, 'panda': 2}label_to_index = dict((index, label) for label, index in enumerate(label_names))# 每一个图像对应的标签all_image_label = [label_to_index[pathlib.Path(single_image_path).parent.name] for single_image_path in all_image_path]return all_image_path, all_image_labeldef load_and_preprocess_image(img_path):# read picturesimg_raw = tf.io.read_file(img_path)# decode picturesimg_tensor = tf.image.decode_jpeg(img_raw, channels=channels)# resizeimg_tensor = tf.image.resize(img_tensor, [image_height, image_width])img_tensor = tf.cast(img_tensor, tf.float32)# normalizationimg = img_tensor / 255.0return img

load_and_preprocess_image()函数:

  1. 通过读取一个图像的路径
  2. 返回Tensor
  3. 进去进行归一化

get_images_and_labels()函数:

  1. 通过数据集的地址,获取当前目录下的所有图像的名称
  2. 在加上前缀路径和文件后缀,得到当前所有图像的对应的地址
  3. 返回地址和标签

get_dataset()函数:

  1. 通过调用get_images_and_labels()函数,得到当前目录下的图像的对应的地址和标签
  2. 使用from_tensor_slices方法和load_and_preprocess_image()函数读取地址和标签转换为Tensor
  3. 返回标签和数据组成的Tensor以及数据量

generate_datasets()函数:

  1. 训练、验证、测试数据路径分别通过调用get_dataset()函数得到训练、验证、测试数据Tensor和数据量
  2. 对训练、验证、测试数据加上batch_size和shuffle参数
  3. 返回训练、验证、测试数据Tensor和数据量

Resnet实战1
Resnet实战2
Resnet实战3

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

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

相关文章

单例模式

如有错误或有补充,以及任何的改进意见,请在评论区留下您的高见,同时文中给出大部分的示例 如果觉得本文写的不错,不妨点个赞,收藏一下,助力博主产生质量更高的作品 概念 单例模式(Singleton …

scienceplots绘图浅尝

前言 科研写作中,黑压压的文字里面如果能有一些优美的图片无疑会给论文增色不少,绘图的工具有很多,常用的有Excel、Python、Matlab等,Matlab在绘图方面相较于Python有一种更加原生的科研风,而且可视化编辑图例、坐标轴…

Maltab 输出矢量图

来源 MATLAB 仿真完,想把结果导出矢量图,放 latex 中写论文 方法 指定 render 方式为 vector print(Fig, FileName,-dpdf,-r0, -vector)或者指定 Fig 的 render 为 painters Fig.Renderer painters; 其他方法 参考 print 函数,可以输…

ManticoreSearch-(安装配置,集群搭建)-学习总结

ManticoreSearch-(安装配置)-学习总结 基础概念安装搭建集群搭建(基于K8S) 原文地址 https://blog.csdn.net/liuyij3430448/article/details/135955025 基础概念 Manticore Search是一个专门为搜索设计的多存储数据库,具有强大的全文搜索功能,适用于…

Python入门指北十七

Python中如何实现继承和多态? 在Python中,继承和多态的实现方式与其他面向对象编程语言类似。 继承 Python使用class关键字来定义类,并通过冒号(:)来指定父类。例如: class Animal:def __init__(self, …

java的单例设计模式

1什么是单例设计模式: 所谓类得单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法; 2.单例模式有两种方式: 2.1饿汉式 如…

【SparkML系列3】特征提取器TF-IDF、Word2Vec和CountVectorizer

本节介绍了用于处理特征的算法,大致可以分为以下几组: 提取(Extraction):从“原始”数据中提取特征。转换(Transformation):缩放、转换或修改特征。选择(Selection&…

15.Golang中的反射机制及应用

目录 概述实践基本应用复杂应用 结束 概述 Golang中的反射用法还是比较简单的 reflect.TypeOf(arg)reflect.ValueOf(arg) 实践 基本应用 package mainimport ("fmt""reflect" )func reflectNum(arg interface{}) {fmt.Println("type ", re…

网络异常案例三_RST

问题现象 在做功能测试的时候,经常看到设备离线的消息(MQTT遗嘱)。 在终端连接的网络设备上抓包分析,看到终端设备发起大量的RST请求。 151这个设备,7min,重置断开了8个TCP连接(mqtt连接&#…

Fiber

在React中,Fiber是一个核心架构,它是React 16及后续版本中用于处理和调度组件更新的一种机制。React Fiber的核心目的是改进React对复杂应用状态更新的处理方式,特别是为了更好地支持如动画、布局偏移等高性能需求场景,同时提供了…

理解部署描述符的元素

理解部署描述符的元素 部署描述符是文件名为web.xml的XML文件,其包含了Web应用程序的配置信息。每个Web应用程序都有一个web.xml文件。web.xml文件的元素可用于指定servlet的初始化参数、不同文件的MIME类型、侦听器类,以及将URL模式映射到servlet上。一…

2024年,AI 掀起数据与分析市场的新风暴

2024 年伊始,Kyligence 联合创始人兼 CEO 韩卿在其公司内部的飞书订阅号发表了多篇 Rethink Data & Analytics 的内部信,分享了对数据与分析行业的一些战略思考,尤其是 AI 带来的各种变化和革命,是如何深刻地影响这个行业乃至…

vue中nextTick()

在 Vue.js 中&#xff0c;nextTick() 是一个非常有用的方法&#xff0c;用于在下一个 DOM 更新循环结束后执行延迟回调。这在你需要读取或写入刚刚更新的 DOM 时非常有用。 下面是一个简单的示例代码&#xff0c;用于解析 nextTick() 的用法&#xff1a; <template> &…

防御挂马攻击:从防御到清除的最佳实践

挂马攻击&#xff0c;也称为马式攻击&#xff08;Horse Attack&#xff09;&#xff0c;是一种常见的网络攻击手段。攻击者通过在目标服务器或网站中植入恶意程序&#xff0c;以获取系统权限或窃取敏感信息。为了应对这种威胁&#xff0c;本文将重点介绍防御挂马攻击的最佳实践…

【SparkML系列1】相关性、卡方检验和概述器实现

Correlation(相关性) 计算两组数据之间的相关性在统计学中是一种常见的操作。在spark.ml中&#xff0c;我们提供了计算多组数据之间成对相关性的灵活性。目前支持的相关性方法是皮尔逊&#xff08;Pearson&#xff09;相关系数和斯皮尔曼&#xff08;Spearman&#xff09;相关…

VTK 交互事件

学习笔记&#xff1a;VTK 交互事件 1. 定义 VTK&#xff08;Visualization Toolkit&#xff09;中的交互事件是与用户交互操作相关的事件&#xff0c;例如鼠标移动、按键按下、小部件交互等。这些事件允许程序捕捉用户的输入&#xff0c;从而实现交互式的可视化体验。 2. 参…

AI项目落地成功因素:数据和机器学习模型的选择

构建机器学习模型时&#xff0c;需要考虑几个关键要素&#xff1a;计算能力、算法和数据。公司往往会将大部分资源集中于开发正确的、无偏见的算法&#xff0c;并加大对计算能力的投入&#xff0c;而在运行模型前&#xff0c;数据通常靠边站或完全被抛诸脑后。 如果数据被遗忘&…

消息中间件(MQ)对比:RabbitMQ、Kafka、ActiveMQ 和 RocketMQ

前言 在构建分布式系统时&#xff0c;选择适合的消息中间件是至关重要的决策。RabbitMQ、Kafka、ActiveMQ 和 RocketMQ 是当前流行的消息中间件之一&#xff0c;它们各自具有独特的特点和适用场景。本文将对这四种消息中间件进行综合比较&#xff0c;帮助您在项目中作出明智的…

C语言——动态内存管理(经典例题)

题1、 为什么会崩溃呢&#xff1f;&#x1f914;&#x1f914;&#x1f914; #include <stdio.h> #include <stdlib.h> #include <string.h>void GetMemory(char** p) {*p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(&str);str…

SQL DISTINCT 用法总结

SQL DISTINCT 用法总结 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;今天我们将深入研究 SQL 中的 DISTINCT 关键字。DISTINCT 是一项非常有用的功能&#xff0c;用于从查询结果中消除重复的行&#xff0c;让我们一起学习其基本…