教程來源b站劉二《pytorch深度學(xué)習(xí)實(shí)戰(zhàn)》
乘的權(quán)重(w)都一樣,加的偏置(b)也一樣。b變成矩陣時(shí)使用廣播機(jī)制玩祟。神經(jīng)網(wǎng)絡(luò)的參數(shù)w和b是網(wǎng)絡(luò)需要學(xué)習(xí)的靡馁,其他是已知的欲鹏。
學(xué)習(xí)能力越強(qiáng),有可能會(huì)把輸入樣本中噪聲的規(guī)律也學(xué)到臭墨。我們要學(xué)習(xí)數(shù)據(jù)本身真實(shí)數(shù)據(jù)的規(guī)律赔嚎,學(xué)習(xí)能力要有泛化能力。
該神經(jīng)網(wǎng)絡(luò)共3層胧弛;第一層是8維到6維的非線性空間變換尤误,第二層是6維到4維的非線性空間變換,第三層是4維到1維的非線性空間變換结缚。
本算法中torch.nn.Sigmoid() # 將其看作是網(wǎng)絡(luò)的一層损晤,而不是簡單的函數(shù)使用
代碼實(shí)現(xiàn)糖尿病數(shù)據(jù)的二分類
import numpy as np
import torch
import matplotlib.pyplot as plt
# prepare dataset
xy = np.loadtxt('diabetes.csv', delimiter = ',', dtype = np.float32)
# 第一個(gè)‘:’是指讀取所有行,第二個(gè)‘:’是指從第一列開始红竭,最后一列不要
x_data = torch.from_numpy(xy[:, :-1])
# [-1] 最后得到的是個(gè)矩陣
y_data = torch.from_numpy(xy[:, [-1]])
# design model using class
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = torch.nn.Linear(8, 6) # 輸入數(shù)據(jù)x的特征是8維尤勋,x有8個(gè)特征,輸出為6維
self.linear2 = torch.nn.Linear(6, 4)
self.linear3 = torch.nn.Linear(4, 1)
self.sigmoid = torch.nn.Sigmoid() # 將其看作是網(wǎng)絡(luò)的一層,而不是簡單的函數(shù)使用
def forward(self, x): # 構(gòu)建一個(gè)計(jì)算圖
x = self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x)) # 將上面一行的輸出作為輸入
x = self.sigmoid(self.linear3(x))
return x
model = Model()
# construct loss and optimizer
criterion = torch.nn.BCELoss(reduction = 'mean')
optimizer = torch.optim.SGD(model.parameters(), lr = 0.1)
epoch_list = []
loss_list = []
# training cycle forward, backward, update
for epoch in range(1000000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
#print(epoch, loss.item())
epoch_list.append(epoch)
loss_list.append(loss)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 輸出準(zhǔn)確率acc為評(píng)價(jià)指標(biāo)
if epoch % 10000 == 0:
# torch.where(condition茵宪,a最冰,b)其中,輸入?yún)?shù)condition:條件限制,如果滿足條件稀火,則選擇a暖哨,否則選擇b作為輸出。
y_pred_label = torch.where(y_pred>=0.5, torch.tensor([1.0]), torch.tensor([0.0]))
# 計(jì)算正確的數(shù)量
acc = torch.eq(y_pred_label, y_data).sum().item()/y_data.size(0)
print("epoch = ", epoch, "loss = ", loss.item(), "acc = ", acc)
# 可視化
# plt.plot(epoch_list, loss_list)
# plt.ylabel('loss')
# plt.xlabel('epoch')
# plt.show()
# 如果要查看網(wǎng)絡(luò)的參數(shù)可以進(jìn)行以下打印
# 參數(shù)說明
# 例如第一層的參數(shù):
# layer1_weight = model.linear1.weight.data
# layer1_bias = model.linear1.bias.data
# print("layer1_weight", layer1_weight)
# print("layer1_weight.shape", layer1_weight.shape)
# print("layer1_bias", layer1_bias)
# print("layer1_bias.shape", layer1_bias.shape)
運(yùn)行結(jié)果:使用SGD凰狞,學(xué)習(xí)率為0.1,在訓(xùn)練100w次后,loss會(huì)下降到0.3左右篇裁。準(zhǔn)確率可以達(dá)到87%
這個(gè)訓(xùn)練100w次才得到這個(gè)結(jié)果并不盡人意箕慧,因此考慮使用其他優(yōu)化器,使用了Adam
optimizer = torch.optim.Adam(model.parameters(),
lr=0.001,
betas=(0.9, 0.999),
eps=1e-08,
weight_decay=0,
amsgrad=False)
最后結(jié)果有所提升茴恰,僅15w次颠焦,loss可降到0.25,acc到達(dá)了90%