Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >卷积_ResNet

卷积_ResNet

作者头像
火星娃统计
发布于 2021-11-02 07:02:31
发布于 2021-11-02 07:02:31
33100
代码可运行
举报
文章被收录于专栏:火星娃统计火星娃统计
运行总次数:0
代码可运行

Resnet

概述

刚才边写这个,别跑程序,偏偏没有选择自动保存,因此没得了,一个字也没有给我留下来,消耗了我所有的耐心。

因此跑程序的时候,记得保存,毕竟这破电脑什么水平自己知道 残差神经网络(ResNet)是由微软研究院的何恺明等人提出,当年的预测准确率很高

理论

就是说随着卷积的深度增加,会导致梯度爆炸和梯度消失,因此增加深度不会提高预测的准确性

image-20211025193250594

  • 为了避免梯度消失,加入的跳连的线,用于保留信息
  • 两种跳连方式,一种实线的,一种是虚线的,虚线的代表下采样,步长为2
  • 同时还有另一种类型的残差块,主要用于深度较深的网络

image-20211025193752889

image-20211025194043888

代码

实现resnet18

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf
import os
import numpy as np
from matplotlib import pyplot as plt
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense
from tensorflow.keras import Model

np.set_printoptions(threshold=np.inf)
# cifar10共有60000张彩色图像,这些图像是32*32,分为10个类,每类6000张图。
# 这里面有50000张用于训练,另外10000用于测试,单独构成一批。
# 主要是鸟啊,飞机啊,猫啊之类的东西,就是10个类吧
cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
# 将像素点规整为0-1的数值
x_train, x_test = x_train / 255.0, x_test / 255.0

# resnet结构块
# 第一个卷积为3*3 步长不定
# 第二个卷积为3*3 步长为1
# 最后按照是否下采样进行判定添加下采样的跳连
# 最后过激活函数relu
class ResnetBlock(Model):

    def __init__(self, filters, strides=1, residual_path=False):
        super(ResnetBlock, self).__init__()
        self.filters = filters
        self.strides = strides
        self.residual_path = residual_path # 是否跳连下采样
        # 3*3的卷积 填充,使用偏倚
        self.c1 = Conv2D(filters, (3, 3), strides=strides, padding='same', use_bias=False)
        self.b1 = BatchNormalization() # 批标准化,各个卷积结构进行一个标准化运行,比较简单理解
        self.a1 = Activation('relu')# 激活函数

        self.c2 = Conv2D(filters, (3, 3), strides=1, padding='same', use_bias=False)
        self.b2 = BatchNormalization()

        # residual_path为True时,对输入进行下采样,即用1x1的卷积核做卷积操作,保证x能和F(x)维度相同,顺利相加
        if residual_path:
            self.down_c1 = Conv2D(filters, (1, 1), strides=strides, padding='same', use_bias=False)
            self.down_b1 = BatchNormalization()

        self.a2 = Activation('relu')

    def call(self, inputs):
        residual = inputs  # residual等于输入值本身,即residual=x
        # 将输入通过卷积、BN层、激活层,计算F(x)
        x = self.c1(inputs)
        x = self.b1(x)
        x = self.a1(x)

        x = self.c2(x)
        y = self.b2(x)

        if self.residual_path:
            residual = self.down_c1(inputs)
            residual = self.down_b1(residual)
        # 如果residual_path为ture那么上述的residual为下采样之后的,如果为false,那么为原始矩阵相加
        out = self.a2(y + residual)  # 最后输出的是两部分的和,即F(x)+x或F(x)+Wx,再过激活函数
        return out

# resnet18的搭建
class ResNet18(Model):

    def __init__(self, block_list, initial_filters=64):  # block_list表示每个block有几个卷积层
        super(ResNet18, self).__init__()
        self.num_blocks = len(block_list)  # 共有几个block
        self.block_list = block_list
        self.out_filters = initial_filters
        # 第一层卷积 这里为3*3 ,实际上是7*7
        self.c1 = Conv2D(self.out_filters, (3, 3), strides=1, padding='same', use_bias=False)
        self.b1 = BatchNormalization()
        self.a1 = Activation('relu')
        self.blocks = tf.keras.models.Sequential()# 使用Sequential方式添加层
        # 构建ResNet网络结构,使用一个循环进行生成
        for block_id in range(len(block_list)):  # 第几个resnet block,这里为4
            for layer_id in range(block_list[block_id]):  # 第几个卷积层

                if block_id != 0 and layer_id == 0:  # 对除第一个block以外的每个block的输入进行下采样
                    block = ResnetBlock(self.out_filters, strides=2, residual_path=True)
                else:
                    block = ResnetBlock(self.out_filters, residual_path=False)
                self.blocks.add(block)  # 将构建好的block加入resnet
            self.out_filters *= 2  # 下一个block的卷积核数是上一个block的2倍
        self.p1 = tf.keras.layers.GlobalAveragePooling2D() # 平均池化
        # 全连接过softmax函数
        self.f1 = tf.keras.layers.Dense(10, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())

    def call(self, inputs):
        x = self.c1(inputs)
        x = self.b1(x)
        x = self.a1(x)
        x = self.blocks(x) #这里会生成16层
        x = self.p1(x)
        y = self.f1(x)
        return y


model = ResNet18([2, 2, 2, 2])#[2, 2, 2, 2]为块的list,共4个大块,每个大块里有2个小块,1个小块有2层卷积
# 优化器,损失函数 测量指标
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy'])
# 断电续训
# 为上次模型的结果,目的是为了提高模型收敛的速度
checkpoint_save_path = "./checkpoint/ResNet18.ckpt"
if os.path.exists(checkpoint_save_path + '.index'):
    print('-------------load the model-----------------')
    model.load_weights(checkpoint_save_path)
# cp_callback 保存模型的结果,也就是各个卷积核、w的参数
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,
                                                 save_weights_only=True,
                                                 save_best_only=True)
# 模型的训练,批次,循环,验证等内容
history = model.fit(x_train, y_train, batch_size=128, epochs=5, validation_data=(x_test, y_test), validation_freq=1,
                    callbacks=[cp_callback])
model.summary()
# 保存模型的参数,各个w和卷积核的数值
# print(model.trainable_variables)
file = open('./weights.txt', 'w')
for v in model.trainable_variables:
    file.write(str(v.name) + '\n')
    file.write(str(v.shape) + '\n')
    file.write(str(v.numpy()) + '\n')
file.close()

###############################################    show   ###############################################

# 显示训练集和验证集的acc和loss曲线
acc = history.history['sparse_categorical_accuracy']
val_acc = history.history['val_sparse_categorical_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']

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

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

结束语

一直以为我的台式机是1050ti,后来发现才是fake的,所以电脑死机黑屏是常有的事儿,

没有gpu就别跑了,都是血泪,各种丢

love &peace

佛祖保运

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 火星娃统计 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【深度学习】MLP/LeNet/AlexNet/GoogLeNet/ResNet在三个不同数据集上的分类效果实践
v1:引入了Inception结构,并使用1x1卷积和来压缩通道数(减少参数量。Inception作用:代替人工确定卷积层中的过滤器类型或者确定是否需要创建卷积层和池化层,即:不需要人为的决定使用哪个过滤器,是否需要池化层等,由网络自行决定这些参数,可以给网络添加所有可能值,将输出连接起来,网络自己学习它需要什么样的参数。
zstar
2022/06/14
1.3K0
【深度学习】MLP/LeNet/AlexNet/GoogLeNet/ResNet在三个不同数据集上的分类效果实践
AI识万物:从0搭建和部署手语识别系统 ⛵
据北京听力协会预估数据,我国听障人群数量已过千万。而在全球范围内有4.66亿人患有残疾性听力损失,约占全世界人口的5%。聋哑人士很特殊,他们需要使用手语进行交流,其他与常人无异,我国存在特殊教育水平在各城市中发展力度具有较大差异,国家通用手语推广程度浅,但不懂手语,与听力障碍者交流会非常困难。
ShowMeAI
2022/08/09
1.1K0
AI识万物:从0搭建和部署手语识别系统 ⛵
卷积神经网络学习路线(二十三)| 经典网络回顾之XceptionNet
卷积神经网络学习路线这个系列旨在盘点从古至今对当前CV影响很大的那些经典网络。为了保证完整性我会将之前漏掉的一些网络补充下去,已经介绍了非常多的经典网络,这个系列可能也快要迎来完结了。接着卷积神经网络学习路线(九)| 经典网络回顾之GoogLeNet系列 也就是Inception V3之后,Google提出了XceptionNet,这是对Inception V3的一种改进,主要使用了深度可分离卷积来替换掉Inception V3中的卷积操作。
BBuf
2020/04/02
7780
手把手教你使用 1D 卷积和 LSTM 混合模型做 EEG 信号识别
本文主要介绍了使用 1D 卷积和 LSTM 混合模型做 EEG 信号识别。感谢Memory逆光!
脑机接口社区
2022/08/17
7090
手把手教你使用 1D 卷积和 LSTM 混合模型做 EEG 信号识别
TensorFlow2.0 实战强化专栏(二):CIFAR-10项目
Alex Krizhevsky,Vinod Nair和Geoffrey Hinton收集了8000万个小尺寸图像数据集,CIFAR-10和CIFAR-100分别是这个数据集的一个子集(http://www.cs.toronto.edu/~kriz/cifar.html)。CIFAR-10数据集由10个类别共60000张彩色图片组成,其中每张图片的大小为32X32,每个类别分别6000张。
磐创AI
2020/03/04
1.1K0
卷积神经网络 第三周作业:Residual+Networks+-+v1
Welcome to the second assignment of this week! You will learn how to build very deep convolutional networks, using Residual Networks (ResNets). In theory, very deep networks can represent very complex functions; but in practice, they are hard to train. Residual Networks, introduced by He et al., allow you to train much deeper networks than were previously practically feasible.
Steve Wang
2019/05/28
1.2K0
卷积神经网络 第三周作业:Residual+Networks+-+v1
手把手教你构建ResNet残差网络
【导读】ResNet在2015年名声大噪,影响了2016年DL在学术界和工业界的发展方向。它对每一层的输入做一个reference,形成残差函数。残差用来设计解决深度网络退化问题,同时也解决了梯度消失
WZEARW
2018/06/05
3.7K0
04.卷积神经网络 W2.深度卷积网络:实例探究(作业:Keras教程+ResNets残差网络)
Keras 是更高级的框架,对普通模型来说很友好,但是要实现更复杂的模型需要 TensorFlow 等低级的框架
Michael阿明
2021/02/19
7730
卷积自编码器中注意机制和使用线性模型进行超参数分析
新神经网络架构设计的最新进展之一是注意力模块的引入。首次出现在在NLP 上的注意力背后的主要思想是为数据的重要部分添加权重。在卷积神经网络的情况下,第一个注意机制是在卷积块注意模型中提出的。其中注意机制分为两个部分:通道注意模块和空间注意模块。
deephub
2022/03/12
4010
卷积自编码器中注意机制和使用线性模型进行超参数分析
AI实战 | Tensorflow自定义数据集和迁移学习(附代码下载)
做深度学习项目时,我们一般都不用网上公开的数据集,而是用自己制作的数据集。那么,怎么用Tensorflow2.0来制作自己的数据集并把数据喂给神经网络呢?且看这篇文章慢慢道来。
墨明棋妙27
2022/09/23
5760
resnet18[通俗易懂]
从上面这幅图可以看出,在一定的训练迭代中,适合的浅层网络要比深层网络有更低的训练误差和测试误差
全栈程序员站长
2022/09/01
1.6K0
resnet18[通俗易懂]
Residual_Networks_v2a
Welcome to the second assignment of this week! You will learn how to build very deep convolutional networks, using Residual Networks (ResNets). In theory, very deep networks can represent very complex functions; but in practice, they are hard to train. Residual Networks, introduced by He et al., allow you to train much deeper networks than were previously practically feasible.
列夫托尔斯昊
2020/08/25
9880
Residual_Networks_v2a
ResNet34_keras dropout
其中在网络搭建的过程中分为4个stage,蓝色箭头是在Unet中要进行合并的层。注意:前向的运算encoder过程一共经过了5次降采样,包括刚开始的 7 ∗ 7 7*7 7∗7卷积 stride,所以decoder过程要有5次上采样的过程,但是跨层连接(encoder 与 decoder之间)只有4次,如下图所示,以输入图像大小224×224为例:
全栈程序员站长
2022/11/08
9850
ResNet34_keras dropout
【深度残差收缩网络】超简单Keras代码
从本质上讲,深度残差收缩网络属于卷积神经网络,是深度残差网络(deep residual network, ResNet)的一个变种。它的核心思想在于,在深度学习进行特征学习的过程中,剔除冗余信息是非常重要的;软阈值化是一种非常灵活的、删除冗余信息的方式。
用户6831054
2019/12/31
2.3K0
【深度残差收缩网络】超简单Keras代码
Python 深度学习第二版(GPT 重译)(四)
上一章通过简单模型(一堆Conv2D和MaxPooling2D层)和一个简单的用例(二进制图像分类)为您介绍了计算机视觉的深度学习。但是,计算机视觉不仅仅是图像分类!本章将深入探讨更多不同应用和高级最佳实践。
ApacheCN_飞龙
2024/03/21
1640
Python 深度学习第二版(GPT 重译)(四)
tensorflow2.2_实现Resnet34_花的识别[通俗易懂]
    Resnet是由许多残差块组成的,而残差块可以解决网络越深,效果越差的问题。     残差块的结构如下图所示。
全栈程序员站长
2022/11/10
6380
tensorflow2.2_实现Resnet34_花的识别[通俗易懂]
ResNet18-TensorFlow[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144894.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/30
2410
ResNet50及其Keras实现
你或许看过这篇访问量过12万的博客ResNet解析,但该博客的第一小节ResNet和吴恩达的叙述完全不同,因此博主对这篇博文持怀疑态度,你可以在这篇博文最下面找到提出该网络的论文链接,这篇博文可以作为研读这篇论文的基础。
Steve Wang
2019/05/28
6.5K0
ResNet50及其Keras实现
经典神经网络 | ResNet 论文解析及代码实现
论文题目:Deep Residual Learning for Image Recognition
墨明棋妙27
2022/09/23
7460
迁移学习之快速搭建【卷积神经网络】
卷积神经网络 概念认识:https://cloud.tencent.com/developer/article/1822928
一颗小树x
2021/05/14
2K0
迁移学习之快速搭建【卷积神经网络】
推荐阅读
相关推荐
【深度学习】MLP/LeNet/AlexNet/GoogLeNet/ResNet在三个不同数据集上的分类效果实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验