ResNet18的基本原理及TensorFlow 2.0实现

注:阅读本博客之前,你需要先掌握:全连接神经网络,卷积神经网络的基本原理。

背景介绍

随着LeNet-5,AlexNet,VGG等神经网络结构的出现,卷积神经网络逐渐从单纯的只拥有卷积操作和下采样的神经网络发展为具有max pooling、dropout以及非线性函数的神经网络。在网络结构变得不断复杂的同时,人们发现,神经网络的效率并没有预期得到提升,反而容易出现梯度消失等情况,因而导致loss难以减少等现象。

对于出现梯度消失的原因,大家可以参考这篇:
https://blog.csdn.net/jasonleesjtu/article/details/89185185

ResNet通过在两个卷积层之间添加短路(shortcut)的方式,有效地解决了在神经网络层数不断增加的情况下难以训练的问题。

网络结构

1、Basic Block

在这里插入图片描述
上图所示就是一个Basic Block。其中,weight layer可看成是卷积层,F(x)是x通过两个卷积层之后所学习到的。该结构的特点,就是在两个卷积层外面添加了一条shortcut,使得x经过两个卷积层之后可以以x+F(x)的形式输出。

那么,为什么这种结构可以有效地解决因网络层数增加而导致的模型难以训练的问题呢?我们以解决梯度消失为例:
             y l y_l yl=h( x l x_l xl)+F( x l x_l xl, w l w_l wl)
             x l + 1 x_{l+1} xl+1=f( y l y_l yl)
其中: x l x_l xl x l + 1 x_{l+1} xl+1分别是这个Basic Block的输入与输出项;h( x l x_l xl)= x l x_l xl,即identity,ResNet的核心;F( x l x_l xl, w l w_l w

最低0.47元/天 解锁文章
A Peaceful Tree
关注 关注
  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ResNet18基本原理tensorflow2.0实现
01-06
注:阅读本博客之前,你需要先掌握:全连接神经网络卷积神经网络基本原理。 背景介绍 随着LeNet-5,AlexNet,VGG等神经网络结构的出现,卷积神经网络逐渐从单纯的只拥有卷积操作和下采样的神经网络发展为具有max pooling、dropout以及非线性函数的神经网络。在网络结构变得不断复杂的同时,人们发现,神经网络的效率并没有预期得到提升,反而容易出现梯度消失等情况,因而导致loss难以减少等现象。 对于出现梯度消失的原因,大家可以参考这篇: https://blog.csdn.net/jasonleesjtu/article/details/89185185 ResNet通过在两
ResNet18代码实现tensorflow,80行)
Cyber的博客
08-13 4073
前言: ResNet18实现还是相对比较简单的,一共就18卷积,从数据加载到最后完成验证不到80行 import tensorflow as tf import pandas as pd import numpy as np from tensorflow.keras import layers from sklearn.metrics import classification_report import warnings warnings.filterwarnings('ignore') #数据导
resnet18实现猫狗分类
最新发布
m0_54123775的博客
04-18 953
完整数据集共25000张图片。
ResNet18详细原理(含tensorflow版源码)
Code_and516的博客
03-28 1万+
ResNet18详细原理(含tensorflow版源码)
ResNet-18详细介绍!!!!
热门推荐
m0_64799972的博客
09-08 5万+
残差神经网络(ResNet)是由微软研究院的何恺明、张祥雨、任少卿、孙剑等人提出的。ResNet 在2015 年的ILSVRC(ImageNet Large Scale Visual Recognition Challenge)中取得了冠军。残差神经网络的主要贡献是发现了“退化现象(Degradation)”,并针对退化现象发明了 “快捷连接(Shortcut connection)”,极大的消除了深度过大的神经网络训练困难问题。下面我将一步步引出退化现象和快捷连接。
深度学习基于Resnet18的图像多分类--训练自己的数据集(超详细 含源码)
weixin_49345320的博客
06-22 1万+
深度学习基于Resnet18的图像多分类--训练自己的数据集(超详细 含源码)
Resnet原理&源码简单分析
07-03 1536
嗨,小伙伴们,今天让我们来了解一下Resnet原理以及Resnet18网络在Pytorch的实现Resnet想必大家都很熟悉了,它的中文名为残差网络,是由何恺明大佬提出的一种网络结构。 在论文的开篇,提出了一个问题,神经网络越深,性能就越好吗?答案是否定的,如越深的神经网络可能造成著名的梯度消失、爆炸问题,但这个问题已经通过Batch normalization解决。 但更深的网络呢? 会出现网络层数增加但loss不降反升的情况(如下图),而且这种下降并不是通过过拟合引起的。 为了能够实现更深的网络
深度学习卷积神经网络 CIFAR10与ResNet18实战
zzp20031120的博客
02-08 1369
Tensorflow2.0实现 卷积神经网络 CIFAR10与ResNet18
TensorFlow2.0_ResNet:使用TensorFlow-2.0ResNetResNet18ResNet34,ResNet50,ResNet101,ResNet152)实现
05-22
使用TensorFlow-2.0ResNetResNet18ResNet34,ResNet50,ResNet101,ResNet152 )实现 有关更多的CNN,请参见 。 火车 要求: Python> = 3.6 Tensorflow == 2.0.0 要在自己的数据集上训练ResNet,可以将...
tensorflow2.0-unet:tensorflow2.0resnet,unet
03-12
tensorflow2.0-unet tensorflow2.0resnet,unet配置环境点安装-r require.txt然后运行demo.py即可可以查看说明.txt
resnet18-tf2:ResNet-18的简单TensorFlow 2实现
04-02
resnet18-tf2 TensorFlow ResNet的正式似乎未包括ResNet-18ResNet-34。 该代码库提供了ResNet-18ResNet-34的简单( )TensorFlow 2实现,直接从PyTorch的torchvision转换而来。 模型输出已经过验证,可与火炬...
阿里天池 Tensorflow2.0 教程笔记:ResNet18 残差网络.md
09-07
介绍了使用自定义残差块的方式实现长残差网络构建方法的介绍
yolo4_tensorflow2:tensorflow2.0实现的yolo第4版
03-21
tensorflow2.0实现的yolo第4版 [目录] 概述 对于那些在GPU平台上运行的检测器,它们的主干网络可能为VGG,ResNet,ResNeXt或DenseNet。 而对于那些在CPU平台上运行的检测器,他们的检测器可能为SqueezeNet,...
resnet.zip_Resnet TensorFlow_cifar_resnet代码实现_tensorflow ResNet
07-14
使用 TensorFlow 实现 resNet, 也就是残差网络,为官方demo, 分别用 cifar 数据集和 ImageNet 数据集进行测试。
tensorflow2.0学习资源
07-08
其中最主要介绍tensorflow的基础教程,详细明了,包括从基础到实战的视频教程,数学讲解清晰,包括resnet,rnn,goolenet,lstm,域对抗等网络的搭建实战,是有偿的,需要的可以联系我(Chovy-QW),很值得看。
ResNet原理详解
gary101818的博客
05-04 6358
目录Residual Net为什么要引入残差连接?残差网络结构解析残差块的实现ResNet模型实现 Residual Net 首先下图为一个简单的残差连接,我们先不介绍具体内涵,而是讨论一下为什么需要残差连接? 注意:googlenet在这里是拼接,resnet是相加 为什么要引入残差连接? 首先大家已经形成了一个通识,在一定程度上,网络越深表达能力越强,性能越好。 不过,好是好了,随着网络深度的增加,带来了许多问题: 计算资源的消耗 模型容易过拟合 梯度消失/梯度爆炸问题的产生 在resnet出来之
Resnet 18网络模型
Chenzhinan1219的博客
12-20 5万+
1. 残差网络:(Resnet) 残差块: 让我们聚焦于神经网络局部:如图左侧所示,假设我们的原始输入为x,而希望学出的理想映射为f(x)(作为上方激活函数的输入)。左图虚线框中的部分需要直接拟合出该映射f(x),而右图虚线框中的部分则需要拟合出残差映射f(x)−x。 残差映射在现实中往往更容易优化。 以本节开头提到的恒等映射作为我们希望学出的理想映射f(x),我们只需将右图虚线框内上方的加权运算(如仿射)的权重和偏置参数设成0,那么f(x)即为恒等映射。 实际中,当理想映射f(x)极接近于恒等映..
ResNet18、50模型结构
pywin
02-11 1万+
resnet18resnet50模型结构
tensorflow2.0实现resnet50
06-28
### 回答1: TensorFlow 2.可以通过使用Keras API来实现ResNet50模型。ResNet50是一种深度卷积神经网络,由50个卷积层组成,用于图像分类和目标检测等任务。 以下是使用TensorFlow 2.和Keras API实现ResNet50的示例代码: ```python import tensorflow as tf from tensorflow.keras.applications.resnet50 import ResNet50 from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras.models import Model # 加载ResNet50模型 resnet = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) # 冻结ResNet50模型的所有层 for layer in resnet.layers: layer.trainable = False # 添加自定义输出层 x = resnet.output x = Flatten()(x) x = Dense(1024, activation='relu')(x) predictions = Dense(100, activation='softmax')(x) # 构建新模型 model = Model(inputs=resnet.input, outputs=predictions) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) ``` 在上面的代码中,我们首先加载了预训练的ResNet50模型,并将其所有层都冻结。然后,我们添加了自定义的输出层,并使用Keras API构建了一个新模型。最后,我们编译了模型并指定了优化器、损失函数和评估指标。 接下来,我们可以使用该模型进行训练和预测。例如,我们可以使用以下代码加载图像数据集并训练模型: ```python from tensorflow.keras.preprocessing.image import ImageDataGenerator # 加载图像数据集 train_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( 'data/train', target_size=(224, 224), batch_size=32, class_mode='categorical') # 训练模型 model.fit_generator( train_generator, steps_per_epoch=200, epochs=50) ``` 在上面的代码中,我们使用Keras的ImageDataGenerator类加载了图像数据集,并指定了训练集的目录、图像大小和批量大小等参数。然后,我们使用fit_generator()方法训练模型,并指定了训练集的步数和训练轮数等参数。 最后,我们可以使用以下代码对新数据进行预测: ```python import numpy as np from tensorflow.keras.preprocessing import image # 加载测试图像 img_path = 'data/test/cat.jpg' img = image.load_img(img_path, target_size=(224, 224)) x = image.img_to_array(img) x = np.expand_dims(x, axis=) x = preprocess_input(x) # 预测图像类别 preds = model.predict(x) print('Predicted:', decode_predictions(preds, top=3)[]) ``` 在上面的代码中,我们使用Keras的image模块加载了测试图像,并将其转换为NumPy数组。然后,我们使用预处理函数preprocess_input()对图像进行预处理,并使用模型的predict()方法对图像进行预测。最后,我们使用decode_predictions()函数将预测结果转换为可读的格式。 ### 回答2: Tensorflow是一种流行的深度学习框架,它可以用来实现各种神经网络模型,包括ResNet。首先,需要安装Tensorflow2.0版本。进入Python环境,可以用命令`pip install tensorflow==2.0`来安装。 ResNet是一种广泛使用的深度卷积神经网络结构,其核心思想是使用残差模块来缓解深层网络中的梯度消失问题,以提高训练效果和模型的表现力。ResNet有很多变种,包括ResNet-50、ResNet-101等。这里以ResNet-50为例进行实现。 首先,需要导入必要的库,包括Tensorflow和相关的Keras模块: ``` import tensorflow as tf from tensorflow import keras from tensorflow.keras.layers import Conv2D, BatchNormalization, ReLU, Add, AvgPool2D, Dense, Flatten ``` 然后,定义ResNet-50的基本残差模块,包含两个卷积层和一个残差连接: ``` class ResidualBlock(keras.Model): def __init__(self, in_channels, out_channels, strides=1, use_bias=False): super(ResidualBlock, self).__init__() self.conv1 = keras.Sequential([ Conv2D(out_channels // 4, kernel_size=1, strides=1, use_bias=False), BatchNormalization(), ReLU() ]) self.conv2 = keras.Sequential([ Conv2D(out_channels // 4, kernel_size=3, strides=strides, padding='same', use_bias=False), BatchNormalization(), ReLU() ]) self.conv3 = keras.Sequential([ Conv2D(out_channels, kernel_size=1, strides=1, use_bias=False), BatchNormalization(), ]) self.shortcut = keras.Sequential() if strides != 1 or in_channels != out_channels: self.shortcut = keras.Sequential([ Conv2D(out_channels, kernel_size=1, strides=strides, use_bias=False), BatchNormalization(), ]) self.relu = ReLU() def call(self, inputs): x = self.conv1(inputs) x = self.conv2(x) x = self.conv3(x) shortcut = self.shortcut(inputs) x = Add()([x, shortcut]) x = self.relu(x) return x ``` 接着,定义ResNet-50的整体结构,包含多个残差模块和全连接层: ``` class ResNet(keras.Model): def __init__(self, block, num_blocks, num_classes): super(ResNet, self).__init__() self.in_channels = 64 self.conv1 = keras.Sequential([ Conv2D(64, kernel_size=7, strides=2, padding='same', use_bias=False), BatchNormalization(), ReLU(), AvgPool2D(pool_size=3, strides=2, padding='same') ]) self.layer1 = self._make_layer(block, 64, num_blocks[0], strides=1) self.layer2 = self._make_layer(block, 128, num_blocks[1], strides=2) self.layer3 = self._make_layer(block, 256, num_blocks[2], strides=2) self.layer4 = self._make_layer(block, 512, num_blocks[3], strides=2) self.avgpool = AvgPool2D(pool_size=7, strides=1) self.flatten = Flatten() self.fc = Dense(num_classes, activation='softmax') def _make_layer(self, block, out_channels, num_blocks, strides): strides_list = [strides] + [1] * (num_blocks - 1) layers = keras.Sequential() for stride in strides_list: layers.add(block(self.in_channels, out_channels, stride)) self.in_channels = out_channels return layers def call(self, inputs): x = self.conv1(inputs) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.layer4(x) x = self.avgpool(x) x = self.flatten(x) x = self.fc(x) return x ``` 可以看到,ResNet-50的实现比较复杂,包含多个残差模块和全连接层。其中,`_make_layer`方法用来构建多个残差模块,`call`方法用来定义整个网络结构。最后可以用以下代码来进行模型的训练和测试: ``` model = ResNet(ResidualBlock, [3, 4, 6, 3], num_classes=10) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) (x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data() x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 y_train = keras.utils.to_categorical(y_train, num_classes=10) y_test = keras.utils.to_categorical(y_test, num_classes=10) model.fit(x_train, y_train, batch_size=64, epochs=10, validation_data=(x_test, y_test)) ``` 这里的数据集是CIFAR-10,数据预处理和训练过程略。运行以上代码,就可以得到一个训练好的ResNet-50模型。 ### 回答3: ResNet50是Residual Network的一种经典架构,它能有效缓解深度卷积神经网络的梯度弥散问题,使得网络能够更深,参数更多,最终达到更好的性能。今天我们将介绍如何用TensorFlow 2.0实现ResNet50。 首先,我们导入相关的包: ``` import tensorflow as tf from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, BatchNormalization, GlobalAveragePooling2D, Dropout, Flatten, Input, add from tensorflow.keras.models import Model ``` 然后我们定义ResNet50的基础单元,也叫作残差块。这个残差块由两层卷积、批归一化、Relu激活函数和一个恒等映射构成。就像这样: ``` def residual_block(inputs, filters, kernel_size, strides): shortcut = inputs x = Conv2D(filters[0], kernel_size=1, strides=strides, padding='valid')(inputs) x = BatchNormalization()(x) x = tf.keras.layers.ReLU()(x) x = Conv2D(filters[1], kernel_size=kernel_size, strides=1, padding='same')(x) x = BatchNormalization()(x) x = tf.keras.layers.ReLU()(x) x = Conv2D(filters[2], kernel_size=1, strides=1, padding='valid')(x) x = BatchNormalization()(x) if strides != 1 or inputs.shape[-1] != filters[2]: shortcut = Conv2D(filters[2], kernel_size=1, strides=strides, padding='valid')(shortcut) shortcut = BatchNormalization()(shortcut) x = add([x, shortcut]) x = tf.keras.layers.ReLU()(x) return x ``` 接下来定义ResNet50的完整模型。整个模型由7个卷积层、4个残差块和一个全连接层构成。就像这样: ``` def ResNet50(input_shape=(224, 224, 3)): inputs = Input(input_shape) x = Conv2D(64, kernel_size=7, strides=2, padding='same')(inputs) x = BatchNormalization()(x) x = tf.keras.layers.ReLU()(x) x = MaxPooling2D(pool_size=3, strides=2, padding='same')(x) x = residual_block(x, [64, 64, 256], kernel_size=3, strides=1) x = residual_block(x, [64, 64, 256], kernel_size=3, strides=1) x = residual_block(x, [64, 64, 256], kernel_size=3, strides=1) x = residual_block(x, [128, 128, 512], kernel_size=3, strides=2) x = residual_block(x, [128, 128, 512], kernel_size=3, strides=1) x = residual_block(x, [128, 128, 512], kernel_size=3, strides=1) x = residual_block(x, [128, 128, 512], kernel_size=3, strides=1) x = residual_block(x, [256, 256, 1024], kernel_size=3, strides=2) x = residual_block(x, [256, 256, 1024], kernel_size=3, strides=1) x = residual_block(x, [256, 256, 1024], kernel_size=3, strides=1) x = residual_block(x, [256, 256, 1024], kernel_size=3, strides=1) x = residual_block(x, [256, 256, 1024], kernel_size=3, strides=1) x = residual_block(x, [256, 256, 1024], kernel_size=3, strides=1) x = residual_block(x, [512, 512, 2048], kernel_size=3, strides=2) x = residual_block(x, [512, 512, 2048], kernel_size=3, strides=1) x = residual_block(x, [512, 512, 2048], kernel_size=3, strides=1) x = GlobalAveragePooling2D()(x) x = Dense(1000, activation='softmax')(x) model = Model(inputs=inputs, outputs=x) return model ``` 最后我们构建一个ResNet50模型,并使用ImageDataGenerator读取数据集和fit方法训练模型: ``` datagenerator_train = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255.0) datagenerator_test = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255.0) train_generator = datagenerator_train.flow_from_directory('./data/train', target_size=(224,224), batch_size=32, class_mode='categorical') valid_generator = datagenerator_test.flow_from_directory('./data/valid', target_size=(224,224), batch_size=32, class_mode='categorical') model = ResNet50() model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) history = model.fit(train_generator, epochs=10, validation_data=valid_generator) ``` 现在,你已经成功地使用TensorFlow 2.0实现ResNet50模型,并使用ImageDataGenerator读取数据集和fit方法训练了模型,你可以拿到数据集进行测试并进行更多的调整,期望能够取得优秀的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • ResNet18的基本原理及TensorFlow 2.0实现 4797
  • 机器学习中K-Means聚类算法的原理及实现(Python) 850
  • An Introduction to GAN 610
  • Is Combining LSTM with CNN better than Using Single LSTM when Doing NLP ? 335
  • Summary of Common Usages of PythonⅠ 252

分类专栏

  • CS224n学习笔记

最新评论

  • 机器学习中K-Means聚类算法的原理及实现(Python)

    AmanoTooko_: randcent里的mat是啥

最新文章

  • Is Combining LSTM with CNN better than Using Single LSTM when Doing NLP ?
  • Summary of Common Usages of PythonⅠ
  • An Introduction to GAN
2020年5篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

两个鬼故事王字起名三个字小店铺起名字大全上下五千年读后感10月24日演员乔乔青囊尸衣txt下载韩尚宫烤肉烟酒店起名有创意男孩子免费起名梓起姓名含义起名大全工具猪宝起名宜用字的项羽简介御手洗红豆少年易老学难成噜啊噜谭秋娟自助烧烤店曾姓起名十二星座图张姓女宝宝起名高分和晟字搭配起公司名起名有骞字好不好诊所起名字大全免费起名男生楚辞女诗经康斯坦丁第二季徐沐婵四月初四是什么星座韩姓起名韩姓名字大全男孩中餐加盟品牌少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

两个鬼故事 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化