日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

resnet keras 结构_Day146:第二讲 ResNet

發布時間:2023/12/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 resnet keras 结构_Day146:第二讲 ResNet 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

出處

論文:Deep Residual Learning for Image Recognition

作者:Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun

ImageNet Top5錯誤率: 3.57%

主要思想

主要體現在 Residual(殘差),從名字就可以看出,不學絕對值,而學差值。不去學絕對的完全重構映射,只學映射后相對于原來的偏差,即和identity的差值,絕對變相對,容易多了。前向,容易學習,后向,有了梯度高速通道,更好訓練,能避免梯度消失。

殘差塊(以BasicBlock為例)

一般的網絡結構下,輸入Xl 直接經過兩個卷積層,就可以得到輸出Xl+1,而殘差塊則是將(通過兩個卷積層所得到的輸出)加上(網絡的輸入Xl),有的將這個過程成為skip connection。

skip connection 不只是可以直接將輸入Xl與卷積結果相加,某些情況下,輸入Xl與Xl+1維度不同,因此還可以加入1*1卷積對輸入進行降維,從而使Xl與Xl+1維度相同,兩者才可以相加。

網絡結構

  • 左邊是BasicBlock,ResNet18和ResNet34就由其堆疊。
  • 右邊是BottleNeck,多了一層,用1x1的卷積先降通道再升通道(首先做一個降維,然后做卷積,然后升維,這樣做的好處是可以大大減少計算量,專門用于網絡層數較深的的網絡,ResNet-50以上的網絡都有這種基礎結構構成,如ResNet50、ResNet101、ResNet152就由其堆疊)。當要降尺度的時候,3x3卷積使用stride 2(同時旁邊的shortcut也需要一個1x1的stride 2卷積,而非直接用輸入的identity,這樣可以使得后面相加的時候尺寸一致,因為不同層級的輸入輸出維度可能會不一樣,但是結構類似)。平時的卷積都是stride 1。
  • 使用1x1卷積,對稀疏信息進行壓縮,有效利用計算力,所以效率更高。

代碼實現

  • BasicBlock的代碼
def res_block_v1(x, input_filter, output_filter): res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(x) res_x = BatchNormalization()(res_x) res_x = Activation('relu')(res_x) res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(res_x) res_x = BatchNormalization()(res_x) if input_filter == output_filter: identity = x else: #需要升維或者降維 identity = Conv2D(kernel_size=(1,1), filters=output_filter, strides=1, padding='same')(x) x = keras.layers.add([identity, res_x]) output = Activation('relu')(x) return output
  • BottleNeck結構的代碼

Pytorch 中的代碼,注意到上圖中為了減少計算量,作者將 256 維的輸入縮小了 4 倍變為 64 進入卷積,在升維時需要升到 256 維,對應代碼中的 expansion 參數:

class Bottleneck(nn.Module): expansion = 4 def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, base_width=64, dilation=1, norm_layer=None): super(Bottleneck, self).__init__() if norm_layer is None: norm_layer = nn.BatchNorm2d width = int(planes * (base_width / 64.)) * groups # Both self.conv2 and self.downsample layers downsample the input when stride != 1 self.conv1 = conv1x1(inplanes, width) self.bn1 = norm_layer(width) self.conv2 = conv3x3(width, width, stride, groups, dilation) self.bn2 = norm_layer(width) self.conv3 = conv1x1(width, planes * self.expansion) self.bn3 = norm_layer(planes * self.expansion) self.relu = nn.ReLU(inplace=True) self.downsample = downsample self.stride = stride def forward(self, x): identity = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) # 要降尺度的話在這里,這里是stride 2的卷積 out = self.bn2(out) out = self.relu(out) out = self.conv3(out) out = self.bn3(out) if self.downsample is not None:# 需要通道升,尺度降 identity = self.downsample(x) # 實際上是一個stride 2卷積加bn out += identity# 相加 out = self.relu(out) return out

Pytorch中的使用

在 Pytorch 中使用 ResNet 只需要 4 行代碼:

from torch import nn# torchvision 專用于視覺方面import torchvision # pretrained :使用在 ImageNet 數據集上預訓練的模型model = torchvision.models.resnet18(pretrained=True)# 修改模型的全連接層使其輸出為你需要類型數,這里是10# 由于使用了預訓練的模型 而預訓練的模型輸出為1000類,所以要修改全連接層# 若不使用預訓練的模型可以直接在創建模型時添加參數 num_classes=10 而不需要修改全連接層model.fc = nn.Linear(model.fc.in_features, 10)

參考1:https://zhuanlan.zhihu.com/p/104657484

參考2:https://zhuanlan.zhihu.com/p/74230238

參考3:https://zhuanlan.zhihu.com/p/32781577

總結

以上是生活随笔為你收集整理的resnet keras 结构_Day146:第二讲 ResNet的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。