Python----神經網絡(《Inverted Residuals and Linear Bottlenecks》論文概括和MobileNetV2網絡)

一、論文

????????MobileNetV2 論文提出了一種新的移動架構,該架構提高了移動模型在多個任務和基準測試中的性能,以及在各種不同模型大小范圍內的性能. 該架構基于倒殘差結構,其中 shortcut 連接在 thin bottleneck 層之間. 中間的 expansion 層使用輕量級 depthwise 卷積來過濾特征,作為非線性的來源. 此外,作者發現,為了保持表示能力,重要的是要移除 narrow 層中的非線性. 論文展示了這種架構在 ImageNet 分類、COCO 目標檢測和 VOC 圖像分割任務中的有效性. 論文評估了準確性、計算成本(以 multiply-adds 衡量)、延遲和參數數量之間的權衡. 該論文的關鍵貢獻是具有線性 bottleneck 的倒殘差模塊,它可以實現高效的推理并減少內存占用.

1.1、基本信息?

  • 標題: MobileNetV2: Inverted Residuals and Linear Bottlenecks ?

  • 作者: Mark Sandler, Andrew Howard, Menglong Zhu, Andrey Zhmoginov, Liang-Chieh Chen ?

  • 單位: Google Inc. ?

  • 主要貢獻: 提出了一種新的移動架構,MobileNetV2,它提高了移動模型在多個任務和基準測試中的性能,以及不同模型大小范圍內的性能。 ?

1.2、主要內容

1.2.1、倒殘差塊和線性瓶頸

  • MobileNetV2 的核心創新在于“倒殘差塊”。傳統的殘差塊(如 ResNet 中的)連接的是較寬的層,而倒殘差塊連接的是較窄的 bottleneck 層。中間的 expansion 層負責擴展通道維度。

  • 這些塊使用深度可分離卷積以提高效率。

  • 一個關鍵要素是“線性 bottleneck”。論文認為,ReLU 非線性激活在低維空間中可能會破壞信息。因此,每個塊的最后一層是線性的(沒有 ReLU),以保留信息。

1.2.2、架構設計

  • MobileNetV2 在 MobileNetV1 的深度可分離卷積的基礎上構建。

  • 該架構由一個初始卷積層、一系列倒殘差塊和一個最終卷積層組成。

  • 平均池化層和全連接層用于分類。

  • 使用寬度乘數和分辨率乘數來創建更小、計算量更少的模型。

1.2.3、效率

  • 倒殘差結構旨在實現高內存效率,這對于移動設備至關重要。它可以減少內存占用和對昂貴的內存訪問的需求。

  • 與標準卷積相比,深度可分離卷積顯著減少了參數數量和計算量。

1.2.4、性能

  • 論文表明,MobileNetV2 在 ImageNet 分類任務上比 MobileNetV1 實現了更高的準確率和效率。

  • 它還在目標檢測(使用 SSDLite)和語義分割(使用 Mobile DeepLabv3)方面取得了出色的效果。

1.3、作用

????????MobileNetV2 旨在為移動和資源受限環境提供高效的卷積神經網絡。 ?它在準確性和計算成本之間實現了有效的權衡。

1.4、影響

????????MobileNetV2 改進了 MobileNetV1 的架構,并在多個任務和基準測試中實現了最先進的性能。它為在資源受限的設備上部署深度學習模型提供了一種有效的方法。

1.5、優點

  • 效率: MobileNetV2 通過使用 depthwise separable 卷積和 inverted residuals,顯著減少了計算需求和內存占用。 ?

  • 性能: MobileNetV2 在圖像分類、目標檢測和語義分割等任務中表現出色。 ?

  • 可調性: 寬度乘數和分辨率乘數允許輕松調整模型大小,以適應不同的資源約束。 ?

  • 內存效率: 倒殘差 bottleneck 層允許特別節省內存的實現,這對于移動應用程序非常重要。

1.6、缺點

  • 復雜性: 與 MobileNetV1 相比,MobileNetV2 引入了 inverted residual 塊,這可能會使模型架構更復雜。

  • 權衡: 雖然寬度乘數和分辨率乘數提供了靈活性,但它們需要在準確性和效率之間進行仔細的權衡。

論文地址:

????????[1801.04381] MobileNetV2: Inverted Residuals and Linear Bottlenecks

?二、MobileNetV2

2.1、網絡的背景

????????MobileNetV1網絡的depthwise部分的卷積核容易參數為0,導致浪費掉。 MobileNetV2網絡是由谷歌團隊在2018年提出的,它對于MobileNetV1而言,有著更高的準確率和更小的網絡模型。

2.2、Inverted Residuals(倒殘差結構)?

????????在MobileNetV2 中,是先升維,再降維的操作,所以該結構叫倒殘差結構,網絡結構表格中的 bottleneck就是倒殘差結構。

殘差結構的過程是:

????????1、1x1卷積降維

????????2、3x3卷積

????????3、1x1卷積升維

????????即對輸入特征矩陣進行利用1x1卷積進行降維,減少輸入特征矩陣的channel,然后 通過3x3的卷積核進行處理提取特征,最后通過1x1的卷積核進行升維,那么它的結 構就是兩邊深,中間淺的結構。

????????在MobileNetV2網絡結構中,采用了倒殘差結構,從名字可以聯想到,它的結構應該 是中間深,兩邊淺,它的結構如下圖所示:

倒殘差結構的過程是:?

????????1、 首先會通過一個1x1卷積層來進行升維處理,在卷積后會跟有BN和Relu6激活函 數

????????2、 緊接著是一個3x3大小DW卷積,卷積后面依舊會跟有BN和Relu6激活函數

????????3、 最后一個卷積層是1x1卷積,起到降維作用,注意卷積后只跟了BN結構,并沒有 使用Relu6激活函數

????????在MobileNetV1中,DW卷積的個數局限于上一層的輸出通道數,無法自由改變,但 是加入PW卷積之后,也就是升維卷積之后,DW卷積的個數取決于PW卷積的輸出通 道數,而這個通道數是可以任意指定的,因此解除了3x3卷積核個數的限制。

2.3、Relu6

????????因為在低維空間使用非線性函數(如Relu)會損失一些信息,高維空間中會損失得相 對少一些,因此引入Inverted Residuals,升維之后再卷積,能夠更好地保留特征。

????????在移動端設備float16的低精度的時 候,也能有很好的數值分辨率,如果對Relu的激活范圍不加限制,輸出范圍為0到正 無窮,如果激活值非常大,分布在一個很大的范圍內,則低精度的float16無法很好 地精確描述如此大范圍的數值,帶來精度損失,所以在量化過程中,Relu6能夠有更 好的量化表現和更小的精度下降。

2.4、Linear Bottlenecks

2.5、Shortcut?

????????注意:Shortcut并不是該網絡提出的,而是殘差結構提出的。

????????這里由于具有倒殘差結構,所以也會有shortcut操作,如下圖所示,左側為有 shortcut連接的倒殘差結構,右側是無shortcut連接的倒殘差結構:

????????shortcut將輸入與輸出直接進行相加,可以使得網絡在較深的時候依舊可以進行訓 練。

注意:這里只有stride=1且輸入特征矩陣與輸出特征矩陣shape相同時才有 shortcut連接。

2.6、拓展因子

舉例:

????????假如輸入特征矩陣是128維的,隱藏層個數是256,條件1是輸出必須有128個 為正,并且這128個輸出為正的神經元的應該是非線性相關的。

~~~~當隱藏層m遠大于輸入n,那么 更容易讓ReLU保持可逆。

在訓練前和訓練后,各個層是否發生了不可逆的情況, 如下圖所示:

????????在訓練前,由于都是初始化的,所以激活為正的特征個數都比較集中,圖中虛線是信 息會丟失的閾值,縱坐標低于該虛線,會導致信息丟失。在訓練后,平均值變化較 小,但是兩級分化較為嚴重,有一些最小值已經低于了閾值,就會造成信息丟失,但 是絕大多數層還是可逆的。????????

2.7、網絡的結構

????????Input是每一層結構的輸入矩陣尺寸和channel;

????????Operator是操作;

????????t是拓展因子;

????????c是輸出特征矩陣channel;

????????n是bottleneck的重復次數;

????????s是步距,如果bottleneck重復,但只針對于第一次bottleneck的DW卷積,其他為 1。

????????由網絡結構的圖可以看到最后一層是卷積層,但是其實就是一個全連接層的作用,k 是輸出的類別,如果是ImageNet數據集,那么k就是1000。

注意:

????????在每個DW卷積之后都有batchNorm操作,這里組件中為了減少學習者工 作量并沒有體現該結構,但是學習者需要知道。

注意:

????????在第一個bottleneck結構中,由于t=1,所以并沒有進行升維操作,即沒有 第一個Conv2D層。

import torch
import torch.nn as nn
import torch.nn.functional as F
from torchsummary import summary# 定義一個輔助函數,用于確保通道數可以被 divisor 整除,這對于硬件優化很重要
def _make_divisible(v, divisor, min_value=None):"""確保通道數 v 可以被 divisor 整除,如果需要可以指定最小值 min_value。這個技巧在移動端神經網絡設計中常用,有助于硬件加速。"""if min_value is None:min_value = divisornew_v = max(min_value, int(v + divisor / 2) // divisor * divisor)# 為了避免向下取整過多導致信息損失,進行一個小的調整if new_v < 0.9 * v:new_v += divisorreturn new_v# 定義一個卷積 + BatchNorm + ReLU6 的基本塊
class ConvBNReLU(nn.Sequential):def __init__(self, in_planes, out_planes, kernel_size, stride, groups=1):"""卷積、批歸一化和 ReLU6 激活函數的組合。groups 參數用于實現分組卷積(當 groups > 1 時)或深度可分離卷積(當 groups 等于輸入通道數時)。"""padding = (kernel_size - 1) // 2super(ConvBNReLU, self).__init__(nn.Conv2d(in_planes, out_planes, kernel_size, stride, padding, groups=groups, bias=False),nn.BatchNorm2d(out_planes),nn.ReLU6(inplace=True) # ReLU6 激活函數,限制輸出范圍在 [0, 6])# 定義 MobileNetV2 的核心模塊:倒置殘差塊 (Inverted Residual Block)
class InvertedResidual(nn.Module):def __init__(self, inp, oup, stride, expand_ratio):"""倒置殘差塊是 MobileNetV2 的基本構建單元。它首先通過一個擴展層增加通道數,然后進行深度可分離卷積,最后通過一個投影層減少通道數。如果輸入和輸出的形狀相同且步長為 1,則使用殘差連接。Args:inp (int): 輸入通道數oup (int): 輸出通道數stride (int): 卷積步長 (1 或 2)expand_ratio (int): 擴展率,中間層的通道數是輸入通道數的 expand_ratio 倍"""super(InvertedResidual, self).__init__()self.stride = strideassert stride in [1, 2]hidden_dim = int(round(inp * expand_ratio)) # 中間擴展層的通道數self.use_res_connect = self.stride == 1 and inp == oup # 判斷是否使用殘差連接layers = []if expand_ratio != 1:# 擴展層:1x1 卷積增加通道數layers.append(ConvBNReLU(inp, hidden_dim, kernel_size=1, stride=1))layers.extend([# 深度可分離卷積:一個深度卷積和一個逐點卷積的組合# 深度卷積 (Depthwise Convolution): 每個輸入通道應用一個獨立的卷積核ConvBNReLU(hidden_dim, hidden_dim, kernel_size=3, stride=stride, groups=hidden_dim),# 逐點卷積 (Pointwise Convolution): 1x1 卷積用于線性地組合深度卷積的輸出nn.Conv2d(hidden_dim, oup, kernel_size=1, stride=1, bias=False),nn.BatchNorm2d(oup),])self.conv = nn.Sequential(*layers)def forward(self, x):if self.use_res_connect:return x + self.conv(x) # 如果滿足條件,使用殘差連接else:return self.conv(x)# 定義 MobileNetV2 網絡結構
class MobileNetV2(nn.Module):def __init__(self, num_classes=1000, width_mult=1.0, inverted_residual_setting=None, round_nearest=8):"""MobileNet V2 的主體網絡結構。Args:num_classes (int): 分類的類別數width_mult (float): 寬度乘數,用于調整網絡中所有層的通道數,控制模型大小inverted_residual_setting (list of list): 倒置殘差塊的配置列表,每個子列表包含 [t, c, n, s],分別表示擴展率 (t),輸出通道數 (c),重復次數 (n),步長 (s)。round_nearest (int): 將通道數調整為最接近的 round_nearest 的倍數,有助于硬件優化。"""super(MobileNetV2, self).__init__()if inverted_residual_setting is None:# 默認的 MobileNetV2 結構參數input_channel = 32last_channel = 1280inverted_residual_setting = [# t, c, n, s[1, 16, 1, 1],[6, 24, 2, 2],[6, 32, 3, 2],[6, 64, 4, 2],[6, 96, 3, 1],[6, 160, 3, 2],[6, 320, 1, 1],]else:# 如果提供了自定義的 inverted_residual_setting,則使用它if len(inverted_residual_setting) != 7:raise ValueError("inverted_residual_setting 應該包含 7 個層級的配置")# 構建網絡的第一個卷積層input_channel = _make_divisible(input_channel * width_mult, round_nearest)self.last_channel = _make_divisible(last_channel * max(1.0, width_mult), round_nearest)features = [ConvBNReLU(3, input_channel, kernel_size=3, stride=2)] # 輸入通道數為 3 (RGB),輸出通道數為調整后的 input_channel,步長為 2# 構建倒置殘差塊for t, c, n, s in inverted_residual_setting:output_channel = _make_divisible(c * width_mult, round_nearest)for i in range(n):stride = s if i == 0 else 1 # 只有每個模塊的第一個殘差塊使用指定的步長,其余步長都為 1features.append(InvertedResidual(input_channel, output_channel, stride, expand_ratio=t))input_channel = output_channel # 更新下一個殘差塊的輸入通道數# 構建最后一個卷積層features.append(ConvBNReLU(input_channel, self.last_channel, kernel_size=1, stride=1))# 將特征提取層封裝成 Sequential 容器self.features = nn.Sequential(*features)# 構建分類器self.classifier = nn.Sequential(nn.Dropout(0.2), # Dropout 正則化,防止過擬合nn.Linear(self.last_channel, num_classes), # 全連接層,將特征映射到類別數)# 初始化權重for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.kaiming_normal_(m.weight, mode='fan_out') # 使用 Kaiming 正態分布初始化卷積層權重if m.bias is not None:nn.init.zeros_(m.bias) # 如果有偏置,初始化為 0elif isinstance(m, nn.BatchNorm2d):nn.init.ones_(m.weight) # BatchNorm 的權重初始化為 1nn.init.zeros_(m.bias) # BatchNorm 的偏置初始化為 0elif isinstance(m, nn.Linear):nn.init.normal_(m.weight, 0, 0.01) # 全連接層的權重使用均值為 0,標準差為 0.01 的正態分布初始化nn.init.zeros_(m.bias) # 全連接層的偏置初始化為 0def _forward_impl(self, x):# 前向傳播的實現x = self.features(x) # 通過特征提取層x = F.adaptive_avg_pool2d(x, 1) # 自適應平均池化,將特征圖尺寸變為 1x1x = torch.flatten(x, 1) # 將特征圖展平成一維向量x = self.classifier(x) # 通過分類器return xdef forward(self, x):# 定義前向傳播函數return self._forward_impl(x)if __name__ == '__main__':model = MobileNetV2()print(summary(model,(3,224,224)))
----------------------------------------------------------------Layer (type)               Output Shape         Param #
================================================================Conv2d-1         [-1, 32, 112, 112]             864BatchNorm2d-2         [-1, 32, 112, 112]              64ReLU6-3         [-1, 32, 112, 112]               0Conv2d-4         [-1, 32, 112, 112]             288BatchNorm2d-5         [-1, 32, 112, 112]              64ReLU6-6         [-1, 32, 112, 112]               0Conv2d-7         [-1, 16, 112, 112]             512BatchNorm2d-8         [-1, 16, 112, 112]              32InvertedResidual-9         [-1, 16, 112, 112]               0Conv2d-10         [-1, 96, 112, 112]           1,536BatchNorm2d-11         [-1, 96, 112, 112]             192ReLU6-12         [-1, 96, 112, 112]               0Conv2d-13           [-1, 96, 56, 56]             864BatchNorm2d-14           [-1, 96, 56, 56]             192ReLU6-15           [-1, 96, 56, 56]               0Conv2d-16           [-1, 24, 56, 56]           2,304BatchNorm2d-17           [-1, 24, 56, 56]              48InvertedResidual-18           [-1, 24, 56, 56]               0Conv2d-19          [-1, 144, 56, 56]           3,456BatchNorm2d-20          [-1, 144, 56, 56]             288ReLU6-21          [-1, 144, 56, 56]               0Conv2d-22          [-1, 144, 56, 56]           1,296BatchNorm2d-23          [-1, 144, 56, 56]             288ReLU6-24          [-1, 144, 56, 56]               0Conv2d-25           [-1, 24, 56, 56]           3,456BatchNorm2d-26           [-1, 24, 56, 56]              48InvertedResidual-27           [-1, 24, 56, 56]               0Conv2d-28          [-1, 144, 56, 56]           3,456BatchNorm2d-29          [-1, 144, 56, 56]             288ReLU6-30          [-1, 144, 56, 56]               0Conv2d-31          [-1, 144, 28, 28]           1,296BatchNorm2d-32          [-1, 144, 28, 28]             288ReLU6-33          [-1, 144, 28, 28]               0Conv2d-34           [-1, 32, 28, 28]           4,608BatchNorm2d-35           [-1, 32, 28, 28]              64InvertedResidual-36           [-1, 32, 28, 28]               0Conv2d-37          [-1, 192, 28, 28]           6,144BatchNorm2d-38          [-1, 192, 28, 28]             384ReLU6-39          [-1, 192, 28, 28]               0Conv2d-40          [-1, 192, 28, 28]           1,728BatchNorm2d-41          [-1, 192, 28, 28]             384ReLU6-42          [-1, 192, 28, 28]               0Conv2d-43           [-1, 32, 28, 28]           6,144BatchNorm2d-44           [-1, 32, 28, 28]              64InvertedResidual-45           [-1, 32, 28, 28]               0Conv2d-46          [-1, 192, 28, 28]           6,144BatchNorm2d-47          [-1, 192, 28, 28]             384ReLU6-48          [-1, 192, 28, 28]               0Conv2d-49          [-1, 192, 28, 28]           1,728BatchNorm2d-50          [-1, 192, 28, 28]             384ReLU6-51          [-1, 192, 28, 28]               0Conv2d-52           [-1, 32, 28, 28]           6,144BatchNorm2d-53           [-1, 32, 28, 28]              64InvertedResidual-54           [-1, 32, 28, 28]               0Conv2d-55          [-1, 192, 28, 28]           6,144BatchNorm2d-56          [-1, 192, 28, 28]             384ReLU6-57          [-1, 192, 28, 28]               0Conv2d-58          [-1, 192, 14, 14]           1,728BatchNorm2d-59          [-1, 192, 14, 14]             384ReLU6-60          [-1, 192, 14, 14]               0Conv2d-61           [-1, 64, 14, 14]          12,288BatchNorm2d-62           [-1, 64, 14, 14]             128InvertedResidual-63           [-1, 64, 14, 14]               0Conv2d-64          [-1, 384, 14, 14]          24,576BatchNorm2d-65          [-1, 384, 14, 14]             768ReLU6-66          [-1, 384, 14, 14]               0Conv2d-67          [-1, 384, 14, 14]           3,456BatchNorm2d-68          [-1, 384, 14, 14]             768ReLU6-69          [-1, 384, 14, 14]               0Conv2d-70           [-1, 64, 14, 14]          24,576BatchNorm2d-71           [-1, 64, 14, 14]             128InvertedResidual-72           [-1, 64, 14, 14]               0Conv2d-73          [-1, 384, 14, 14]          24,576BatchNorm2d-74          [-1, 384, 14, 14]             768ReLU6-75          [-1, 384, 14, 14]               0Conv2d-76          [-1, 384, 14, 14]           3,456BatchNorm2d-77          [-1, 384, 14, 14]             768ReLU6-78          [-1, 384, 14, 14]               0Conv2d-79           [-1, 64, 14, 14]          24,576BatchNorm2d-80           [-1, 64, 14, 14]             128InvertedResidual-81           [-1, 64, 14, 14]               0Conv2d-82          [-1, 384, 14, 14]          24,576BatchNorm2d-83          [-1, 384, 14, 14]             768ReLU6-84          [-1, 384, 14, 14]               0Conv2d-85          [-1, 384, 14, 14]           3,456BatchNorm2d-86          [-1, 384, 14, 14]             768ReLU6-87          [-1, 384, 14, 14]               0Conv2d-88           [-1, 64, 14, 14]          24,576BatchNorm2d-89           [-1, 64, 14, 14]             128InvertedResidual-90           [-1, 64, 14, 14]               0Conv2d-91          [-1, 384, 14, 14]          24,576BatchNorm2d-92          [-1, 384, 14, 14]             768ReLU6-93          [-1, 384, 14, 14]               0Conv2d-94          [-1, 384, 14, 14]           3,456BatchNorm2d-95          [-1, 384, 14, 14]             768ReLU6-96          [-1, 384, 14, 14]               0Conv2d-97           [-1, 96, 14, 14]          36,864BatchNorm2d-98           [-1, 96, 14, 14]             192InvertedResidual-99           [-1, 96, 14, 14]               0Conv2d-100          [-1, 576, 14, 14]          55,296BatchNorm2d-101          [-1, 576, 14, 14]           1,152ReLU6-102          [-1, 576, 14, 14]               0Conv2d-103          [-1, 576, 14, 14]           5,184BatchNorm2d-104          [-1, 576, 14, 14]           1,152ReLU6-105          [-1, 576, 14, 14]               0Conv2d-106           [-1, 96, 14, 14]          55,296BatchNorm2d-107           [-1, 96, 14, 14]             192
InvertedResidual-108           [-1, 96, 14, 14]               0Conv2d-109          [-1, 576, 14, 14]          55,296BatchNorm2d-110          [-1, 576, 14, 14]           1,152ReLU6-111          [-1, 576, 14, 14]               0Conv2d-112          [-1, 576, 14, 14]           5,184BatchNorm2d-113          [-1, 576, 14, 14]           1,152ReLU6-114          [-1, 576, 14, 14]               0Conv2d-115           [-1, 96, 14, 14]          55,296BatchNorm2d-116           [-1, 96, 14, 14]             192
InvertedResidual-117           [-1, 96, 14, 14]               0Conv2d-118          [-1, 576, 14, 14]          55,296BatchNorm2d-119          [-1, 576, 14, 14]           1,152ReLU6-120          [-1, 576, 14, 14]               0Conv2d-121            [-1, 576, 7, 7]           5,184BatchNorm2d-122            [-1, 576, 7, 7]           1,152ReLU6-123            [-1, 576, 7, 7]               0Conv2d-124            [-1, 160, 7, 7]          92,160BatchNorm2d-125            [-1, 160, 7, 7]             320
InvertedResidual-126            [-1, 160, 7, 7]               0Conv2d-127            [-1, 960, 7, 7]         153,600BatchNorm2d-128            [-1, 960, 7, 7]           1,920ReLU6-129            [-1, 960, 7, 7]               0Conv2d-130            [-1, 960, 7, 7]           8,640BatchNorm2d-131            [-1, 960, 7, 7]           1,920ReLU6-132            [-1, 960, 7, 7]               0Conv2d-133            [-1, 160, 7, 7]         153,600BatchNorm2d-134            [-1, 160, 7, 7]             320
InvertedResidual-135            [-1, 160, 7, 7]               0Conv2d-136            [-1, 960, 7, 7]         153,600BatchNorm2d-137            [-1, 960, 7, 7]           1,920ReLU6-138            [-1, 960, 7, 7]               0Conv2d-139            [-1, 960, 7, 7]           8,640BatchNorm2d-140            [-1, 960, 7, 7]           1,920ReLU6-141            [-1, 960, 7, 7]               0Conv2d-142            [-1, 160, 7, 7]         153,600BatchNorm2d-143            [-1, 160, 7, 7]             320
InvertedResidual-144            [-1, 160, 7, 7]               0Conv2d-145            [-1, 960, 7, 7]         153,600BatchNorm2d-146            [-1, 960, 7, 7]           1,920ReLU6-147            [-1, 960, 7, 7]               0Conv2d-148            [-1, 960, 7, 7]           8,640BatchNorm2d-149            [-1, 960, 7, 7]           1,920ReLU6-150            [-1, 960, 7, 7]               0Conv2d-151            [-1, 320, 7, 7]         307,200BatchNorm2d-152            [-1, 320, 7, 7]             640
InvertedResidual-153            [-1, 320, 7, 7]               0Conv2d-154           [-1, 1280, 7, 7]         409,600BatchNorm2d-155           [-1, 1280, 7, 7]           2,560ReLU6-156           [-1, 1280, 7, 7]               0Dropout-157                 [-1, 1280]               0Linear-158                 [-1, 1000]       1,281,000
================================================================
Total params: 3,504,872
Trainable params: 3,504,872
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.57
Forward/backward pass size (MB): 152.87
Params size (MB): 13.37
Estimated Total Size (MB): 166.81
----------------------------------------------------------------

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80907.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80907.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80907.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Maven私服搭建與登錄全攻略

目錄 1.背景2.簡介3.安裝4.啟動總結參考文獻 1.背景 回顧下maven的構建流程&#xff0c;如果沒有私服&#xff0c;我們所需的所有jar包都需要通過maven的中央倉庫或者第三方的maven倉庫下載到本地&#xff0c;當一個公司或者一個團隊所有人都重復的從maven倉庫下載jar包&#…

EF Core 數據庫遷移命令參考

在使用 Entity Framework Core 時&#xff0c;若你希望通過 Package Manager Console (PMC) 執行遷移相關命令&#xff0c;以下是常用的 EF Core 遷移命令&#xff1a; PMC 方式 ? 常用 EF Core PMC 命令&#xff08;適用于遷移&#xff09; 操作PMC 命令添加遷移Add-Migra…

商業 |阿里云又丟出了核彈

行業翹首以盼的DeepSeek-R2沒等到&#xff0c;阿里云卻先一步丟出了核彈。 4月29日凌晨&#xff0c;阿里云正式上線了Qwen3系列模型“全家桶”&#xff0c;包含2個MoE模型、6個稠密模型。 八個模型&#xff0c;小到0.6B大到235B&#xff0c;既能在手機使用&#xff0c;也有旗…

《Python星球日記》 第66天:序列建模與語言模型

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、傳統語言模型1. n-gram 模型基礎2. n-gram 模型的局限性二、RNN 在語言建模中的應用1. 語言模型的基本原理2. RNN 構建語言模型的優勢3. 實…

20250510解決NanoPi NEO core開發板在Ubuntu core22.04.3系統下適配移遠的4G模塊EC200A-CN的問題

1、h3-eflasher-friendlycore-jammy-4.14-armhf-20250402.img.gz 在WIN10下使用7-ZIP解壓縮/ubuntu20.04下使用tar 2、Win32DiskImager.exe 寫如32GB的TF卡。【以管理員身份運行】 3、TF卡如果已經做過會有3個磁盤分區&#xff0c;可以使用SD Card Formatter/SDCardFormatterv5…

C# 的異步任務中, 如何暫停, 繼續,停止任務

namespace taskTest {using System;using System.Threading;using System.Threading.Tasks;public class MyService{private Task? workTask;private readonly SemaphoreSlim semaphore new SemaphoreSlim(0, 1); // 初始為 0&#xff0c;Start() 啟動時手動放行private read…

關于nextjs中next-sitemap插件生成文件樣式丟失問題及自定義樣式處理

現象沒有默認樣式 修改后 代碼配置如下 next-sitemap.config.js如下 // const { routing } require(./src/i18n/routing) ;const { flatten } require(lodash) const fs require(fs); const path require(path);// 改為硬編碼locales值&#xff0c;與routing.ts保持一…

圖片的require問題

問題 <template><!--第一種方式--><img :src"require(/assets/${imageName})" style"width:100px;" /><!--第二種方式--><img :src"require(imageUrl)" style"width:100px;" /> </template><…

【官方題解】StarryCoding 入門教育賽 2 | acm | 藍橋杯 | 新手入門

比賽傳送門&#xff1a; 本場比賽開始時題面存在一些問題&#xff0c;私密馬賽&#xff01; A.池化【入門教育賽】 根據題目所給公式計算即可。 #include "bits/stdc.h"signed main() {int t; std::cin >> t;while (t --) {int l, k, s, p; std::cin >&…

課題推薦——低成本地磁導航入門,附公式推導和MATLAB例程運行演示

地磁導航利用地球磁場的自然特性&#xff0c;通過感知磁場變化&#xff0c;幫助機器人或無人設備實現定位和導航。相比于 GPS、激光雷達等導航方法&#xff0c;地磁導航具有以下優勢&#xff1a; 低成本&#xff1a;使用地磁傳感器&#xff08;如電子羅盤&#xff09;&#xff…

【人工智能】自然語言編程革命:騰訊云CodeBuddy實戰5步搭建客戶管理系統,效率飆升90%

CodeBuddy 導讀一、產品介紹1.1 **什么是騰訊云代碼助手&#xff1f;**1.2 插件安裝1.2.1 IDE版本要求1.2.2 注意事項1.2.4 插件安裝1.2.4.1 環境安裝1.2.4.2 安裝騰訊云AI代碼助手** 1.2.5 功能介紹1.2.5.1 Craft&#xff08;智能代碼生成&#xff09;1.2.5.2 Chat&#xff08…

游戲引擎學習第270天:生成可行走的點

回顧并為今天的內容定下基調 今天的計劃雖然還不完全確定&#xff0c;可能會做一些內存分析&#xff0c;也有可能暫時不做&#xff0c;因為目前并沒有特別迫切的需求。最終我們會根據當下的狀態隨性決定&#xff0c;重點是持續推動項目的進展&#xff0c;無論是 memory 方面還…

Java反射詳細介紹

的反射&#xff08;Reflection&#xff09;是一種強大的機制&#xff0c;允許程序在運行時動態獲取類的信息、操作類的成員&#xff08;屬性、方法、構造器&#xff09;&#xff0c;甚至修改類的行為。它是框架開發&#xff08;如 Spring、MyBatis&#xff09;、單元測試工具&a…

c語言第一個小游戲:貪吃蛇小游戲05

貪吃蛇脫韁自動向右走&#xff1a;脫韁的野蛇 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake *head; struct snake *tail; void initNcurse() { initscr(); keypad(stdscr,1); } int …

react-diff-viewer 如何實現語法高亮

前言 react-diff-viewer 是一個很好的 diff 展示庫&#xff0c;但是也有一些坑點和不完善的地方&#xff0c;本文旨在描述如何在這個庫中實現自定義語法高亮。 Syntax highlighting is a bit tricky when combined with diff. Here, React Diff Viewer provides a simple rend…

coco數據集mAP評估

0 coco數據集劃分說明 1 用yolo自帶的評估 from ultralytics import YOLOmodel YOLO("../spatial-perception/checkpoints/yolo11n.pt")metrics model.val(data"./coco.yaml", save_jsonTrue) ## save_json為True,可以把預測結果存成json文件&#xff…

sensitive-word-admin v2.0.0 全新 ui 版本發布!vue+前后端分離

前言 sensitive-word-admin 最初的定位是讓大家知道如何使用 sensitive-word&#xff0c;所以開始想做個簡單的例子。 不過秉持著把一個工具做好的原則&#xff0c;也收到很多小伙伴的建議。 v2.0.0 在 ruoyi-vue&#xff08;也非常感謝若依作者多年來的無私奉獻&#xff09…

好消息!PyCharm 社區版現已支持直接選擇 WSL 終端為默認終端

在過去&#xff0c;PyCharm 社區版雖然提供了鏈接 Windows 子系統 Linux&#xff08;WSL&#xff09;終端的能力&#xff0c;但用戶無法在設置中直接指定 WSL 為默認終端&#xff0c;這一功能僅限于專業版使用者。 而現在&#xff0c;在 PyCharm 2025.1.1 版本中&#xff0c;Je…

【Redis】string 字符串

文章目錄 string 字符串常用命令設置和獲取setgetmget & mset 計數操作incr & incrbydecr & decrbyincrbyfloat 字符串操作appendstrlengetrangesetrange 應用場景 string 字符串 關于 Redis 的字符串&#xff0c;有幾點需要注意 Redis 所有的 key 的類型都是字符…

本地部署firecrawl的兩種方式,自托管和源碼部署

網上資料很多 AI爬蟲黑科技 firecrawl本地部署-CSDN博客 源碼部署 前提條件本地安裝py&#xff0c;node.js環境,嫌棄麻煩直接使用第二種 使用git或下載壓縮包 git clone https://github.com/mendableai/firecrawl.git 設置環境參數 cd /firecrawl/apps/api 復制環境參數 …