分类网络
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
import torch
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt
# 构造数据
n_data = torch.ones( 100 , 2 )
x0 = torch.normal( 3 * n_data, 1 )
x1 = torch.normal( - 3 * n_data, 1 )
# 标记为y0=0,y1=1两类标签
y0 = torch.zeros( 100 )
y1 = torch.ones( 100 )
# 通过.cat连接数据
x = torch.cat((x0, x1), 0 ). type (torch.FloatTensor)
y = torch.cat((y0, y1), 0 ). type (torch.LongTensor)
# .cuda()会将Variable数据迁入GPU中
x, y = Variable(x).cuda(), Variable(y).cuda()
# plt.scatter(x.data.cpu().numpy()[:, 0], x.data.cpu().numpy()[:, 1], c=y.data.cpu().numpy(), s=100, lw=0, cmap='RdYlBu')
# plt.show()
# 网络构造方法一
class Net(torch.nn.Module):
def __init__( self , n_feature, n_hidden, n_output):
super (Net, self ).__init__()
# 隐藏层的输入和输出
self .hidden1 = torch.nn.Linear(n_feature, n_hidden)
self .hidden2 = torch.nn.Linear(n_hidden, n_hidden)
# 输出层的输入和输出
self .out = torch.nn.Linear(n_hidden, n_output)
def forward( self , x):
x = F.relu( self .hidden2( self .hidden1(x)))
x = self .out(x)
return x
# 初始化一个网络,1个输入层,10个隐藏层,1个输出层
net = Net( 2 , 10 , 2 )
# 网络构造方法二
'''
net = torch.nn.Sequential(
torch.nn.Linear(2, 10),
torch.nn.Linear(10, 10),
torch.nn.ReLU(),
torch.nn.Linear(10, 2),
)
'''
# .cuda()将网络迁入GPU中
net.cuda()
# 配置网络优化器
optimizer = torch.optim.SGD(net.parameters(), lr = 0.2 )
# SGD: torch.optim.SGD(net.parameters(), lr=0.01)
# Momentum: torch.optim.SGD(net.parameters(), lr=0.01, momentum=0.8)
# RMSprop: torch.optim.RMSprop(net.parameters(), lr=0.01, alpha=0.9)
# Adam: torch.optim.Adam(net.parameters(), lr=0.01, betas=(0.9, 0.99))
loss_func = torch.nn.CrossEntropyLoss()
# 动态可视化
plt.ion()
plt.show()
for t in range ( 300 ):
print (t)
out = net(x)
loss = loss_func(out, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if t % 5 = = 0 :
plt.cla()
prediction = torch. max (F.softmax(out, dim = 0 ), 1 )[ 1 ].cuda()
# GPU中的数据无法被matplotlib利用,需要用.cpu()将数据从GPU中迁出到CPU中
pred_y = prediction.data.cpu().numpy().squeeze()
target_y = y.data.cpu().numpy()
plt.scatter(x.data.cpu().numpy()[:, 0 ], x.data.cpu().numpy()[:, 1 ], c = pred_y, s = 100 , lw = 0 , cmap = 'RdYlBu' )
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()
|
回归网络
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
import torch
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt
# 构造数据
x = torch.unsqueeze(torch.linspace( - 1 , 1 , 100 ), dim = 1 )
y = x. pow ( 2 ) + 0.2 * torch.rand(x.size())
# .cuda()会将Variable数据迁入GPU中
x, y = Variable(x).cuda(), Variable(y).cuda()
# plt.scatter(x.data.numpy(), y.data.numpy())
# plt.show()
# 网络构造方法一
class Net(torch.nn.Module):
def __init__( self , n_feature, n_hidden, 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):
x = F.relu( self .hidden(x))
x = self .predict(x)
return x
# 初始化一个网络,1个输入层,10个隐藏层,1个输出层
net = Net( 1 , 10 , 1 )
# 网络构造方法二
'''
net = torch.nn.Sequential(
torch.nn.Linear(1, 10),
torch.nn.ReLU(),
torch.nn.Linear(10, 1),
)
'''
# .cuda()将网络迁入GPU中
net.cuda()
# 配置网络优化器
optimizer = torch.optim.SGD(net.parameters(), lr = 0.5 )
# SGD: torch.optim.SGD(net.parameters(), lr=0.01)
# Momentum: torch.optim.SGD(net.parameters(), lr=0.01, momentum=0.8)
# RMSprop: torch.optim.RMSprop(net.parameters(), lr=0.01, alpha=0.9)
# Adam: torch.optim.Adam(net.parameters(), lr=0.01, betas=(0.9, 0.99))
loss_func = torch.nn.MSELoss()
# 动态可视化
plt.ion()
plt.show()
for t in range ( 300 ):
prediction = net(x)
loss = loss_func(prediction, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if t % 5 = = 0 :
plt.cla()
# GPU中的数据无法被matplotlib利用,需要用.cpu()将数据从GPU中迁出到CPU中
plt.scatter(x.data.cpu().numpy(), y.data.cpu().numpy())
plt.plot(x.data.cpu().numpy(), prediction.data.cpu().numpy(), 'r-' , lw = 5 )
plt.text( 0.5 , 0 , 'Loss=%.4f' % loss.item(), fontdict = { 'size' : 20 , 'color' : 'red' })
plt.pause( 0.1 )
plt.ioff()
plt.show()
|
以上这篇Pytorch 搭建分类回归神经网络并用GPU进行加速的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/baishuiniyaonulia/article/details/100030943