autograd 及Variable
Autograd: 自動微分
autograd包是PyTorch中神經網絡的核心, 它可以為基於tensor的的所有操作提供自動微分的功能, 這是一個逐個運行的框架, 意味着反向傳播是根據你的代碼來運行的, 並且每一次的迭代運行都可能不同.
Variable
tensor是硬幣的話,那Variable就是錢包,它記錄着里面的錢的多少,和錢的流向
- 詳細見https://zhuanlan.zhihu.com/p/34298983
線性回歸
"""
# @Time : 2020/9/14
# @Author : Jimou Chen
"""
import numpy as np
import matplotlib.pyplot as plt
from torch import nn, optim
from torch.autograd import Variable
import torch
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'
# 構建神經網絡模型
class LinearRegression(nn.Module):
# 定義網絡結構
def __init__(self):
super().__init__() # 初始化父類
# 全連接層
self.fc = nn.Linear(1, 1) # 輸入1個,輸出1個
# 定義網絡計算,(前向的計算)
def forward(self, x):
# x 是整個網絡的輸入,傳給全連接層做計算
output = self.fc(x)
return output # 返回輸出值
if __name__ == '__main__':
# 隨機生成0-1內的100個數據
x_data = np.random.rand(100)
# 0-0.01內的噪點數據,尺寸和x_data一樣
noise = np.random.normal(0, 0.01, x_data.shape)
# print(noise.shape,x_data.shape)
# 因變量
y_data = x_data * 0.1 + 0.2 + noise
print(y_data.shape)
plt.scatter(x_data, y_data)
plt.show()
# 轉成2維
x_data = x_data.reshape(-1, 1)
y_data = y_data.reshape(-1, 1)
# 把numpy類型轉成tensor
x_data = torch.FloatTensor(x_data)
y_data = torch.FloatTensor(y_data)
# 轉換成pytorch環境里面的變量
inputs = Variable(x_data)
target = Variable(y_data)
# 建模,神經網絡模型
model = LinearRegression()
# 定義代價函數,取均方差代價函數
loss = nn.MSELoss()
# 定義優化器,取梯度下降法,傳入模型參數和學習率
optimizer = optim.SGD(model.parameters(), lr=0.1)
# for name, param in model.named_parameters():
# print(name,param)
# 訓練模型1000次
for i in range(1000):
out = model(inputs)
# 計算loss
mse_loss = loss(out, target)
# 梯度清零
optimizer.zero_grad()
# 計算梯度
mse_loss.backward()
# 修改權值
optimizer.step()
if i % 200 == 0:
print(i, mse_loss.item())
predict = model(inputs)
plt.scatter(x_data, y_data)
plt.plot(x_data, predict.data.numpy(), 'r-', lw=3)
plt.show()
D:\Anaconda\Anaconda3\python.exe D:/Appication/PyCharm/Git/computer-vision/PytorchLearning/LinearRegression/linear_regression.py
(100,)
0 0.1716347187757492
200 0.00019752216758206487
400 0.00011990861094091088
600 0.00011977301619481295
800 0.00011977282701991498
Process finished with exit code 0