網(wǎng)站備案 取名資訊通不過外貿(mào)網(wǎng)站推廣費用
目錄
一、實驗?zāi)康?/p>
二、實驗環(huán)境
三、實驗內(nèi)容
3.1 完成解壓數(shù)據(jù)集相關(guān)操作
3.2分析代碼結(jié)構(gòu)并運行代碼查看結(jié)果
3.3修改超參數(shù)(批量大小、學(xué)習(xí)率、Epoch)并對比分析不同結(jié)果
3.4修改網(wǎng)絡(luò)結(jié)構(gòu)(隱藏層數(shù)、神經(jīng)元個數(shù))并對比分析不同結(jié)果
四、實驗小結(jié)
一、實驗?zāi)康?/strong>
- 了解python語法
- 了解全連接神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
- 調(diào)整超參數(shù)、修改網(wǎng)絡(luò)結(jié)構(gòu)并對比分析其結(jié)果
二、實驗環(huán)境
Baidu 飛槳AI Studio
三、實驗內(nèi)容
3.1 完成解壓數(shù)據(jù)集相關(guān)操作
輸入以下兩行命令解壓數(shù)據(jù)集
(1)cd ./data/data230? ? ?
(2)unzip Minst.zip
運行后結(jié)果如圖1所示
圖 1?解壓數(shù)據(jù)集
3.2分析代碼結(jié)構(gòu)并運行代碼查看結(jié)果
代碼結(jié)構(gòu):
import?torchfrom?torch?import?nn,?optimfrom?torch.autograd?import?Variablefrom?torch.utils.data?import?DataLoaderfrom?torchvision?import?datasets,?transformsbatch_size?=?64learning_rate?=?0.02class?Batch_Net(nn.Module):def?__init__(self,?in_dim,?n_hidden_1,?n_hidden_2,?out_dim):super(Batch_Net,?self).__init__()self.layer1?=?nn.Sequential(nn.Linear(in_dim,?n_hidden_1),?nn.BatchNorm1d(n_hidden_1),?nn.ReLU(True))self.layer2?=?nn.Sequential(nn.Linear(n_hidden_1,?n_hidden_2),?nn.BatchNorm1d(n_hidden_2),?nn.ReLU(True))self.layer3?=?nn.Sequential(nn.Linear(n_hidden_2,?out_dim))def?forward(self,?x):x?=?self.layer1(x)x?=?self.layer2(x)x?=?self.layer3(x)return?xdata_tf?=?transforms.Compose([transforms.ToTensor(),transforms.Normalize([0.5],?[0.5])])train_dataset?=?datasets.MNIST(root='./data/data230',?train=True,?transform=data_tf,?download=True)test_dataset?=?datasets.MNIST(root='./data/data230',?train=False,?transform=data_tf)train_loader?=?DataLoader(train_dataset,?batch_size=batch_size,?shuffle=True)test_loader?=?DataLoader(test_dataset,?batch_size=batch_size,?shuffle=False)#model?=?net.simpleNet(28?*?28,?300,?100,?10)#?model?=?Activation_Net(28?*?28,?300,?100,?10)model?=?Batch_Net(28?*?28,?300,?100,?10)if?torch.cuda.is_available():model?=?model.cuda()criterion?=?nn.CrossEntropyLoss()optimizer?=?optim.SGD(model.parameters(),?lr=learning_rate)epoch?=?0for?data?in?train_loader:img,?label?=?dataimg?=?img.view(img.size(0),?-1)if?torch.cuda.is_available():img?=?img.cuda()label?=?label.cuda()else:img?=?Variable(img)label?=?Variable(label)out?=?model(img)loss?=?criterion(out,?label)print_loss?=?loss.data.item()optimizer.zero_grad()loss.backward()optimizer.step()epoch+=1if?epoch%100?==?0:print('epoch:?{},?loss:?{:.4}'.format(epoch,?loss.data.item()))model.eval()eval_loss?=?0eval_acc?=?0for?data?in?test_loader:img,?label?=?dataimg?=?img.view(img.size(0),?-1)if?torch.cuda.is_available():img?=?img.cuda()label?=?label.cuda()out?=?model(img)loss?=?criterion(out,?label)eval_loss?+=?loss.data.item()*label.size(0)_,?pred?=?torch.max(out,?1)num_correct?=?(pred?==?label).sum()eval_acc?+=?num_correct.item()print('Test?Loss:?{:.6f},?Acc:?{:.6f}'.format(eval_loss?/?(len(test_dataset)),eval_acc?/?(len(test_dataset))))
代碼分析:
代碼實現(xiàn)了通過使用批標(biāo)準(zhǔn)化的神經(jīng)網(wǎng)絡(luò)模型對MNIST數(shù)據(jù)集進(jìn)行分類。
1.首先定義一些模型中會用到的超參數(shù),在實驗中設(shè)置批量大小(batch_size)為64,學(xué)習(xí)率(learning_rate)為0.02
2.定義Batch_Net神經(jīng)網(wǎng)絡(luò)類繼承自torch庫的nn.Module。
(1)定義的初始化函數(shù)_init_接收輸入維度(in_dim)、兩個隱藏層神經(jīng)元數(shù)量(n_hidden_1和n_hidden_2)和輸出維度(out_dim)作為參數(shù),定義第一層和第二層網(wǎng)絡(luò)結(jié)構(gòu),包括線性變換、批標(biāo)準(zhǔn)化和ReLU激活函數(shù),第三層網(wǎng)絡(luò)結(jié)構(gòu)只包括線性變換。
(2)定義的forward前向傳播函數(shù)接受輸入x,依次經(jīng)過三層網(wǎng)絡(luò)結(jié)構(gòu)處理后返回處理結(jié)果。
3.將數(shù)據(jù)進(jìn)行預(yù)處理。包括使用transforms.ToTensor()將圖片轉(zhuǎn)換成PyTorch中處理的對象Tensor,并進(jìn)行標(biāo)準(zhǔn)化操作,通過transforms.Normalize()做歸一化(減均值,再除以標(biāo)準(zhǔn)差)操作,通過transforms.Compose()函數(shù)組合各種預(yù)處理的操作。
4.下載并加載MNIST訓(xùn)練數(shù)據(jù)(train_dataset)以及測試數(shù)據(jù)(test_dataset);創(chuàng)建數(shù)據(jù)加載器,用于批量加載訓(xùn)練數(shù)據(jù)(train_loader)和測試數(shù)據(jù)(test_loader)。
5.選擇訓(xùn)練的模型,實驗中選擇Batch_Net模型,判斷GPU是否可用,如果GPU可用,則將模型放到GPU上運行。在定義損失函數(shù)(criterion)和優(yōu)化器(optimizer),損失函數(shù)使用交叉熵?fù)p失,優(yōu)化器使用隨機梯度下降優(yōu)化器。
6.開始訓(xùn)練模型,遍歷訓(xùn)練數(shù)據(jù),通過img.view(img.size(0), -1)將圖像數(shù)據(jù)調(diào)整為一維張量,以便與模型的輸入匹配。計算損失值(loss)并進(jìn)行反向傳播和參數(shù)更新,每100個epoch打印一次訓(xùn)練損失,最后評估模型在測試集上的性能,計算并打印總損失(將損失值乘以當(dāng)前批次的樣本數(shù)量,累加到eval_loss中)和準(zhǔn)確率(eval_acc)。
運行代碼后的結(jié)果如圖所示:
圖 2?批量大小=64,學(xué)習(xí)率=0.02,Epoch次數(shù)=100
3.3修改超參數(shù)(批量大小、學(xué)習(xí)率、Epoch)并對比分析不同結(jié)果
1.當(dāng)只修改批量大小batch_size時(學(xué)習(xí)率=0.02,Epoch次數(shù)=100)
(1)batch_size=16,結(jié)果如圖3所示
圖 3
(2)batch_size=64,結(jié)果如圖4所示
圖 4
(3)batch_size=128,結(jié)果如圖5所示
圖 5
對比總結(jié):增大batch_size后,數(shù)據(jù)的處理速度加快,運行時間變短,跑完一次 epoch(全數(shù)據(jù)集)所迭代的次數(shù)減少。
2.當(dāng)只修改學(xué)習(xí)率learning_rate時(批量大小=64,Epoch次數(shù)=100)
(1)learning_rate=0.005,結(jié)果如圖6所示。
圖 6
(2)learning_rate=0.02,結(jié)果如圖7所示。
圖 7
(3)learning_rate=0.1,結(jié)果如圖8所示。
圖 8
(4)learning_rate=0.4,結(jié)果如圖9所示。
圖 9
對比總結(jié):當(dāng)學(xué)習(xí)率適當(dāng)增大時可能會有助于降低損失函數(shù),提高模型的精確度,但是當(dāng)學(xué)習(xí)率超出一定范圍則會降低模型的精確率。
3.當(dāng)只修改Epoch次數(shù)時(批量大小=64,學(xué)習(xí)率=0.02)
(1)Epoch=50,結(jié)果如圖10所示。
圖 10
(2)Epoch=100,結(jié)果如圖11所示。
圖 11
(3)Epoch=200,結(jié)果如圖12所示。
圖 12
對比總結(jié):不同Epoch次數(shù)導(dǎo)致?lián)p失函數(shù)不同、模型的準(zhǔn)確率有所差別。
3.4修改網(wǎng)絡(luò)結(jié)構(gòu)(隱藏層數(shù)、神經(jīng)元個數(shù))并對比分析不同結(jié)果
1.修改神經(jīng)網(wǎng)絡(luò)的隱藏層數(shù)
(1)隱藏層數(shù)為兩層時的結(jié)果(n_hidden_1、n_hidden_2),結(jié)果如圖13所示。
圖 13
(2)隱藏層數(shù)為三層時的結(jié)果(n_hidden_1、n_hidden_2、n_hidden_3),結(jié)果如圖14所示。
圖 14
對比結(jié)果:可以看到,增加隱藏層個數(shù)后,運行時間增加,損失函數(shù)有所降低,三層隱藏層網(wǎng)絡(luò)結(jié)構(gòu)的模型準(zhǔn)確率較高于兩層隱藏層模型的準(zhǔn)確率。
2.修改神經(jīng)元個數(shù)(這里基于三層隱藏層數(shù)進(jìn)行實驗)
(1)神經(jīng)元個數(shù)參數(shù)設(shè)定為model = Batch_Net(28 * 28, 300, 200,100, 10),結(jié)果如圖15所示。
圖 15
(2)神經(jīng)元個數(shù)參數(shù)設(shè)定為model = Batch_Net(28 * 28, 400, 300,200, 10),結(jié)果如圖16所示。
圖 16
(3)神經(jīng)元個數(shù)參數(shù)設(shè)定為model = Batch_Net(28 * 28, 200, 100,50, 10),結(jié)果如圖17所示。
圖 17
四、實驗小結(jié)
超參數(shù)是在訓(xùn)練神經(jīng)網(wǎng)絡(luò)之前設(shè)置的,而不是通過訓(xùn)練過程中學(xué)習(xí)得出的。常見的超參數(shù)包括學(xué)習(xí)率、批量大小、隱藏層的數(shù)量、神經(jīng)元的個數(shù)等等。在使用深度神經(jīng)網(wǎng)絡(luò)時,正確地調(diào)整超參數(shù)是提高模型性能的關(guān)鍵。