第J1周:ResNet-50算法实战与解析

news2025/1/13 7:41:00
  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

    文章目录

    • 一、前期工作
      • 1、ResNet-50总体结构
      • 2、设置GPU
      • 3、导入数据
    • 二、数据预处理
      • 1、加载数据
      • 2、可视化数据
      • 3、再次检查数据
      • 4、配置数据集
    • 三、构建ResNet-50模型
    • 四、编译
    • 五、训练模型
    • 六、模型评估
    • 七、预测
    • 八、总结

电脑环境:
语言环境:Python 3.8.0
编译器:Jupyter Notebook
深度学习环境:tensorflow 2.17.0

一、前期工作

1、ResNet-50总体结构

在这里插入图片描述

2、设置GPU

import tensorflow as tf

gpus = tf.config.list_physical_devices('GPU')

if gpus:
    tf.config.experimental.set_memory_growth(gpus[0], True)
    tf.config.set_visible_devices(gpus[0], 'GPU')

3、导入数据

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

import os, PIL, pathlib
import numpy as np

from tensorflow import keras
from keras import layers, models

data_dir = './bird_photos'
data_dir = pathlib.Path(data_dir)
image_count = len(list(data_dir.glob('*/*')))
image_count

565

二、数据预处理

1、加载数据

batch_size = 8
img_height = 224
img_width = 224

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset='training',
    seed=123,
    image_size=(img_height, img_width),
    batch_size=batch_size)
 
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset='validation',
    seed=123,
    image_size=(img_height, img_width),
    batch_size=batch_size)

我们可以通过class_names输出数据集的标签,按字母顺序对应于目录名称。

class_names = train_ds.class_names
class_names

[‘Bananaquit’, ‘Black Skimmer’, ‘Black Throated Bushtiti’, ‘Cockatoo’]

2、可视化数据

plt.figure(figsize=(10, 4))

for images, labels in train_ds.take(1):
    for i in range(8):
        ax = plt.subplot(2, 4, i+1)
        plt.imshow(images[i].numpy().astype('uint8'))
        plt.title(class_names[labels[i]])
        plt.axis('off')

在这里插入图片描述

plt.imshow(images[0].numpy().astype('uint8'))

在这里插入图片描述

3、再次检查数据

for image_batch, labels_batch in train_ds:
    print(image_batch.shape)
    print(labels_batch.shape)
    break

(8, 224, 224, 3)
(8,)

4、配置数据集

AUTOTUNE = tf.data.experimental.AUTOTUNE

train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

三、构建ResNet-50模型

from keras import layers

from keras.layers import Input, Activation, BatchNormalization, Flatten
from keras.layers import Dense, Conv2D, MaxPooling2D, ZeroPadding2D, AveragePooling2D
from keras.models import Model

def identity_block(input_tensor, kernel_size, filters, stage, block):
    filters1, filters2, filters3 = filters

    name_base = str(stage) + block + '_identity_block_'

    x = Conv2D(filters1, (1, 1), name=name_base + 'conv1')(input_tensor)
    x = BatchNormalization(name=name_base + 'bn1')(x)
    x = Activation('relu', name=name_base + 'relu1')(x)

    x = Conv2D(filters2, kernel_size, padding='same', name=name_base + 'conv2')(x)
    x = BatchNormalization(name=name_base + 'bn2')(x)
    x = Activation('relu', name=name_base + 'relu2')(x)

    x = Conv2D(filters3, (1, 1), name=name_base + 'conv3')(x)
    x = BatchNormalization(name=name_base + 'bn3')(x)

    x = layers.add([x, input_tensor], name=name_base + 'add')
    x = Activation('relu', name=name_base + 'relu3')(x)
    return x

def conv_block(input_tensor, kernel_size, filters, stage, block, strides=(2, 2)):
    filters1, filters2, filters3 = filters

    res_name_base = str(stage) + block + '_conv_block_res_'
    name_base = str(stage) + block + '_conv_block_'

    x = Conv2D(filters1, (1, 1), strides=strides, name=name_base + 'conv1')(input_tensor)
    x = BatchNormalization(name=name_base + 'bn1')(x)
    x = Activation('relu', name=name_base + 'relu1')(x)

    x = Conv2D(filters2, kernel_size, padding='same', name=name_base + 'conv2')(x)
    x = BatchNormalization(name=name_base + 'bn2')(x)
    x = Activation('relu', name=name_base + 'relu2')(x)

    x = Conv2D(filters3, (1, 1), name=name_base + 'conv3')(x)
    x = BatchNormalization(name=name_base + 'bn3')(x)

    shortcut = Conv2D(filters3, (1, 1), strides=strides, name=res_name_base + 'conv')(input_tensor)
    shortcut = BatchNormalization(name=res_name_base + 'bn')(shortcut)

    x = layers.add([x, shortcut], name=name_base + 'add')
    x = Activation('relu', name=name_base + 'relu3')(x)
    return x

def ResNet50(input_shape=(224, 224, 3), classes=1000):
    img_input = Input(shape=input_shape)
    x = ZeroPadding2D((3, 3))(img_input)

    x = Conv2D(64, (7, 7), strides=(2, 2), name='conv1')(x)
    x = BatchNormalization(name='bn_conv1')(x)
    x = Activation('relu')(x)
    x = MaxPooling2D((3, 3), strides=(2, 2))(x)

    x =     conv_block(x, 3, [64, 64, 256], stage=2, block='a', strides=(1, 1))
    x = identity_block(x, 3, [64, 64, 256], stage=2, block='b')
    x = identity_block(x, 3, [64, 64, 256], stage=2, block='c')

    x =     conv_block(x, 3, [128, 128, 512], stage=3, block='a')
    x = identity_block(x, 3, [128, 128, 512], stage=3, block='b')
    x = identity_block(x, 3, [128, 128, 512], stage=3, block='c')
    x = identity_block(x, 3, [128, 128, 512], stage=3, block='d')

    x =     conv_block(x, 3, [256, 256, 1024], stage=4, block='a')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='b')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='c')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='d')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='e')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='f')

    x =     conv_block(x, 3, [512, 512, 2048], stage=5, block='a')
    x = identity_block(x, 3, [512, 512, 2048], stage=5, block='b')
    x = identity_block(x, 3, [512, 512, 2048], stage=5, block='c')

    x = AveragePooling2D((7, 7), name='avg_pool')(x)

    x = Flatten()(x)
    x = Dense(classes, activation='softmax', name='fc1000')(x)
    model = Model(img_input, x, name='resnet50')

    # 加载预训练模型
    model.load_weights('./resnet50_weights_tf_dim_ordering_tf_kernels.h5')

    return model

model = ResNet50()
model.summary()
Model: "resnet50"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Layer (type)              ┃ Output Shape           ┃        Param # ┃ Connected to           ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ input_layer (InputLayer)(None, 224, 224, 3)0-                      │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ zero_padding2d            │ (None, 230, 230, 3)0 │ input_layer[0][0]      │
│ (ZeroPadding2D)           │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ conv1 (Conv2D)(None, 112, 112, 64)9,472 │ zero_padding2d[0][0]   │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ bn_conv1                  │ (None, 112, 112, 64)256 │ conv1[0][0]            │
│ (BatchNormalization)      │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ activation (Activation)(None, 112, 112, 64)0 │ bn_conv1[0][0]         │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ max_pooling2d             │ (None, 55, 55, 64)0 │ activation[0][0]       │
│ (MaxPooling2D)            │                        │                │                        │
..............................................................
..............................................................
..............................................................
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ avg_pool                  │ (None, 1, 1, 2048)0 │ 5c_identity_block_rel… │
│ (AveragePooling2D)        │                        │                │                        │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ flatten (Flatten)(None, 2048)0 │ avg_pool[0][0]         │
├───────────────────────────┼────────────────────────┼────────────────┼────────────────────────┤
│ fc1000 (Dense)(None, 1000)2,049,000 │ flatten[0][0]          │
└───────────────────────────┴────────────────────────┴────────────────┴────────────────────────┘
 Total params: 25,636,712 (97.80 MB)
 Trainable params: 25,583,592 (97.59 MB)
 Non-trainable params: 53,120 (207.50 KB)

四、编译

opt = tf.keras.optimizers.Adam(learning_rate=1e-4)
model.compile(optimizer=opt,
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

五、训练模型

epochs = 10
history = model.fit(
    train_ds,
    validation_data=val_ds,
    epochs=epochs
)
Epoch 1/10
57/57 ━━━━━━━━━━━━━━━━━━━━ 269s 1s/step - accuracy: 0.5021 - loss: 3.6748 - val_accuracy: 0.9646 - val_loss: 0.1640
Epoch 2/10
57/57 ━━━━━━━━━━━━━━━━━━━━ 6s 99ms/step - accuracy: 0.9636 - loss: 0.2068 - val_accuracy: 0.9823 - val_loss: 0.0241
Epoch 3/10
57/57 ━━━━━━━━━━━━━━━━━━━━ 6s 97ms/step - accuracy: 0.9800 - loss: 0.0443 - val_accuracy: 0.9912 - val_loss: 0.0115
Epoch 4/10
57/57 ━━━━━━━━━━━━━━━━━━━━ 10s 98ms/step - accuracy: 0.9943 - loss: 0.0286 - val_accuracy: 0.9912 - val_loss: 0.0183
Epoch 5/10
57/57 ━━━━━━━━━━━━━━━━━━━━ 11s 104ms/step - accuracy: 0.9945 - loss: 0.0377 - val_accuracy: 1.0000 - val_loss: 0.0108
Epoch 6/10
57/57 ━━━━━━━━━━━━━━━━━━━━ 10s 100ms/step - accuracy: 0.9995 - loss: 0.0038 - val_accuracy: 0.9735 - val_loss: 0.0359
Epoch 7/10
57/57 ━━━━━━━━━━━━━━━━━━━━ 10s 104ms/step - accuracy: 1.0000 - loss: 0.0024 - val_accuracy: 0.9912 - val_loss: 0.0196
Epoch 8/10
57/57 ━━━━━━━━━━━━━━━━━━━━ 10s 98ms/step - accuracy: 1.0000 - loss: 6.2409e-04 - val_accuracy: 0.9912 - val_loss: 0.0139
Epoch 9/10
57/57 ━━━━━━━━━━━━━━━━━━━━ 6s 106ms/step - accuracy: 1.0000 - loss: 5.9430e-04 - val_accuracy: 1.0000 - val_loss: 0.0103
Epoch 10/10
57/57 ━━━━━━━━━━━━━━━━━━━━ 6s 99ms/step - accuracy: 1.0000 - loss: 3.5871e-04 - val_accuracy: 1.0000 - val_loss: 0.0094

六、模型评估

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']

loss = history.history['loss']
val_loss = history.history['val_loss']

epochs_range = range(epochs)

plt.figure(figsize=(12, 4))

plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

在这里插入图片描述

七、预测

plt.figure(figsize=(10, 4))

for images, labels in train_ds.take(1):
    for i in range(8):
        ax = plt.subplot(2, 4, i+1)
        plt.imshow(images[i].numpy().astype('uint8'))

        img_array = tf.expand_dims(images[i], 0)
        predictions = model.predict(img_array)

        plt.title(class_names[np.argmax(predictions)])
        plt.axis('off')

在这里插入图片描述

八、总结

在一般的卷积神经网络中,由于深度的增加,可能会带来梯度爆炸,梯度消失,ResNet的残差网络结构可以有效解决这些问题。

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

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

相关文章

建筑节能监测系统解决方案

jianzhunenghao 建筑节能监测系统公共建筑能耗监测系统建筑能耗监测系统节能监测系统能耗监测建筑能耗监测能耗分析能耗管理能耗预测能耗监控能耗监测平台建筑能耗 介绍 能耗监控系统是为耗电量、耗水量、耗气量(天然气量或者煤气量)、集中供热耗热量…

无人机建模详解!!!

一、无人机拍摄 1. 准备工作 了解场地信息:在规划航线之前,需要了解场地的范围、地貌、树木遮挡情况、建筑和树木高度等,以便为后续的规划航线提供帮助。 选择拍摄时间:最佳拍摄条件为光线充足且风速较小的天气的10点-16点&…

校园管理系统创新:Spring Boot框架应用案例

第4章 系统设计 4.1 系统体系结构 校园管理系统的结构图4-1所示: 图4-1 系统结构 登录系统结构图,如图4-2所示: 图4-2 登录结构图 校园管理系统结构图,如图4-3所示。 图4-3 校园管理系统结构图 4.2开发流程设计 系统流程的分…

C语言整型数据在内存中的存储(22)

文章目录 前言一、整数在内存中的存储二、大小端字节序和字节序判断什么是大小端?为什么会有大小端?练习练习1练习2练习3练习4练习5练习6练习7 总结 前言 本篇是修炼内功的文章   首先,你先明白一个事实,数据在内存中是以二进制…

预测日前电价:回顾最先进的算法、最佳实践和公开基准——阅读笔记

Forecasting day-ahead electricity prices: A review of state-of-the-art algorithms, best practices and an open-access benchmark 预测日前电价:回顾最先进的算法、最佳实践和公开基准 Applied Energy (2021) 摘要:电价预测在过去二十年间已经得到…

python画图|3D surface基础教程

画三维图在当前的需求越来越强烈,因此掌握3D图的画法至关重要。 让我们先来学习3D surface基础教程。 【1】官网教程 首先是来到官网,找到教程,详见下述链接: 3D surface (colormap) — Matplotlib 3.9.2 documentation 教程…

【Linux】代理服务器

一、正向代理 1.1 正向代理的概述 正向代理是一种常见的网络代理方式,他位于客户端和目标服务器之间,代表客户端向目标服务器发送请求。正向代理服务器接受客户端的请求,然后将请求转发给目标服务器,最后将目标服务器的响应返回给…

mybatis与concat实现模糊查询、mybatis中模糊查询concat传入参数为空时的解决方法

文章目录 在mybatis中&#xff0c;一般模糊查询like习惯用concat进行拼接&#xff0c;但是当传入的参数为空时&#xff0c;查询不出数据。 那是因为concat中&#xff0c;若传入参数为null, 则返回null。 以下整理mybatis中like模糊查询的写法 <select id"findByKeyw…

【uni-app】命令行创建 uni-app 项目

命令行创建 uni-app 项目 优势 通过命令行创建 uni-app 项目&#xff0c;不必依赖 HBuilderX&#xff0c;TypeScript 类型支持友好。 命令行创建 uni-app 项目&#xff1a; vue3 ts 版 &#x1f449;国内 gitee 下载github 下载 # 通过 git 从 gitee 克隆下载 git clone…

Servlet学习详解--基本涵盖所有Servlet知识点

目录 一、Servlet二、 Servlet入门2.1. 执行原理2.2. 实现Servlet接口重写其五个方法及其生命周期 三、Request请求对象3.1. 获取请求消息数据3.2. 获取请求头数据3.3. 获取请求体数据3.4. 设置编码3.5. 其他通用功能3.6. 请求转发(Forward)3.7. 转发共享数据 四、Response对象…

算法刷题[比较两个字符串的最大公字符串(滑动窗口实现)]

题目&#xff1a;编程实现&#xff1a;找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad" 代码如下所示&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #inclu…

Wophp靶场漏洞挖掘

首先进入网站发现有个搜索框&#xff0c;那么我们试一下xss和SQL注入 SQL注入漏洞 发现这里页面没有给我们回显 那么我们尝试sql注入 查数据库 查表 最后查出账号密码 找到账号密码之后我们去找后台登录 进入后台后发现这里有个flag flag 接着往下翻找到一个文件上传的地方 …

STM32启用FPU浮点运算

这篇文章产生背景&#xff1a;其他人的文章太杂了&#xff0c;对我这种菜鸡无法接受&#xff1b; 参考文章&#xff1a; stm32h743单片机嵌入式学习笔记7-FPU_stmh743vit4-CSDN博客 stm32F407 打开 FPU(浮点运算处理器)_stm32f407开启fpu-CSDN博客 STM32F4CubeMXHal库下使能…

基于微信小程序的食堂点餐预约管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的食…

linux-L6 linux管理服务的启动、重启、停止、重载、查看状态命令

来重启一下某一个服务 1.使用命令查看所有的服务状态 Systemctl找到其中的相关的服务 systemctl status xxx_你的应用程序的服务__xxx3.重启该服务 systemctl restart xxx_你的应用程序的服务__xxx下面的是备用&#xff0c;需要用的时候&#xff0c;查看就好了 启动服务 …

[机器学习]聚类算法

1 聚类算法简介 # 导包 from sklearn.datasets import make_blobs import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.metrics import calinski_harabasz_score # 构建数据 x,ymake_blobs(n_samples1000,n_features2,centers[[-1,-1],[0,0],[1…

如何正确使用布尔表达式

在Java编程语言中&#xff0c;布尔表达式&#xff08;Boolean Expressions&#xff09;是程序逻辑控制的核心部分。它们是用来表示“真”&#xff08;true&#xff09;或“假”&#xff08;false&#xff09;的逻辑语句&#xff0c;通常用于控制程序的执行流程&#xff0c;比如…

【例题】1 二极管

文章目录 二极管的理想模型例题二极管的恒压降模型例题恒压管例题二极管的理想模型例题 根据二极管的理想模型,正向电压断路,反向电压开路分析。 这里的 u 0 u_0 u

OpenHarmony(鸿蒙南向开发)——小型系统芯片移植指南(二)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量系统芯片移植指南(一) Op…

安全工具 | 使用Burp Suite的10个小tips

Burp Suite 应用程序中有用功能的集合 img Burp Suite 是一款出色的分析工具&#xff0c;用于测试 Web 应用程序和系统的安全漏洞。它有很多很棒的功能可以在渗透测试中使用。您使用它的次数越多&#xff0c;您就越发现它的便利功能。 本文内容是我在测试期间学到并经常的主要…