天天看點

PyTorch深度學習實踐——處理多元特征的輸入

import torch
import numpy as np

xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32)  # 括号内第一個為檔案名,第二個為分隔符,第三個為指定資料類型
x_data = torch.from_numpy(xy[:, :-1])  # 最後一列不要(-1表示最後一列),取前面八列(最後一列是y)
y_data = torch.from_numpy(xy[:, [-1]])  # 中括号表示僅取-1這一列(即最後一列),寫中括号代表拿出來的是一個矩陣,否則是一個向量


class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1 = torch.nn.Linear(8, 6)  # 輸入次元為8,輸出次元為6(列的數量為此處的次元),Linear函數實作了空間次元的變換
        self.linear2 = torch.nn.Linear(6, 4)
        self.linear3 = torch.nn.Linear(4, 1)
        self.sigmoid = torch.nn.Sigmoid()  # 構造sigmoid函數,使用其他函數隻需要修改這一行代碼即可
        # 和上一講中不需要初始化sigmoid函數的差別:上一講中調用torch.nn.functional.Sigmoid,sigmoid是可以直接使用的函數;
        # 而此處使用torch.nn.Sigmoid,此處的sigmoid是一個子產品,繼承自Module,沒有可訓練的參數,故隻需要一個(linear需要三個)

    def forward(self, x):
        x = self.sigmoid(self.linear1(x))
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x))
        return x


model = Model()

criterion = torch.nn.BCELoss(reduction='mean')  # BCE損失函數
optimizer = torch.optim.SGD(model.paraments(), lr=0.1)  # 優化器

for epoch in range(100):
    # Forward
    y_pred = model(x_data)  # 此處并沒有做mini-batch,而是使用了所有資料
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())

    # Backward
    optimizer.zero_grad()  # 梯度清零
    loss.backward()

    # Update
    optimizer.step()
           

此講的主要内容是輸入多元資料并調用。注意根據輸入次元和輸出次元調用資料集的某幾列,如本例中,資料集的前八列作為輸入次元為8維的x,最後一列為輸出次元為1維的y,是以可以看到在代碼中分别取了前八列和最後一列。

此外,本例還使用了多層神經網絡,他們的線性單元中的參數不同,故需要linear1、2、3分别對參數進行訓練,而sigmoid函數由于沒有需要訓練的參數,故隻有一個即可。神經網絡層與層的連接配接靠不同次元的矩陣變換實作,本例中是8*6,6*4,4*1共三個變換矩陣,最終效果要保證輸入次元為8,輸出次元為1。(在調用資料集以及後續計算過程中一定要注意矩陣次元的比對,否則無法計算)

此例也說明了神經網絡的功能:實作非線性的空間變換。

繼續閱讀