柚子快報激活碼778899分享:網(wǎng)絡(luò) 深度學(xué)習第三周學(xué)習總結(jié)
先自我介紹一下,小編浙江大學(xué)畢業(yè),去過華為、字節(jié)跳動等大廠,目前阿里P7
深知大多數(shù)程序員,想要提升技能,往往是自己摸索成長,但自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年最新Linux運維全套學(xué)習資料》,初衷也很簡單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友。
既有適合小白學(xué)習的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗的小伙伴深入學(xué)習提升的進階課程,涵蓋了95%以上運維知識點,真正體系化!
由于文件比較多,這里只是將部分目錄截圖出來,全套包含大廠面經(jīng)、學(xué)習筆記、源碼講義、實戰(zhàn)項目、大綱路線、講解視頻,并且后續(xù)會持續(xù)更新
如果你需要這些資料,可以添加V獲?。簐ip1024b (備注運維)
正文
1.2.3使用遷移學(xué)習訓(xùn)練網(wǎng)絡(luò)
二、ResNext網(wǎng)絡(luò)
1、ResNext改進之處
三、基于Lenet網(wǎng)絡(luò)結(jié)構(gòu)的貓狗圖像分類
1、Lenet網(wǎng)絡(luò)結(jié)構(gòu)
2、pytorch代碼實現(xiàn)
3.2.1數(shù)據(jù)集加載
3.2.2網(wǎng)絡(luò)結(jié)構(gòu)
3.2.3網(wǎng)絡(luò)訓(xùn)練
3.2.4測試并提交.csv文件
四、基于Resnet的貓狗大戰(zhàn)
五、思考題
一、ResNet
1、ResNet介紹
ResNet在2015年由微軟實驗室提出,斬獲當年ImageNet競賽中分類任務(wù)第一名,目標檢測第一名。
通過堆疊卷積層和池化層來增加網(wǎng)絡(luò)的深度,這樣的網(wǎng)絡(luò)性能是否就能相對淺層網(wǎng)絡(luò)更優(yōu)秀?在《Deep Residual Learning for Image Recognition》這篇論文中給出了答案。
上圖截取自原論文,可以看到。56層的網(wǎng)絡(luò)不管是訓(xùn)練誤差還是測試誤差都要高于20層的網(wǎng)絡(luò) 。論文作者給出了兩種解釋:一是梯度消失或梯度爆炸。隨著網(wǎng)絡(luò)層數(shù)的加深,假設(shè)層與層之間的誤差梯度小于(大于)1,那在反向傳播的過程中,梯度會越來越?。ù螅?,這就導(dǎo)致了梯度消失(爆炸)從而降低了網(wǎng)絡(luò)的性能??梢酝ㄟ^數(shù)據(jù)標準化處理、權(quán)重初始化、batch normalization解決。batch normalization將一批數(shù)據(jù)(一個batch)的每一個通道標準化為均值為0,方差為一的分布。詳見博文。二是退化問題,在解決了第一個問題后,仍然無法完全解決上述問題,作者便提出了一個殘差結(jié)構(gòu)來解決遞歸問題。下圖是兩種殘差結(jié)構(gòu),其中左邊的殘差結(jié)構(gòu)主要用于層數(shù)較淺的網(wǎng)絡(luò),而右邊的殘差結(jié)構(gòu)則主要用于層數(shù)較深的網(wǎng)絡(luò)。
可以看到殘差結(jié)構(gòu)將輸入與輸出進行了相加,這就要求輸入與輸出具有相同的shape。經(jīng)計算可得右邊的殘差結(jié)構(gòu)的參數(shù)小于左邊。?這也使得它可以應(yīng)用到更深的網(wǎng)絡(luò)中。
論文共給出了18層、34層、50層、101層、152層五個層數(shù)網(wǎng)絡(luò)的結(jié)構(gòu)
34層網(wǎng)絡(luò)的詳細結(jié)構(gòu)如下。
標注實線的殘差結(jié)構(gòu)的輸入與輸出的shape完全一樣可以直接相加。而標注虛線的殘差結(jié)構(gòu)輸入與輸出shape不同。需要通過卷積核的個數(shù)進行特征降維或升維、設(shè)置特定卷積核的大小、步長來改變特征圖的高和寬。
2、用Pytorch搭建Resnet
1.2.1兩種殘差塊:
在18層和34層的網(wǎng)絡(luò)中,每個殘差塊的輸入通道數(shù)與輸出通道數(shù)相同,而在剩下三個層數(shù)的網(wǎng)絡(luò)中,每個殘差塊的輸出通道數(shù)是輸入通道數(shù)的四倍。兩種殘差塊的定義如下,通過expansion調(diào)整輸出通道數(shù)。
class BasicBlock(nn.Module):
expansion = 1
def __init__(self, in_channel, out_channel, stride=1, downsample=None, **kwargs):
super(BasicBlock, self).__init__()
self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=out_channel,
kernel_size=3, stride=stride, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(out_channel)
self.relu = nn.ReLU()
self.conv2 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel,
kernel_size=3, stride=1, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(out_channel)
self.downsample = downsample
def forward(self, x):
identity = x
if self.downsample is not None:
identity = self.downsample(x)
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
out += identity
out = self.relu(out)
return out
class Bottleneck(nn.Module):
expansion = 4
def __init__(self, in_channel, out_channel, stride=1, downsample=None):
super(Bottleneck, self).__init__()
self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=outchannel,
kernel_size=1, stride=1, bias=False) # squeeze channels
self.bn1 = nn.BatchNorm2d(width)
# -----------------------------------------
self.conv2 = nn.Conv2d(in_channels=outchannel, out_channels=outchannel
kernel_size=3, stride=stride, bias=False, padding=1)
self.bn2 = nn.BatchNorm2d(outchannel)
# -----------------------------------------
self.conv3 = nn.Conv2d(in_channels=outchannel, out_channels=out_channel*self.expansion,
kernel_size=1, stride=1, bias=False) # unsqueeze channels
self.bn3 = nn.BatchNorm2d(out_channel*self.expansion)
self.relu = nn.ReLU(inplace=True)
self.downsample = downsample
def forward(self, x):
identity = x
if self.downsample is not None:
identity = self.downsample(x)
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
out = self.relu(out)
out = self.conv3(out)
out = self.bn3(out)
out += identity
out = self.relu(out)
return out
1.2.2搭建網(wǎng)絡(luò)
原始圖像的通道數(shù)為3,經(jīng)過卷積,batch normalization,relu、最大值池化后作為Conv2.x的輸入。layer1、layer2、layer3、layer4分別對應(yīng)Conv2.x,Conv3.x,Conv4.x,Conv5.x._make_layer函數(shù)中,第一個參數(shù)是上面兩個block中的一個,在18層和34層的網(wǎng)絡(luò)中為basicblock,而在其余三個網(wǎng)絡(luò)中則為Bottleneck。第二個參數(shù)是Conv2.x,Conv3.x,Conv4.x,Conv5.x第一個殘差塊第一個卷積層中卷積核的個數(shù),第三個參數(shù)是Conv2.x,Conv3.x,Conv4.x,Conv5.x殘差塊的個數(shù),分別為3,4,6,3。以50層網(wǎng)絡(luò)為例,在搭建layer1即(Conv2.x)時,由于expansion=4,故執(zhí)行if語句下的命令,定義了一個downsample函數(shù),它實現(xiàn)了將輸入的通道數(shù)增加為與輸出通道數(shù)相同,從而可以進行矩陣相加操作,這是layer1的三個殘差組中的第一個,將它壓入layers列表中,之后將剩余兩個殘差組壓入列表,它們不再需要改變通道數(shù)。然后搭建layer2(即Conv3.x),layer3和layer4。他們中的某些組或許需要改變特征圖的高寬和通道數(shù)。
class ResNet(nn.Module):
def __init__(self,
block,
blocks_num,
num_classes=1000,
include_top=True):
super(ResNet, self).__init__()
self.include_top = include_top
self.in_channel = 64
self.conv1 = nn.Conv2d(3, self.in_channel, kernel_size=7, stride=2,
padding=3, bias=False)
self.bn1 = nn.BatchNorm2d(self.in_channel)
self.relu = nn.ReLU(inplace=True)
self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
self.layer1 = self._make_layer(block, 64, blocks_num[0])
self.layer2 = self._make_layer(block, 128, blocks_num[1], stride=2)
self.layer3 = self._make_layer(block, 256, blocks_num[2], stride=2)
self.layer4 = self._make_layer(block, 512, blocks_num[3], stride=2)
if self.include_top:
self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) # output size = (1, 1)
self.fc = nn.Linear(512 * block.expansion, num_classes)
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
def _make_layer(self, block, channel, block_num, stride=1):
downsample = None
if stride != 1 or self.in_channel != channel * block.expansion:
downsample = nn.Sequential(
nn.Conv2d(self.in_channel, channel * block.expansion, kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(channel * block.expansion))
layers = []
layers.append(block(self.in_channel,
channel,
downsample=downsample,
stride=stride))
self.in_channel = channel * block.expansion
for _ in range(1, block_num):
layers.append(block(self.in_channel,
channel))
return nn.Sequential(*layers)
def forward(self, x):
x = self.conv1(x)
x = self.bn1(x)
x = self.relu(x)
x = self.maxpool(x)
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
x = self.layer4(x)
if self.include_top:
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = self.fc(x)
return x
1.2.3使用遷移學(xué)習訓(xùn)練網(wǎng)絡(luò)
遷移學(xué)習是在別人已經(jīng)訓(xùn)練好的模型基礎(chǔ)上訓(xùn)練自己的模型,實驗表明,它可以更快地達到一個理想的效果。常見的遷移學(xué)習方式有以下幾種:1、載入權(quán)重后訓(xùn)練所有參數(shù)。2、載入權(quán)重后只訓(xùn)練最后幾層參數(shù)。3、載入權(quán)重后在原網(wǎng)絡(luò)的基礎(chǔ)上再添加一層全連接層,僅訓(xùn)練最后一個全連接層。
在Resnet網(wǎng)絡(luò)的訓(xùn)練中,可以在官網(wǎng)下載預(yù)訓(xùn)練好的模型,由于它的訓(xùn)練數(shù)據(jù)集是ImageNet,共有1000個類,如果要遷移到自己的實際任務(wù)當中,可以修改全連接層的參數(shù)數(shù)目,在訓(xùn)練最后一層全連接層即可。需要注意在測試時,要對數(shù)據(jù)進行與訓(xùn)練時相同的預(yù)處理。
修改全連接層參數(shù)代碼如下,假設(shè)分類任務(wù)共有五類。下述代碼重新定義了34層Resnet網(wǎng)絡(luò)中的全連接層。
net = resnet34()
# load pretrain weights
# download url: https://download.pytorch.org/models/resnet34-333f7ec4.pth
model_weight_path = "./resnet34-pre.pth"
assert os.path.exists(model_weight_path), "file {} does not exist.".format(model_weight_path)
net.load_state_dict(torch.load(model_weight_path, map_location='cpu'))
# for param in net.parameters():
# param.requires_grad = False
# change fc layer structure
in_channel = net.fc.in_features
net.fc = nn.Linear(in_channel, 5)
net.to(device)
二、ResNext網(wǎng)絡(luò)
1、ResNext改進之處
論文將ResNet網(wǎng)絡(luò)中第二種殘差塊通過分組卷積的方法進行了改進。分組卷積將輸入特征圖的通道分為多個group,對每一個group進行卷積,再對結(jié)果進行拼接。新的殘差塊將通道分為32個group。提高了模型準確率。
下圖是分組卷積的計算量,g表示group的個數(shù)。分組卷積有效減少了計算量。
三、基于Lenet網(wǎng)絡(luò)結(jié)構(gòu)的貓狗圖像分類
1、Lenet網(wǎng)絡(luò)結(jié)構(gòu)
Lenet網(wǎng)絡(luò)結(jié)構(gòu)如下:轉(zhuǎn)自https://zhuanlan.zhihu.com/p/116181964
2、pytorch代碼實現(xiàn)
3.2.1數(shù)據(jù)集加載
import torch
import torch.nn as nn
import torchvision
from torchvision import models,transforms,datasets
import torch.nn.functional as F
from PIL import Image
import torch.optim as optim
import os
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print('Using gpu: %s ' % torch.cuda.is_available())
train_path = './train/'
test_path = './test/'
def get_data(file_path):
file_lst = os.listdir(file_path) #獲得所有文件名稱 xxxx.jpg
data_lst = []
for i in range(len(file_lst)):
clas = file_lst[i][:3] #cat和dog在文件名的開頭
img_path = os.path.join(file_path,file_lst[i])#將文件名與路徑合并得到完整路徑,以備讀取
if clas == 'cat':
data_lst.append((img_path, 0))
else:
data_lst.append((img_path, 1))
return data_lst
class catdog_set(torch.utils.data.Dataset):
def __init__(self, path, transform):
super(catdog_set).__init__()
self.data_lst = get_data(path)#調(diào)用剛才的函數(shù)獲得數(shù)據(jù)列表
self.trans = torchvision.transforms.Compose(transform)
def __len__(self):
return len(self.data_lst)
def __getitem__(self,index):
(img,cls) = self.data_lst[index]
image = self.trans(Image.open(img))
label = torch.tensor(cls,dtype=torch.float32)
return image,label
# 將輸入圖像縮放為 128*128,每一個 batch 中圖像數(shù)量為128
# 訓(xùn)練時,每一個 epoch 隨機打亂圖像的順序,以實現(xiàn)樣本多樣化
train_loader = torch.utils.data.DataLoader(
catdog_set(train_path, [transforms.Resize((128,128)),transforms.ToTensor()]),
batch_size=128, shuffle=True)
訓(xùn)練集20000張圖片(貓10000張,狗10000張)測試集2000張圖片數(shù)據(jù)集下載地址與代碼放在同一目錄下。get_data函數(shù)返回一個列表,是參數(shù)文件夾下每一張圖片的路徑和標簽。[(‘./train/cat_0.jpg’, 0), (‘./train/cat_1.jpg’, 0),…(‘./train/dog_9999.jpg’, 1)]
3.2.2網(wǎng)絡(luò)結(jié)構(gòu)
Lenet的pytorch實現(xiàn)如下,
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.Conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(kernel_size=2)
self.Conv2 = nn.Conv2d(6, 16, 5)
self.pool = nn.MaxPool2d(kernel_size=2)
self.fc1 = nn.Linear(16*29*29,32)
self.fc2 = nn.Linear(32,2)
def forward(self, x):
x = self.Conv1(x)
print(x.shape)
x = self.pool(x)
print(x.shape)
x = self.pool(self.Conv2(x))
print(x.shape)
x = torch.flatten(x, 1)
print(x.shape)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
隨機產(chǎn)生一個指定大小的張量
x = torch.randn(1, 3, 128, 128)
print(x.shape)
net = Net()
y = net(x)
print(y.shape)
輸出如下:torch.Size([1, 3, 128, 128]) torch.Size([1, 6, 124, 124]) torch.Size([1, 6, 62, 62]) torch.Size([1, 16, 29, 29]) torch.Size([1, 13456]) torch.Size([1, 2])
說明網(wǎng)絡(luò)接通,網(wǎng)絡(luò)的輸出是1×2的。
3.2.3網(wǎng)絡(luò)訓(xùn)練
nn.CrossEntropyLoss()是交叉熵損失函數(shù),用于解決多分類或二分類問題。它的輸入是網(wǎng)絡(luò)最后一層的輸出,我們在forward函數(shù)中沒有寫softmax操作,原因在于該損失函數(shù)中對輸入進行了softmax操作。交叉熵函數(shù)
net = Net().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)
for epoch in range(30): # 重復(fù)多輪訓(xùn)練
for i, (inputs, labels) in enumerate(train_loader):
inputs = inputs.to(device)
labels = labels.to(device)
# 優(yōu)化器梯度歸零
optimizer.zero_grad()
# 正向傳播 + 反向傳播 + 優(yōu)化
outputs = net(inputs)
loss = criterion(outputs, labels.long())
loss.backward()
optimizer.step()
print('Epoch: %d loss: %.6f' %(epoch + 1, loss.item()))
print('Finished Training')
訓(xùn)練結(jié)果如下:
Epoch: 1 loss: 0.698980 Epoch: 2 loss: 0.482175 Epoch: 3 loss: 0.496106 Epoch: 4 loss: 0.491504 Epoch: 5 loss: 0.340280 Epoch: 6 loss: 0.421208 Epoch: 7 loss: 0.494740 Epoch: 8 loss: 0.276336 Epoch: 9 loss: 0.195770 Epoch: 10 loss: 0.157310 Epoch: 11 loss: 0.052218 Epoch: 12 loss: 0.055619 Epoch: 13 loss: 0.014557 Epoch: 14 loss: 0.010108 Epoch: 15 loss: 0.004856 Epoch: 16 loss: 0.007189 Epoch: 17 loss: 0.005779 Epoch: 18 loss: 0.108815 Epoch: 19 loss: 0.038461 Epoch: 20 loss: 0.057754 Epoch: 21 loss: 0.010165 Epoch: 22 loss: 0.001001 Epoch: 23 loss: 0.003251 Epoch: 24 loss: 0.000153 Epoch: 25 loss: 0.001171 Epoch: 26 loss: 0.000920 Epoch: 27 loss: 0.001027 Epoch: 28 loss: 0.000189 Epoch: 29 loss: 0.000538
為了做好運維面試路上的助攻手,特整理了上百道 【運維技術(shù)棧面試題集錦】 ,讓你面試不慌心不跳,高薪offer懷里抱!
這次整理的面試題,小到shell、MySQL,大到K8s等云原生技術(shù)棧,不僅適合運維新人入行面試需要,還適用于想提升進階跳槽加薪的運維朋友。
本份面試集錦涵蓋了
174 道運維工程師面試題128道k8s面試題108道shell腳本面試題200道Linux面試題51道docker面試題35道Jenkis面試題78道MongoDB面試題17道ansible面試題60道dubbo面試題53道kafka面試18道m(xù)ysql面試題40道nginx面試題77道redis面試題28道zookeeper
總計 1000+ 道面試題, 內(nèi)容 又全含金量又高
174道運維工程師面試題
1、什么是運維?
2、在工作中,運維人員經(jīng)常需要跟運營人員打交道,請問運營人員是做什么工作的?
3、現(xiàn)在給你三百臺服務(wù)器,你怎么對他們進行管理?
4、簡述raid0 raid1raid5二種工作模式的工作原理及特點
5、LVS、Nginx、HAproxy有什么區(qū)別?工作中你怎么選擇?
6、Squid、Varinsh和Nginx有什么區(qū)別,工作中你怎么選擇?
7、Tomcat和Resin有什么區(qū)別,工作中你怎么選擇?
8、什么是中間件?什么是jdk?
9、講述一下Tomcat8005、8009、8080三個端口的含義?
10、什么叫CDN?
11、什么叫網(wǎng)站灰度發(fā)布?
12、簡述DNS進行域名解析的過程?
13、RabbitMQ是什么東西?
14、講一下Keepalived的工作原理?
15、講述一下LVS三種模式的工作過程?
16、mysql的innodb如何定位鎖問題,mysql如何減少主從復(fù)制延遲?
17、如何重置mysql root密碼?
網(wǎng)上學(xué)習資料一大堆,但如果學(xué)到的知識不成體系,遇到問題時只是淺嘗輒止,不再深入研究,那么很難做到真正的技術(shù)提升。
需要這份系統(tǒng)化的資料的朋友,可以添加V獲?。簐ip1024b (備注運維)
一個人可以走的很快,但一群人才能走的更遠!不論你是正從事IT行業(yè)的老鳥或是對IT行業(yè)感興趣的新人,都歡迎加入我們的的圈子(技術(shù)交流、學(xué)習資源、職場吐槽、大廠內(nèi)推、面試輔導(dǎo)),讓我們一起學(xué)習成長! ,工作中你怎么選擇?
7、Tomcat和Resin有什么區(qū)別,工作中你怎么選擇?
8、什么是中間件?什么是jdk?
9、講述一下Tomcat8005、8009、8080三個端口的含義?
10、什么叫CDN?
11、什么叫網(wǎng)站灰度發(fā)布?
12、簡述DNS進行域名解析的過程?
13、RabbitMQ是什么東西?
14、講一下Keepalived的工作原理?
15、講述一下LVS三種模式的工作過程?
16、mysql的innodb如何定位鎖問題,mysql如何減少主從復(fù)制延遲?
17、如何重置mysql root密碼?
網(wǎng)上學(xué)習資料一大堆,但如果學(xué)到的知識不成體系,遇到問題時只是淺嘗輒止,不再深入研究,那么很難做到真正的技術(shù)提升。
需要這份系統(tǒng)化的資料的朋友,可以添加V獲?。簐ip1024b (備注運維) [外鏈圖片轉(zhuǎn)存中…(img-3AGdcHFv-1713620144293)]
一個人可以走的很快,但一群人才能走的更遠!不論你是正從事IT行業(yè)的老鳥或是對IT行業(yè)感興趣的新人,都歡迎加入我們的的圈子(技術(shù)交流、學(xué)習資源、職場吐槽、大廠內(nèi)推、面試輔導(dǎo)),讓我們一起學(xué)習成長!
柚子快報激活碼778899分享:網(wǎng)絡(luò) 深度學(xué)習第三周學(xué)習總結(jié)
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。