文章目錄
-
-
- 線性回歸試水
- 模型的儲存和讀取
- 放進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])