博客地址:https://blog.csdn.net/CoderPai/article/details/104137705
點擊閱讀原文,更好的閱讀體驗
CoderPai 是一個專注於人工智慧在量化交易應用的算法實戰平臺,主要關注人工智慧在量化交易上面的應用。如果你對人工智慧感興趣,請快快關注 「CoderPai」 微信號(coderpai)吧。
(一)pytorch學習筆記
(二)pytorch學習筆記
關係擬合 (回歸)我會這次會來見證神經網絡是如何通過簡單的形式將一群數據用一條線條來表示. 或者說, 是如何在數據當中找到他們的關係, 然後用神經網絡模型來建立一個可以代表他們關係的線條.
建立數據集我們創建一些假數據來模擬真實的情況. 比如一個一元二次函數: y = a * x^2 + b, 我們給 y 數據加上一點噪聲來更加真實的展示它.
import torch
import matplotlib.pyplot as plt
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) # x data (tensor), shape=(100, 1)
y = x.pow(2) + 0.2*torch.rand(x.size()) # noisy y data (tensor), shape=(100, 1)
# 畫圖
plt.scatter(x.data.numpy(), y.data.numpy())
plt.show()
建立一個神經網絡我們可以直接運用 torch 中的體系. 先定義所有的層屬性(__init__()), 然後再一層層搭建(forward(x))層於層的關係連結. 建立關係的時候, 我們會用到激勵函數.
import torch
import torch.nn.functional as F # 激勵函數都在這
class Net(torch.nn.Module): # 繼承 torch 的 Module
def __init__(self, n_feature, n_hidden, n_output):
super(Net, self).__init__() # 繼承 __init__ 功能
# 定義每層用什麼樣的形式
self.hidden = torch.nn.Linear(n_feature, n_hidden) # 隱藏層線性輸出
self.predict = torch.nn.Linear(n_hidden, n_output) # 輸出層線性輸出
def forward(self, x): # 這同時也是 Module 中的 forward 功能
# 正向傳播輸入值, 神經網絡分析出輸出值
x = F.relu(self.hidden(x)) # 激勵函數(隱藏層的線性值)
x = self.predict(x) # 輸出值
return x
net = Net(n_feature=1, n_hidden=10, n_output=1)
print(net) # net 的結構
"""
Net (
(hidden): Linear (1 -> 10)
(predict): Linear (10 -> 1)
)
"""
訓練的步驟很簡單, 如下:
# optimizer 是訓練的工具
optimizer = torch.optim.SGD(net.parameters(), lr=0.2) # 傳入 net 的所有參數, 學習率
loss_func = torch.nn.MSELoss() # 預測值和真實值的誤差計算公式 (均方差)
for t in range(100):
prediction = net(x) # 餵給 net 訓練數據 x, 輸出預測值
loss = loss_func(prediction, y) # 計算兩者的誤差
optimizer.zero_grad() # 清空上一步的殘餘更新參數值
loss.backward() # 誤差反向傳播, 計算參數更新值
optimizer.step() # 將參數更新值施加到 net 的 parameters 上
為了可視化整個訓練的過程, 更好的理解是如何訓練, 我們如下操作:
import matplotlib.pyplot as plt
plt.ion() # 畫圖
plt.show()
for t in range(200):
...
loss.backward()
optimizer.step()
# 接著上面來
if t % 5 == 0:
# plot and show learning process
plt.cla()
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'})
plt.pause(0.1)
這次我們也是用最簡單的途徑來看看神經網絡是怎麼進行事物的分類.
在這裡插入圖片描述建立數據集我們創建一些假數據來模擬真實的情況. 比如兩個二次分布的數據, 不過他們的均值都不一樣.
import torch
import matplotlib.pyplot as plt
# 假數據
n_data = torch.ones(100, 2) # 數據的基本形態
x0 = torch.normal(2*n_data, 1) # 類型0 x data (tensor), shape=(100, 2)
y0 = torch.zeros(100) # 類型0 y data (tensor), shape=(100, )
x1 = torch.normal(-2*n_data, 1) # 類型1 x data (tensor), shape=(100, 1)
y1 = torch.ones(100) # 類型1 y data (tensor), shape=(100, )
# 注意 x, y 數據的數據形式是一定要像下面一樣 (torch.cat 是在合併數據)
x = torch.cat((x0, x1), 0).type(torch.FloatTensor) # FloatTensor = 32-bit floating
y = torch.cat((y0, y1), ).type(torch.LongTensor) # LongTensor = 64-bit integer
# plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=y.data.numpy(), s=100, lw=0, cmap='RdYlGn')
# plt.show()
# 畫圖
plt.scatter(x.data.numpy(), y.data.numpy())
plt.show()
建立一個神經網絡我們可以直接運用 torch 中的體系. 先定義所有的層屬性(__init__()), 然後再一層層搭建(forward(x))層於層的關係連結. 這個和我們在前面 regression 的時候的神經網絡基本沒差. 建立關係的時候, 我們會用到激勵函數.
import torch
import torch.nn.functional as F # 激勵函數都在這
class Net(torch.nn.Module): # 繼承 torch 的 Module
def __init__(self, n_feature, n_hidden, n_output):
super(Net, self).__init__() # 繼承 __init__ 功能
self.hidden = torch.nn.Linear(n_feature, n_hidden) # 隱藏層線性輸出
self.out = torch.nn.Linear(n_hidden, n_output) # 輸出層線性輸出
def forward(self, x):
# 正向傳播輸入值, 神經網絡分析出輸出值
x = F.relu(self.hidden(x)) # 激勵函數(隱藏層的線性值)
x = self.out(x) # 輸出值, 但是這個不是預測值, 預測值還需要再另外計算
return x
net = Net(n_feature=2, n_hidden=10, n_output=2) # 幾個類別就幾個 output
print(net) # net 的結構
"""
Net (
(hidden): Linear (2 -> 10)
(out): Linear (10 -> 2)
)
"""
訓練的步驟很簡單, 如下:
# optimizer 是訓練的工具
optimizer = torch.optim.SGD(net.parameters(), lr=0.02) # 傳入 net 的所有參數, 學習率
# 算誤差的時候, 注意真實值!不是! one-hot 形式的, 而是1D Tensor, (batch,)
# 但是預測值是2D tensor (batch, n_classes)
loss_func = torch.nn.CrossEntropyLoss()
for t in range(100):
out = net(x) # 餵給 net 訓練數據 x, 輸出分析值
loss = loss_func(out, y) # 計算兩者的誤差
optimizer.zero_grad() # 清空上一步的殘餘更新參數值
loss.backward() # 誤差反向傳播, 計算參數更新值
optimizer.step() # 將參數更新值施加到 net 的 parameters 上
為了可視化整個訓練的過程, 更好的理解是如何訓練, 我們如下操作:
import matplotlib.pyplot as plt
plt.ion() # 畫圖
plt.show()
for t in range(100):
...
loss.backward()
optimizer.step()
# 接著上面來
if t % 2 == 0:
plt.cla()
# 過了一道 softmax 的激勵函數後的最大概率才是預測值
prediction = torch.max(F.softmax(out), 1)[1]
pred_y = prediction.data.numpy().squeeze()
target_y = y.data.numpy()
plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=pred_y, s=100, lw=0, cmap='RdYlGn')
accuracy = sum(pred_y == target_y)/200. # 預測中有多少和真實值一樣
plt.text(1.5, -4, 'Accuracy=%.2f' % accuracy, fontdict={'size': 20, 'color': 'red'})
plt.pause(0.1)
plt.ioff() # 停止畫圖
plt.show()
連結:
https://morvanzhou.github.io/tutorials/machine-learning/torch/
https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents/301_regression.py
https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents/302_classification.py
作者:chen_h
微信號&QQ:862251340