import torch
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt
# 從-1到1均勻生成100個數據
tensor_x = torch.linspace(-1, 1, 100)
'''
這裏是把一維矩陣轉二維矩陣,dim=1表示從tensor_x.shape的第1個下標維度添加1維
tensor_x.shape 是一維矩陣,大小是100,沒有方向
添加後shape變成了(100, 1)
'''
x = torch.unsqueeze(tensor_x, dim=1)
# y = x的平方加上一些噪點, torch.rand()是生成一串指定size,大於等於0小於1的數據
y = x.pow(2) + 0.2*torch.rand(x.size())
# x = Variable(x)
# y = Variable(y)
# plt.scatter(x.data.numpy(), y.data.numpy())
# plt.show()
k = True
class Net(torch.nn.Module):
'''
這是一個三層的神經網絡
'''
def __init__(self, n_feature, n_hidden, n_output):
'''
初始化
:param n_feature: 特徵數
:param n_hidden: 隱藏層神經元個數
:param n_output: 輸出數
'''
super(Net, self).__init__()
# 參數一是前一層網絡神經元的個數,參數二是該網絡層神經元的個數
self.hidden = torch.nn.Linear(n_feature, n_hidden)
self.predict = torch.nn.Linear(n_hidden, n_output)
def forward(self, x):
# relu 激活函數,把小於或等於0的數直接等於0。此時得到第二層的神經網絡數據
# x = F.relu(self.hidden(x))
x = F.relu(self.hidden(x))
# 得到第三層神經網絡輸出數據
x = self.predict(x)
return x
# 創建一個三層的神經網絡, 每層的神經元數量分別是1, 10 ,1
net = Net(1, 10, 1)
# SGD是一種優化器,net.parameters()是神經網絡中的所有參數,並設置學習率
optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
# 定義損失函數, MSELoss代表均方差
loss_func = torch.nn.MSELoss()
# 讓plt變成實時打印,打開交互模式
plt.ion()
plt.show()
for t in range(100):
# 調用搭建好的神經網絡模型,得到預測值
prediction = net(x)
# 用定義好的損失函數,得出預測值和真實值的loss
loss = loss_func(prediction, y)
# 每次都需要把梯度將爲0
optimizer.zero_grad()
# 誤差反向傳遞
loss.backward()
# 調用優化器進行優化,將參數更新值施加到 net 的 parameters 上
optimizer.step()
if t % 10 == 0:
# 清除當前座標軸
plt.cla()
plt.scatter(x.data.numpy(), y.data.numpy())
# r- 是紅色 lw 是線寬
plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
'''
給圖形添加標籤,0.5, 0 表示X軸和Y軸座標,
'Loss=%.4f'%loss.data.numpy()表示標註的內容,
.4f表示保留小數點後四位
fontdict是設置字體大小和顏色
'''
plt.text(0.5, 0, 'Loss=%.4f'%loss.data.numpy(), fontdict={'size':20, 'color': 'red'})
# 間隔多久再次進行繪圖
plt.pause(0.1)
運行上述代碼,圖形會繪製10次,最後的輸出如下: