主頁 >  其他 > 經典卷積神經網路模型

經典卷積神經網路模型

2022-02-27 11:12:31 其他

在這里插入圖片描述

本文回顧了經典的CNN結構,并附上相應的pytorch代碼,融合了部分Ng、沐神講解的內容(主要是ResNet),主要是寫一下反思,幫助理解CNN的一些核心思想,

PPT來自:計算機視覺與深度學習 北京郵電大學 魯鵬

代碼來自沐神《動手學深度學習》,

文章目錄

    • 卷積概述
      • 卷積特征圖
      • 池化層
    • AlexNet(2012)
      • 貢獻
      • 結構
        • 呆碼
        • *重要規律
      • 反思:卷積層到底在做什么?
    • ZFNet(2013)
    • VGG(2014)
      • VGG-11的呆碼
      • 反思:小卷積核有什么優勢?
      • 反思:為什么經過一次Pooling, 卷積核個數要增加一倍?
    • GoogLeNet(2014)
      • Inception塊呆碼
      • 反思:關于1 * 1的卷積(NiN):
    • ResNet(2015)
      • Residual
      • 兩種ResNet塊
      • 反思:為什么ResNet可以訓練到1000層?
        • 從反向傳播理解
        • 集成模型(核心理解)
      • ResNet18呆碼
        • ResNet18結構圖
    • Summary

卷積概述

ReLU接在卷積層后面,對卷積的結果進行處理(卷積得到的結果不都是正數)!

卷積層堆疊:后面的conv可以在前面conv的基礎上繼續提取特征

Pooling: 不改變深度資訊,只減小空間尺寸,之后卷積需要計算的空間位置就減少了,【一般每pooling一次,下降一倍】

雖然卷積核的大小不變,但是越靠后,感受野“相對越大”,相當于從一個更大的尺度上觀察影像【前面細粒度,后面粗粒度】,

卷積特征圖

在這里插入圖片描述

卷積核的個數決定了這一層輸出的特征圖的個數,也是下一層卷積核的深度

池化層

在這里插入圖片描述

AlexNet(2012)

貢獻

在這里插入圖片描述

動量:使得震蕩方向減小,運動比較慢的方向加強,更快的通過平坦的區域,

結構

在這里插入圖片描述

注:

1、這個Norm現在已經不用了,并不是BN

2、說“網路層數”,我們只算Conv層和FC層

3、算引數的時候“+1”是bias.

4、輸入227 * 227 * 3的影像之前,進行了去均值處理【統計所有訓練樣本每個位置像素的均值,也是一個227 * 227 * 3的,然后對于每一個影像,減去這個均值向量】

作用?——

在進行分類的時候,”絕對值“是無意義的,我們只需要比較”相對值“,去均值之后,保留了相對值,還可以使得資料減小,

在這里插入圖片描述

這里使用的池化是重疊池化(但是在之后的網路中,一般還是使用不重疊的池化),

池化不學習引數

在這里插入圖片描述

Norm的作用:將差距拉大,“助紂為虐,落井下石”,從VGG開始就去掉了,

在這里插入圖片描述

呆碼

以28 * 28 * 1的圖片為例,pytorch代碼:

# 這里由于是MINST資料集,所以輸入的通道是1; 如果是ImageNet資料集,就應該是3了
net = nn.Sequential(
    nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),
    nn.MaxPool2d(kernel_size=3, stride=2),
    nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),
    nn.MaxPool2d(kernel_size=3, stride=2),
    nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
    nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
    nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
    nn.MaxPool2d(kernel_size=3, stride=2), nn.Flatten(),
    nn.Linear(256 * 5 * 5, 4096), nn.ReLU(), nn.Dropout(p=0.5),
    nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(p=0.5),
    nn.Linear(4096, 10)
)

*重要規律

驗證集損失不下降時,可以手動降低10倍學習率

反思:卷積層到底在做什么?

在這里插入圖片描述

256是256種特征回應模板,亮代表此處切合度高

ZFNet(2013)

在這里插入圖片描述

1、將第一個卷積改成7 * 7,這樣方便感受更細粒度的內容;

2、步長設定成2,不讓解析度降低的太快,而是一點點降低;

3、之所以只增加后面層卷積核的個數:認為 “基元” 的內容是很少的(影像的底層特征),我們不需要很多的卷積核;但是他們之間組合出來的特征卻很多,越到后面,卷積核包含的語意資訊就越多,增加卷積核的個數,可以理解更多的語意資訊

VGG(2014)

在這里插入圖片描述

串聯小卷積核可以獲得更大的感受野,而不非用大卷積核,串聯小卷積核經過了多次變換,非線性性更強

VGG處理歸一化和AlexNet不同,VGG統計所有圖片R, G, B的均值,然后將【R, G, B】作為均值

之前是,若干圖片同一位置的像素的R、G、B求均值,現在是若干圖片所有像素的R、G、B求均值,

在這里插入圖片描述

前層卷積核的個數少,后層卷積核的個數多,前層學習的是 “基元”資訊,后期學習的 “語意”資訊多,【與ZFNet類似】

但是并不越多越好,因為后面要接一個FC,如果太大,展開成向量輸入FC的話,會非常大,

VGG-11的呆碼

與VGG-16相比,每一個卷積塊都少一個卷積層,

# 超引數:需要的卷積層的個數、輸入輸出的channel數
def vgg_block(num_convs, in_channels, out_channels): 
    layers = []
    for i in range(num_convs):
        layers.append(nn.Conv2d(
            in_channels, out_channels, kernel_size=3, padding=1))
        layers.append(nn.ReLU())
        in_channels = out_channels
    layers.append(nn.MaxPool2d(kernel_size=2, stride=2))   
    return nn.Sequential(*layers)
    
conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))
def vgg(conv_arch):
    conv_blks = []
    in_channels = 1
    for (num_convs, out_channels) in conv_arch:
        conv_blks.append(vgg_block(
            num_convs, in_channels, out_channels))
        in_channels = out_channels
    
    return nn.Sequential(
        *conv_blks, nn.Flatten(),
        nn.Linear(out_channels * 7 * 7, 4096), nn.ReLU(), nn.Dropout(0.5),
        nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(0.5),
        nn.Linear(4096, 10)
    )

反思:小卷積核有什么優勢?

在這里插入圖片描述

兩個3 * 3的小卷積核串聯,其實就等效于一個5 * 5的卷積核,他們的感受野是一樣的

但是,串聯多經過了一次變換,非線性能力更強【感性理解:組合出來之后,會更復雜,得到更復雜的資訊】,

此外,引數也更少

反思:為什么經過一次Pooling, 卷積核個數要增加一倍?

在這里插入圖片描述

“動態平衡”的思想,如果不Pooling,那顯存占用太大,

GoogLeNet(2014)

在這里插入圖片描述

核心改進:網路結構發生本質改變,引入Inception塊

在這里插入圖片描述

為什么不采用串聯結構了呢?

舉一個栗子,如果圖中有一條很寬的線,但是用小卷積核,只能把他提取成四條邊,這樣一個重要資訊就丟失了,

所以,這個錯誤是“疊加”的,前面丟失了資訊,后面無法挽回

【注:沐神在《動手學深度學習》中提供另外一種說法:“小學生才做選擇題,我全都要!”

既然不知道什么時候用3 * 3, 5 * 5,那我不如全都留下來,一起算,】

解決方案:保留前面層更多的資訊,

在這里插入圖片描述

兵分四路,1 * 1的卷積對于通道做融合(相當于全連接);3 * 3的卷積感受細粒度的資訊,提取3 * 3區域資訊; 5 * 5的卷積感受相對粗粒度的資訊,提取5 * 5區域資訊;MaxPooling對強資訊做擴張【理解:如果有一個極大值像素,那么所有卷積操作包含它的部分都會變成這個值】,最后將所有的層concat(在深度方向拼接)起來,這四個層都不改變H * W的大小

但是問題在于,如果直接這樣做,會很慢,所以在前面先用NiN(Network in Netwok),不改變寬高,但是改變通道數(深度).所以第2,3路的1 * 1塊與1,4路的1 * 1塊功能不同,1,4路的是融合資訊,對深度進行壓縮,2,3路是主要減少計算量(當然也會融合資訊),

在這里插入圖片描述

最后也砍掉了2個FC,大大減少了引數個數,取而代之的是一個AvgPooling,每個特征圖用一個最大值代替,【之前是每一個特征圖展開成一個長向量,現在是每個特征圖只保留一個值

在這里插入圖片描述

此外,GoogLeNet中還有兩個輔助分類器,因為網路太深,所以使用輔助分類器讓前面也能有梯度回傳(PPT中的兩條紅線)從而解決梯度消失問題,

ReLU雖然也可以一定程度解決梯度消失,但是并不能完全解決深層網路難以訓練的問題,加上輔助分類器之后,前面的層更好訓練,前面層學到的特征也能讓網路更快的收斂

在這里插入圖片描述

Inception塊呆碼

class Inception(nn.Module):
    # c1--c4是每條路徑的輸出通道數
    def __init__(self, in_channels, c1, c2, c3, c4, **kwargs):
        super(Inception, self).__init__(**kwargs)
        # 線路1,單1x1卷積層
        self.p1_1 = nn.Conv2d(in_channels, c1, kernel_size=1)
        # 線路2,1x1卷積層后接3x3卷積層
        self.p2_1 = nn.Conv2d(in_channels, c2[0], kernel_size=1)
        self.p2_2 = nn.Conv2d(c2[0], c2[1], kernel_size=3, padding=1)
        # 線路3,1x1卷積層后接5x5卷積層
        self.p3_1 = nn.Conv2d(in_channels, c3[0], kernel_size=1)
        self.p3_2 = nn.Conv2d(c3[0], c3[1], kernel_size=5, padding=2)
        # 線路4,3x3最大匯聚層后接1x1卷積層
        self.p4_1 = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
        self.p4_2 = nn.Conv2d(in_channels, c4, kernel_size=1)

    def forward(self, x):
        p1 = F.relu(self.p1_1(x))
        p2 = F.relu(self.p2_2(F.relu(self.p2_1(x))))
        p3 = F.relu(self.p3_2(F.relu(self.p3_1(x))))
        p4 = F.relu(self.p4_2(self.p4_1(x)))
        # 在通道維度上連結輸出
        return torch.cat((p1, p2, p3, p4), dim=1)

反思:關于1 * 1的卷積(NiN):

在這里插入圖片描述

對于卷積層,可以理解為每一個像素有多個通道,如果通道數是100,可以理解為一個像素有一個長為100的向量,可以認為這個向量是這個像素的特征,那么可以理解為,每一個像素就是一個樣本,共有批量大小 * 高 * 寬個樣本,故,可以把通道層當做卷積層的特征維度,【這也是1 * 1的卷積相當于全連接的解釋】,

NiN會導致資訊的損失嗎?

在這里插入圖片描述

理論上壓碩訓損失,但損失的是“不存在”的特征,所以實際上未太損失,

以上圖為例,m * n * 64的特征圖,每一個卷積核都是描述一種結構【這個向量描述的是某個點A被64個卷積核卷積的結果】,但是影像在同一個位置只會有1種結構(或再多一點點,2-3種,但是不會很多),不可能卷積核描述的特征在原影像同一個位置都有,所以描述影像上A位置的這個向量(64維)是一個很稀疏的向量,壓縮之后,會把很多的0壓縮掉,所以不會丟失資訊,

ResNet(2015)

發現問題——網路并不是越深越好

在這里插入圖片描述

在這里插入圖片描述

Residual

大名鼎鼎的殘差塊,幾乎成為之后深層網路的必備了(如Transformer中的Add&Norm層),

可以用下面的圖理解殘差塊,【這主要是從正向傳播的角度理解的】
在這里插入圖片描述

原圖 + 邊緣圖 = 銳化后的圖,在保證了原圖資訊的同時,把細節進行了強化,那我們可以這樣理解:輸入的X就是原圖,特征提取之后輸出的F(X)就是這個邊緣細節圖,他們和在一起的H(X)就是最后的輸出,【卷積在這里可以理解為那個邊緣提取器,】當然,銳化的增強是“人的視覺效果”最關心的資訊,在ResNet中增強的可不一定是人視覺上感興趣的資訊,有可能是對分類比較有興趣的資訊,這里只是拿銳化來對比理解下,

之前的網路,要學習的直接就是H(x),但是現在要學習的是F(X) = H(x) - X, 這也就是“殘差”的思想,即輸出和輸入的差異

在這里插入圖片描述

這里第一次使用1 * 1的卷積,依然是為了降低通道數【減少運算量】; 而第二次使用1 * 1的卷積,是為了增加通道數【不升回去沒法相加】,所謂 “瓶頸”就是深度先減小再增大

在這里插入圖片描述

兩種ResNet塊

只看上圖會發現一個問題:維度對不上!因為Residual結構的存在,所以輸入輸出的維度應該完全不變才對(和X一致),

這里魯鵬老師沒有講,其實是因為有兩種ResNet結構:高寬減半的resnet塊和高寬不變的resnet塊,【注:這里李沐老師講的和上面的resnet結構稍有不同,因為魯鵬老師講的是resnet152,沐神講的是resnet18,但是原理一樣】,具體細節可以看下面的代碼,

在這里插入圖片描述

反思:為什么ResNet可以訓練到1000層?

從反向傳播理解

之前網路一個很大的問題——深度太深之后,梯度會消失,前面的網路訓練不好,

如何避免梯度消失?-> 乘法變加法

梯度消失: 新加的層如果擬合能力很強(例如AlexNet的全連接層),那么高層的梯度會很快變得非常小【導數可以理解為:真實值和預測值之間的差別(可以去看softmax求導)】,如果梯度很小的話,只能增大學習率,但是增的太大,高層的學習率也大了,會使得訓練很不穩定(這里假設的是全域統一的學習率),

但是resnet:每一層都會把上一層的導數傳過來,于是不會太小,貼近資料的W的梯度可以由上層直接經過高速公路傳下來,一開始下面的層也可以拿到比較大的梯度,才可以對很深的網路做訓練,

在這里插入圖片描述

結合吳恩達老師的再理解下,如果我們在此基礎上再使用L2正則化(權重衰退),會進一步壓縮W的值,

如果W學到了0,那么a[l + 2]就會學習到a[l](因為是relu函式,a[l]肯定是大于0的),這就實作了恒等式的傳遞,

在這里插入圖片描述

也就是說,當網路足夠深的時候,開始起反作用的時候,這個模塊可以保證你網路性能不變(盡管加了兩層),這里是假設很深的時候梯度消失了,此時這個網路可以退回到梯度消失之前,但是plain NN 是做不到這樣的,隨著深度的加深,會學的更爛,

吳恩達老師提出觀點,residual有用的原因就是:他學習恒等函式很容易

在這里插入圖片描述

集成模型(核心理解)

殘差可以看成很多子網路的求和,

在這里插入圖片描述

Ensemble當然效果好鴨,

研究人員發現,隨便蓋住ResNet中的某幾層,效果依然很好,但是如果對VGG這么干,就GG了,后面提出的DenseNet也是對ResNet的優化,他發現Ensemble的壞處在于,“投票“雖然好,但是有很多冗余資訊,這里就不在深究了,

ResNet18呆碼

注意resnet的“加法“是直接數值相加【見下面Y += X】,而不是像GoogLeNet那樣做通道堆積合并,

class Residual(nn.Module): # use_1x1conv:要不要使用1x1的卷積
    def __init__(self, input_channels, num_channels, use_1x1conv=False, strides=1):
        super().__init__()
        self.conv1 = nn.Conv2d(input_channels, num_channels, kernel_size=3, padding=1, stride=strides)
        self.conv2 = nn.Conv2d(num_channels, num_channels, kernel_size=3, padding=1) # 這里輸入通道數=輸出通道數,這是左邊的第二個3x3
        if use_1x1conv:
            self.conv3 = nn.Conv2d(input_channels, num_channels, kernel_size=1, stride=strides)
        else:
            self.conv3 = None
        self.bn1 = nn.BatchNorm2d(num_channels)
        self.bn2 = nn.BatchNorm2d(num_channels)
        self.relu = nn.ReLU(implace=True)
        
    def forward(self, X):
        Y = F.relu(self.bn1(self.conv1(X)))
        Y = self.bn2(self.conv2(Y))
        if self.conv3:
            X = self.conv3(X)
        Y += X #!!!!!
        return F.relu(Y)

使用兩種不同的resnet塊:

blk = Residual(3, 3)
X = torch.rand(4, 3, 6, 6)
Y = blk(X)
Y.shape
torch.Size([4, 3, 6, 6])

增加輸出通道的同時,高寬減半,

blk = Residual(3, 6, use_1x1conv=True, strides=2)
Y = blk(X)
Y.shape
torch.Size([4, 6, 3, 3])

下面是RetNet18網路的實作:

b1 = nn.Sequential(nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3),
                   nn.BatchNorm2d(64), nn.ReLU(),
                   nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

ResNet則使用4個由殘差塊組成的模塊,每個模塊使用若干個同樣輸出通道數的殘差塊, 第一個模塊的通道數同輸入通道數一致, 由于之前已經使用了步幅為2的最大匯聚層,所以無須減小高和寬, 之后的每個模塊在第一個殘差塊里將上一個模塊的通道數翻倍,并將高和寬減半,

# 一個stage要多少個residual小塊,是不是第一個stage
def residual_block(input_channels, num_channels, num_residuals, first_block=False):
    blk = []
    for i in range(num_residuals): # 只在第一個stage(b2)才減半,其余的都不減半
        if i == 0 and not first_block:
            blk.append(Residual(input_channels, num_channels, use_1x1conv=True, strides=2))
        else:
            blk.append(Residual(num_channels, num_channels))
    return blk
    
b2 = nn.Sequential(*residual_block(64, 64, 2, True))
b3 = nn.Sequential(*residual_block(64, 128, 2))
b4 = nn.Sequential(*residual_block(128, 256, 2))
b5 = nn.Sequential(*residual_block(256, 512, 2))

net = nn.Sequential(b1, b2, b3, b4, b5, nn.AdaptiveAvgPool2d((1, 1)),
                   nn.Flatten(), nn.Linear(512, 10))

X = torch.rand(size=(1, 1, 224, 224))
for layer in net:
    X = layer(X)
    print(layer.__class__.__name__,'output shape:\t', X.shape)

Sequential output shape:	 torch.Size([1, 64, 56, 56])
Sequential output shape:	 torch.Size([1, 64, 56, 56])
Sequential output shape:	 torch.Size([1, 128, 28, 28])
Sequential output shape:	 torch.Size([1, 256, 14, 14])
Sequential output shape:	 torch.Size([1, 512, 7, 7])
AdaptiveAvgPool2d output shape:	 torch.Size([1, 512, 1,  1]) # 用池化變成1 * 1
Flatten output shape:	 torch.Size([1, 512])
Linear output shape:	 torch.Size([1, 10])

ResNet18結構圖

在這里插入圖片描述

Summary

在這里插入圖片描述

一般要自己做任務的時候,建議使用resnet或InceptionV4.

當然最新的研究表明,swin transformer好像吊錘CNN?不過我不會,長大后在學習,
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/433322.html

標籤:AI

上一篇:測驗-3-測驗分類

下一篇:預訓練模型的加載機理pytorch版

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more