海外推廣有前途嗎無錫seo網(wǎng)絡(luò)推廣
在上節(jié)中,我們已經(jīng)詳細(xì)介紹了WISDM數(shù)據(jù)集及如何使用CNN網(wǎng)絡(luò)訓(xùn)練,得到了六個維度的模型仿真指標(biāo)及五個維度的可視化分析,那么現(xiàn)在我們將訓(xùn)練模型推廣到其他網(wǎng)路結(jié)構(gòu)中去,通過仿真實驗來對比一下不同網(wǎng)絡(luò)之間對于WISDM數(shù)據(jù)集的訓(xùn)練效果。
一、四種網(wǎng)絡(luò)的結(jié)構(gòu)及介紹
1.ResNet
殘差網(wǎng)絡(luò)是一種深度學(xué)習(xí)模型,通過引入“殘差學(xué)習(xí)”的概念來解決深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練困難的問題。
ResNet沿用了VGG完整的3 × 3卷積層設(shè)計。殘差塊里首先有2個有相同輸出通道數(shù)的3 × 3卷積層。 每個卷積層后接一個批量規(guī)范化層和ReLU激活函數(shù)。 然后我們通過跨層數(shù)據(jù)通路,跳過這2個卷積運算,將輸入直接加在最后的ReLU激活函數(shù)前。
核心思想:
· 殘差塊(Residual Block) :輸入通過一個或多個卷積層后,與輸入相加,形成殘差。這樣做可以使得網(wǎng)絡(luò)學(xué)習(xí)到的是輸入和輸出之間的殘差,而不是直接學(xué)習(xí)輸出,從而緩解了梯度消失問題,使得網(wǎng)絡(luò)可以成功訓(xùn)練更深的模型。
優(yōu)點:
· 通過殘差學(xué)習(xí),可以有效地訓(xùn)練更深的網(wǎng)絡(luò),提高了模型的性能。
· 網(wǎng)絡(luò)結(jié)構(gòu)易于拓展,可以構(gòu)建更復(fù)雜的模型。
缺點:
· 雖然緩解了梯度消失問題,但在某些情況下仍然可能遇到梯度爆炸的問題。
· 模型參數(shù)較多,需要較大的數(shù)據(jù)集進(jìn)行訓(xùn)練。
網(wǎng)絡(luò)結(jié)構(gòu):
ResNet((layer1): Sequential((0): Block((block): Sequential((0): Conv2d(1, 64, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU()(3): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1))(4): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True))(short): Sequential((0): Conv2d(1, 64, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True))
2.長短期記憶網(wǎng)絡(luò)(LSTM)
長短期記憶網(wǎng)絡(luò)是一種特殊的循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN),它能夠?qū)W習(xí)長期依賴信息。LSTM內(nèi)部邏輯結(jié)構(gòu):
核心思想:
· 門控機(jī)制(Gating Mechanism) :LSTM通過引入輸入門、遺忘門和輸出門來控制信息的流動,解決了傳統(tǒng)RNN的短期記憶問題。
· 記憶單元(Memory Cell) :LSTM的核心是記憶單元,它可以添加或移除信息,從而實現(xiàn)長期記憶。
優(yōu)點:
· 能夠處理長期依賴問題,適用于時間序列數(shù)據(jù)。
· 通過門控機(jī)制,可以有效地避免梯度消失和梯度爆炸問題。
缺點:
· 參數(shù)數(shù)量較多,訓(xùn)練時間較長。
· 門控機(jī)制增加了模型的復(fù)雜度。
網(wǎng)絡(luò)結(jié)構(gòu):
LSTM(
(lstm): LSTM(3, 512, num_layers=2, batch_first=True)
(fc): Linear(in_features=512, out_features=6, bias=True)
)
3.ShuffleNet
ShuffleNet是一種高效的卷積神經(jīng)網(wǎng)絡(luò),它通過使用分組卷積和通道洗牌操作來減少計算量,同時保持了較高的準(zhǔn)確率。
核心思想:
· 分組卷積:將輸入通道分成多個組,每組獨立進(jìn)行卷積操作,然后合并結(jié)果。這樣可以減少計算量和參數(shù)數(shù)量。
· 通道洗牌:在分組卷積后,通過通道洗牌操作重新混合不同組的特征圖,以保持特征的多樣性。
優(yōu)點:
· 計算效率高,適用于資源受限的環(huán)境。
· 通過通道洗牌操作,可以在減少計算量的同時保持特征的多樣性。
缺點:
· 雖然減少了計算量,但在某些復(fù)雜任務(wù)上可能不如其他網(wǎng)絡(luò)結(jié)構(gòu)表現(xiàn)出色。
· 分組卷積可能會犧牲一定的模型性能。
網(wǎng)絡(luò)結(jié)構(gòu):
ShuffleNet((layer): Sequential((0): Conv2d(1, 1, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))(1): Conv2d(1, 64, kernel_size=(1, 1), stride=(1, 1))(2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(3): ReLU()(19): ChannelShuffleModule())(ada_pool): AdaptiveAvgPool2d(output_size=(1, 3))(fc): Linear(in_features=1536, out_features=6, bias=True))
4.CNN
這一種網(wǎng)絡(luò)在上一篇文章中介紹了,這里就不再過多的講解。
二、具體訓(xùn)練過程
1.Resnet
1.1 殘差塊(Block)
Block
類是一個殘差網(wǎng)絡(luò)的基本構(gòu)建塊,它包含兩個卷積層,分別后接批量歸一化(BatchNorm)和ReLU激活函數(shù)。- 第一個卷積層的卷積核大小為 (3, 1),步長為
(stride, 1)
,填充為(1, 0)
。 - 如果輸入和輸出的通道數(shù)不同,或者步長不為1,殘差塊會包含一個快捷連接(shortcut),它是一個1x1的卷積層,用于匹配通道數(shù)和步長。
class Block(nn.Module):def __init__(self, inchannel, outchannel, stride):super().__init__()self.block = nn.Sequential(nn.Conv2d(inchannel, outchannel, (3, 1), (stride, 1), (1, 0)),nn.BatchNorm2d(outchannel),nn.ReLU(),nn.Conv2d(outchannel, outchannel, 1, 1, 0),nn.BatchNorm2d(outchannel))self.short = nn.Sequential()if (inchannel != outchannel or stride != 1):self.short = nn.Sequential(nn.Conv2d(inchannel, outchannel, (3, 1), (stride, 1), (1, 0)),nn.BatchNorm2d(outchannel))
1.2 ResNet網(wǎng)絡(luò)
ResNet
類定義了整個網(wǎng)絡(luò)結(jié)構(gòu),它由四個殘差層(layer1
到layer4
)組成,每一層由多個殘差塊組成。- 每一層的輸出通道數(shù)分別是64, 128, 256, 和 512。每一層的第一個塊的步長為2,用于下采樣,其余塊的步長為1。
- 網(wǎng)絡(luò)的輸入假設(shè)具有形狀
[b, c, series, modal]
,其中b
是批次大小,c
是通道數(shù),series
是序列長度,modal
是模態(tài)數(shù)(例如,圖像的高度)。 - 網(wǎng)絡(luò)最后使用一個自適應(yīng)平均池化層(
AdaptiveAvgPool2d
)將特征圖的大小調(diào)整為(1, train_shape[-1])
,然后通過一個全連接層(fc
)輸出類別預(yù)測。
class ResNet(nn.Module):def __init__(self, train_shape, category):super().__init__()self.layer1 = self.make_layers(1, 64, 2, 1)self.layer2 = self.make_layers(64, 128, 2, 1)self.layer3 = self.make_layers(128, 256, 2, 1)self.layer4 = self.make_layers(256, 512, 2, 1)self.ada_pool = nn.AdaptiveAvgPool2d((1, train_shape[-1]))self.fc = nn.Linear(512*train_shape[-1], category)
1.3 輔助方法
make_layers
方法用于創(chuàng)建每個殘差層中的多個殘差塊。它接受輸入通道數(shù)、輸出通道數(shù)、步長和塊的數(shù)量作為參數(shù),并返回一個由這些塊組成的序列。
def make_layers(self, inchannel, outchannel, stride, blocks):layer = [Block(inchannel, outchannel, stride)]for i in range(1, blocks):layer.append(Block(outchannel, outchannel, 1))return nn.Sequential(*layer)
1.4 前向傳播(Forward Pass)
- 在
forward
方法中,輸入數(shù)據(jù)x
會逐層通過殘差層,然后通過自適應(yīng)平均池化層和全連接層,最終輸出類別預(yù)測。
def forward(self, x):out = self.block(x) + self.short(x)return nn.ReLU()(out)
訓(xùn)練過程及結(jié)果
從訓(xùn)練得到的結(jié)果我們可以發(fā)現(xiàn)在準(zhǔn)確率(Accuracy)、精確率(Precision)、召回率(Recall)、F1分?jǐn)?shù)(F1-score)、參數(shù)量(Parameters)、推理時間(Inference Time) 六個維度上分別為:
2.LSTM
LSTM網(wǎng)絡(luò)特別適合于處理和預(yù)測時間序列數(shù)據(jù),因為它們可以捕捉長期依賴關(guān)系,在本次實驗中可以發(fā)揮出其特點,我們首先使用用LSTM層來處理序列數(shù)據(jù),然后使用全連接層來進(jìn)行分類預(yù)測。通過選取序列最后一個時間步的隱藏狀態(tài)來進(jìn)行分類,這是處理序列數(shù)據(jù)的一個常見做法,尤其是當(dāng)序列長度固定時。
2.1 LSTM類及網(wǎng)絡(luò)層
我們使用LSTM
類繼承自 nn.Module
,構(gòu)造函數(shù) __init__
接受兩個參數(shù):train_shape
和 category
。
train_shape
是訓(xùn)練數(shù)據(jù)的形狀,這里假設(shè)它是一個包含序列長度和模態(tài)數(shù)的列表或元組。category
是類別的數(shù)量,即網(wǎng)絡(luò)輸出的維度,用于分類任務(wù)。
class LSTM(nn.Module):def __init__(self, train_shape, category):super().__init__()self.lstm = nn.LSTM(train_shape[-1], 512, 2, batch_first=True)self.fc = nn.Linear(512, category)
其中self.lstm
是LSTM層,其參數(shù)如下:
train_shape[-1]
是輸入特征的維度,即模態(tài)數(shù)。512
是LSTM隱藏層的維度。2
表示堆疊兩個LSTM層。batch_first=True
表示輸入和輸出的張量的第一個維度是批次大小(batch size)。
self.fc
是一個全連接層,它將LSTM層的輸出映射到類別空間。它的輸入維度是512(LSTM隱藏層的維度),輸出維度是 category
。
2.3前向傳播(Forward Pass)
forward
方法定義了數(shù)據(jù)通過網(wǎng)絡(luò)的正向傳播過程。輸入 x
的形狀假設(shè)為 [b, c, series, modal]
,其中 b
是批次大小,c
是通道數(shù)(在這里為1,因為 squeeze(1)
被調(diào)用)。
x.squeeze(1)
將通道數(shù)維度移除,使得 x
的形狀變?yōu)?[b, series, modal]
。self.lstm(x)
將數(shù)據(jù) x
通過LSTM層,輸出一個包含隱藏狀態(tài)和細(xì)胞狀態(tài)的元組。
def forward(self, x):x, _ = self.lstm(x.squeeze(1))x = x[:, -1, :]x = self.fc(x)return x
訓(xùn)練過程及結(jié)果
從訓(xùn)練得到的結(jié)果我們可以發(fā)現(xiàn)在準(zhǔn)確率(Accuracy)、精確率(Precision)、召回率(Recall)、F1分?jǐn)?shù)(F1-score)、參數(shù)量(Parameters)、推理時間(Inference Time) 六個維度上分別為:
3.ShuffleNet
ShuffleNet通過深度可分離卷積和通道混合技術(shù)減少了模型的參數(shù)量和計算量,同時保持了較好的性能。這種卷積首先使用 groups
參數(shù)將輸入通道分組,然后對每個組應(yīng)用一個輕量級的 (kernel_size, 1)
卷積,接著是一個 1x1
的卷積來組合這些輸出。在每個深度可分離卷積后面,緊跟著一個批量歸一化層、一個ReLU激活函數(shù)和一個通道混合模塊。
1. ChannelShuffleModule類
ChannelShuffleModule
是一個通道混合模塊,它接收一個張量作為輸入,并將其通道按照指定的組數(shù)進(jìn)行重組和混合。在構(gòu)造函數(shù)中,channels
是輸入張量的通道數(shù),groups
是要將通道分成的組數(shù)。
forward
方法首先將輸入張量重塑為 (batch, groups, channel_per_group, series, modal)
的形狀,然后通過 permute
重新排列這些組,最后再將其重塑回 (batch, channels, series, modal)
的形狀。
class ChannelShuffleModule(nn.Module):def __init__(self, channels, groups):super().__init__()'''channels: 張量通道數(shù)groups: 通道組數(shù)【將channels分為groups組去shuffle】'''assert channels % groups == 0self.channels = channelsself.groups = groupsself.channel_per_group = self.channels // self.groups
2. ShuffleNet類
ShuffleNet
類繼承自 nn.Module
,定義了ShuffleNet的主體結(jié)構(gòu)。
構(gòu)造函數(shù) __init__
接受 train_shape
(訓(xùn)練樣本的形狀)、category
(類別數(shù))和 kernel_size
(卷積核大小)作為參數(shù)。
self.layer
是一個由多個卷積層、批量歸一化層、ReLU激活函數(shù)和通道混合模塊組成的序列。這些層按照順序執(zhí)行,逐步增加網(wǎng)絡(luò)的深度并減少特征圖的尺寸。
class ShuffleNet(nn.Module):def __init__(self, train_shape, category, kernel_size=3):super(ShuffleNet, self).__init__()self.layer = nn.Sequential(nn.Conv2d(1, 1, (kernel_size, 1), (2, 1), (kernel_size // 2, 0), groups=1),nn.Conv2d(1, 64, 1, 1, 0),nn.BatchNorm2d(64),nn.ReLU(),ChannelShuffleModule(channels=64, groups=8),nn.Conv2d(64, 64, (kernel_size, 1), (2, 1), (kernel_size // 2, 0), groups=64),nn.Conv2d(64, 128, 1, 1, 0),nn.BatchNorm2d(128),nn.ReLU(),ChannelShuffleModule(channels=128, groups=8),nn.Conv2d(128, 128, (kernel_size, 1), (2, 1), (kernel_size // 2, 0), groups=128),nn.Conv2d(128, 256, 1, 1, 0),nn.BatchNorm2d(256),nn.ReLU(),ChannelShuffleModule(channels=256, groups=16),nn.Conv2d(256, 256, (kernel_size, 1), (2, 1), (kernel_size // 2, 0), groups=256),nn.Conv2d(256, 512, 1, 1, 0),nn.BatchNorm2d(512),nn.ReLU(),ChannelShuffleModule(channels=512, groups=16))self.ada_pool = nn.AdaptiveAvgPool2d((1, train_shape[-1]))self.fc = nn.Linear(512*train_shape[-1], category)
3. 前向傳播(Forward Pass)
forward
方法定義了數(shù)據(jù)通過網(wǎng)絡(luò)的正向傳播過程。- 輸入
x
的形狀假設(shè)為[b, c, series, modal]
,其中b
是批次大小,c
是通道數(shù),series
是序列長度,modal
是模態(tài)數(shù)。
首先,x
通過self.layer
中定義的多個卷積層和通道混合模塊。
然后,使用self.ada_pool
進(jìn)行自適應(yīng)平均池化,將特征圖的series
維度縮減到1
。
接著,通過view
方法將池化后的特征圖展平,并通過一個全連接層self.fc
進(jìn)行分類。
def forward(self, x):x = self.layer(x)x = self.ada_pool(x)x = x.view(x.size(0), -1)x = self.fc(x)return x
訓(xùn)練過程及結(jié)果
從訓(xùn)練得到的結(jié)果我們可以發(fā)現(xiàn)在準(zhǔn)確率(Accuracy)、精確率(Precision)、召回率(Recall)、F1分?jǐn)?shù)(F1-score)、參數(shù)量(Parameters)、推理時間(Inference Time) 六個維度上分別為:
4.Cnn
上篇文章中已經(jīng)具體分析,這里只給出結(jié)果:
三、結(jié)果分析
將得到的四組實驗數(shù)據(jù)寫入表格中,進(jìn)行橫向深入對比:
從模型參數(shù)量來看,LSTM>Resnet>CNN>Shufflenet。ResNet在性能和效率之間取得了很好的平衡;CNN在保持較高準(zhǔn)確率的同時,具有較小的模型尺寸和較快的推理速度;LSTM適合處理時間序列數(shù)據(jù),但計算成本較高;ShuffleNet則在資源受限的環(huán)境中表現(xiàn)出色,盡管其準(zhǔn)確率略低。
以下是我們對各個模型的關(guān)鍵指標(biāo)更詳細(xì)的對比:
-
準(zhǔn)確率 (Accuracy): 所有模型的準(zhǔn)確率都相當(dāng)高,其中ResNet最高,達(dá)到了97.47%。
-
精確率 (Precision): 精確率衡量的是預(yù)測為正類別中實際為正類別的比例。ResNet同樣在這項指標(biāo)上表現(xiàn)最佳,為97.50%。
-
召回率 (Recall): 召回率衡量的是所有實際為正類別中被正確預(yù)測為正類別的比例。ResNet的召回率也是最高的,為97.47%。
-
F1分?jǐn)?shù) (F1 Score): F1分?jǐn)?shù)是精確率和召回率的調(diào)和平均值,它在兩者之間取得平衡。ResNet的F1分?jǐn)?shù)最高,為97.48%。
-
參數(shù)量 (Parameter Count): 參數(shù)量反映了模型的復(fù)雜度。LSTM的參數(shù)量最大,為3,163,142,而Shufflenet的參數(shù)量最小,為185,994。
-
推理時間 (Inference Time): 推理時間是指模型進(jìn)行預(yù)測所需的時間。CNN的推理時間最短,為0.0008秒,而LSTM的推理時間最長,為0.0088秒。
如果對預(yù)測性能有極高的要求,ResNet可能是最佳選擇。如果對速度和模型大小有更高的要求,CNN或Shufflenet可能更合適。LSTM由于其參數(shù)量最大,可能適用于需要捕獲長期依賴關(guān)系的任務(wù),但需要更多的計算資源。
深入分析
模型結(jié)構(gòu)設(shè)計差異
- ResNet:其殘差連接允許網(wǎng)絡(luò)學(xué)習(xí)輸入的恒等變換以及更復(fù)雜的函數(shù)。這種設(shè)計使得網(wǎng)絡(luò)能夠通過增加層數(shù)來提高性能,而不會受到梯度消失的影響。此外,殘差連接有助于網(wǎng)絡(luò)在訓(xùn)練過程中保持特征的一致性,這可能是ResNet在多個評價指標(biāo)上表現(xiàn)優(yōu)異的原因之一。
- LSTM:LSTM的門控機(jī)制使其能夠?qū)W習(xí)長期依賴關(guān)系,這對于時間序列數(shù)據(jù)特別重要。然而,這種復(fù)雜的結(jié)構(gòu)也導(dǎo)致了更多的參數(shù)和更高的計算成本。在訓(xùn)練過程中,LSTM可能需要更多的數(shù)據(jù)和調(diào)整來優(yōu)化其門控單元的狀態(tài),這可能是其參數(shù)量較大和推理時間較長的原因之一。
- ShuffleNet:ShuffleNet的設(shè)計注重計算效率和模型大小。通過分組卷積和通道洗牌,ShuffleNet減少了計算量和參數(shù)數(shù)量,但這種設(shè)計可能犧牲了一些模型的表達(dá)能力,尤其是在處理復(fù)雜數(shù)據(jù)時。這可能是ShuffleNet在準(zhǔn)確率上略低于其他模型的原因之一。
- CNN:傳統(tǒng)的卷積神經(jīng)網(wǎng)絡(luò)通常具有較少的參數(shù)和較高的計算效率。它們在圖像識別任務(wù)中表現(xiàn)出色,但在處理時間序列數(shù)據(jù)或需要捕捉長期依賴關(guān)系的任務(wù)中可能不如LSTM有效。
模型結(jié)構(gòu)設(shè)計對訓(xùn)練和loss的影響
- ResNet:殘差連接允許網(wǎng)絡(luò)層之間直接的信息流動,這有助于緩解深層網(wǎng)絡(luò)中的梯度消失問題。這種設(shè)計使得ResNet在訓(xùn)練時對loss的梯度更加敏感,從而在優(yōu)化過程中能夠更快地收斂。
- LSTM:其門控機(jī)制能夠有效地捕捉長期依賴關(guān)系,但這也意味著在訓(xùn)練過程中需要更加細(xì)致地調(diào)整超參數(shù),以確保模型不會陷入局部最優(yōu)解。LSTM可能需要特定的loss函數(shù)來更好地利用其記憶單元,需要考慮序列中的不同時間步長對預(yù)測的貢獻(xiàn)。
- ShuffleNet:通過分組卷積和通道洗牌,ShuffleNet減少了模型的計算復(fù)雜度,但可能犧牲了某些特征的表達(dá)能力。在訓(xùn)練ShuffleNet時,需要更加關(guān)注loss函數(shù)的設(shè)計,以確保模型能夠在有限的參數(shù)下學(xué)習(xí)到有效的特征表示。
- CNN:標(biāo)準(zhǔn)的CNN結(jié)構(gòu)通常具有較好的空間特征提取能力,但在處理時間序列數(shù)據(jù)時可能不如LSTM有效。在設(shè)計loss函數(shù)時,需要考慮如何更好地利用CNN的空間特征提取能力,例如通過設(shè)計空間敏感的loss函數(shù)。
Loss設(shè)計對模型性能的影響
- 損失函數(shù)的選擇:對于不同的模型結(jié)構(gòu),需要設(shè)計不同的損失函數(shù)來更好地捕捉任務(wù)的關(guān)鍵特性。對于ShuffleNet,可能需要設(shè)計一個損失函數(shù),它不僅懲罰預(yù)測錯誤的程度,還鼓勵模型學(xué)習(xí)到更加分散的特征表示。
- 損失函數(shù)的權(quán)重分配:在多任務(wù)學(xué)習(xí)中,不同任務(wù)的loss可能需要不同的權(quán)重。在訓(xùn)練LSTM進(jìn)行序列預(yù)測時,可能需要為預(yù)測序列的早期和晚期分配不同的權(quán)重,以確保模型能夠平衡短期和長期預(yù)測的準(zhǔn)確性。
- 自定義損失函數(shù):在某些特定任務(wù)中,可能需要設(shè)計自定義的損失函數(shù)來更好地適應(yīng)模型的特性。對于CNN,需要設(shè)計一個損失函數(shù),它能夠鼓勵模型學(xué)習(xí)到更加魯棒的特征表示,以應(yīng)對圖像數(shù)據(jù)中的噪聲和變化。
注意:具體的代碼實現(xiàn)和模型細(xì)節(jié)可以聯(lián)系作者獲取,以便進(jìn)一步的研究和應(yīng)用。本文首發(fā)于稀土掘金,未經(jīng)允許禁止轉(zhuǎn)發(fā)和二次創(chuàng)作,侵權(quán)必究。