天天看點

pytorch深入學習(一)

文章目錄

      • 線性回歸試水
      • 模型的儲存和讀取
      • 放進GPU(資料和模型)
      • 檢視每層的參數

線性回歸試水

其實線性回歸就是一個不加激活函數的全連接配接層

import torch
import torch.nn as nn
import numpy as np

x_values = [i for i in range(11)]
x_train = np.array(x_values, dtype=np.float32)
x_train = x_train.reshape(-1, 1)

y_values = [2*i+1 for i in x_values]
y_train = np.array(y_values, dtype=np.float32)
y_train = y_train.reshape(-1, 1)


class Linear_RegressionModel(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(Linear_RegressionModel, self).__init__()
        self.linear = nn.Linear(input_dim, output_dim)

    def forward(self, x):
        out = self.linear(x)
        return out


input_dim = 1
output_dim = 1

model = Linear_RegressionModel(input_dim, output_dim)
print(model)

           

指定好參數和損失函數

epoches = 1000
learning_rate = 0.01
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
criterion = nn.MSELoss()

for epoch in range(epoches):
    epoch += 1
    # 轉換為tensor
    inputs = torch.from_numpy(x_train)
    labels = torch.from_numpy(y_train)

    # 梯度要清零每一次疊代
    optimizer.zero_grad()

    # 前向傳播
    outputs = model(inputs)

    # 計算損失
    loss = criterion(outputs, labels)

    # 反向傳播
    loss.backward()
    optimizer.step()

    if epoch % 50 == 0:
        print('epoch:{}, loss:{}'.format(epoch, loss))

print(model.linear.weight)
           

模型的儲存和讀取

torch.save(model.state_dict(), 'model.pkl')
torch.load_state_dict(torch.load('model.pkl'))
           

小小修改一下

torch.save(model.state_dict(), 'model.pkl')
model.linear.weight.data.fill_(0) # 更改一個參數
print(model.linear.weight) # 0
model.load_state_dict(torch.load('model.pkl')) # 變回來了
model.eval()
# 請記住,在運作推理之前,務必調用model.eval()
# 去設定 dropout 和 batch normalization 層為評估模式。
# 如果不這麼做,可能導緻 模型推斷結果不一緻。
print(model(torch.from_numpy(x_train)))

           

放進GPU(資料和模型)

device = torch.device('cuda:0' if torch.cuda.is_avaiable() else 'cpu')
model.to(device)
inputs = torch.from_numpy(x_train).to(device)
labels = torch.from_numpy(y_train).to(device)


# 最簡單的model = model.cuda()也可以
           

檢視每層的參數

model = CNN()
print(model)  # 1
print(model.conv1.weight.shape) # 2
print(model.fc1.weight.shape) # 3

>>
CNN(
  (conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))
  (conv2): Conv2d(6, 12, kernel_size=(5, 5), stride=(1, 1))
)
>>
torch.Size([6, 1, 5, 5])
>>
torch.Size([120, 192])
           

繼續閱讀