Skip to content

Commit 996a53b

Browse files
committed
Update pytorch.10
Finish linear regression Finish logistic regression Finish neural network
1 parent 5e7cf32 commit 996a53b

File tree

5 files changed

+95
-110
lines changed

5 files changed

+95
-110
lines changed

01-Linear Regression/Linear_Regression.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
__author__ = 'SherlockLiao'
1+
# encoding: utf-8
2+
"""
3+
@author: liaoxingyu
4+
@contact: sherlockliao01@gmail.com
5+
"""
26

7+
import matplotlib.pyplot as plt
8+
import numpy as np
39
import torch
4-
from torch import nn, optim
10+
from torch import nn
511
from torch.autograd import Variable
6-
import numpy as np
7-
import matplotlib.pyplot as plt
812

913
x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],
1014
[9.779], [6.182], [7.59], [2.167], [7.042],
@@ -21,26 +25,26 @@
2125

2226

2327
# Linear Regression Model
24-
class LinearRegression(nn.Module):
28+
class linearRegression(nn.Module):
2529
def __init__(self):
26-
super(LinearRegression, self).__init__()
30+
super(linearRegression, self).__init__()
2731
self.linear = nn.Linear(1, 1) # input and output is 1 dimension
2832

2933
def forward(self, x):
3034
out = self.linear(x)
3135
return out
3236

3337

34-
model = LinearRegression()
38+
model = linearRegression()
3539
# 定义loss和优化函数
3640
criterion = nn.MSELoss()
37-
optimizer = optim.SGD(model.parameters(), lr=1e-4)
41+
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)
3842

3943
# 开始训练
4044
num_epochs = 1000
4145
for epoch in range(num_epochs):
42-
inputs = Variable(x_train)
43-
target = Variable(y_train)
46+
inputs = x_train
47+
target = y_train
4448

4549
# forward
4650
out = model(inputs)
@@ -51,12 +55,14 @@ def forward(self, x):
5155
optimizer.step()
5256

5357
if (epoch+1) % 20 == 0:
54-
print('Epoch[{}/{}], loss: {:.6f}'
55-
.format(epoch+1, num_epochs, loss.data[0]))
58+
print(f'Epoch[{epoch+1}/{num_epochs}], loss: {loss.item():.6f}')
5659

5760
model.eval()
58-
predict = model(Variable(x_train))
61+
with torch.no_grad():
62+
predict = model(x_train)
5963
predict = predict.data.numpy()
64+
65+
fig = plt.figure(figsize=(10, 5))
6066
plt.plot(x_train.numpy(), y_train.numpy(), 'ro', label='Original data')
6167
plt.plot(x_train.numpy(), predict, label='Fitting Line')
6268
# 显示图例
Lines changed: 39 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,105 +1,96 @@
1-
__author__ = 'SherlockLiao'
1+
# encoding: utf-8
2+
"""
3+
@author: liaoxingyu
4+
@contact: sherlockliao01@gmail.com
5+
"""
6+
7+
8+
import time
29

310
import torch
4-
from torch import nn, optim
511
import torch.nn.functional as F
6-
from torch.autograd import Variable
12+
from torch import nn
713
from torch.utils.data import DataLoader
8-
from torchvision import transforms
9-
from torchvision import datasets
10-
import time
14+
from torchvision import datasets, transforms
15+
1116
# 定义超参数
12-
batch_size = 32
17+
batch_size = 64
1318
learning_rate = 1e-3
14-
num_epoches = 100
19+
num_epochs = 100
1520

1621
# 下载训练集 MNIST 手写数字训练集
17-
train_dataset = datasets.MNIST(
18-
root='./data', train=True, transform=transforms.ToTensor(), download=True)
22+
train_dataset = datasets.FashionMNIST(
23+
root='../datasets', train=True, transform=transforms.ToTensor(), download=True)
1924

20-
test_dataset = datasets.MNIST(
21-
root='./data', train=False, transform=transforms.ToTensor())
25+
test_dataset = datasets.FashionMNIST(
26+
root='../datasets', train=False, transform=transforms.ToTensor())
2227

2328
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
2429
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
2530

26-
2731
# 定义 Logistic Regression 模型
28-
class Logstic_Regression(nn.Module):
32+
class logsticRegression(nn.Module):
2933
def __init__(self, in_dim, n_class):
30-
super(Logstic_Regression, self).__init__()
34+
super(logsticRegression, self).__init__()
3135
self.logstic = nn.Linear(in_dim, n_class)
3236

3337
def forward(self, x):
3438
out = self.logstic(x)
3539
return out
3640

37-
38-
model = Logstic_Regression(28 * 28, 10) # 图片大小是28x28
41+
model = logsticRegression(28 * 28, 10) # 图片大小是28x28
3942
use_gpu = torch.cuda.is_available() # 判断是否有GPU加速
4043
if use_gpu:
4144
model = model.cuda()
4245
# 定义loss和optimizer
4346
criterion = nn.CrossEntropyLoss()
44-
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
47+
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
4548

4649
# 开始训练
47-
for epoch in range(num_epoches):
50+
for epoch in range(num_epochs):
4851
print('*' * 10)
49-
print('epoch {}'.format(epoch + 1))
52+
print(f'epoch {epoch+1}')
5053
since = time.time()
5154
running_loss = 0.0
5255
running_acc = 0.0
56+
model.train()
5357
for i, data in enumerate(train_loader, 1):
5458
img, label = data
5559
img = img.view(img.size(0), -1) # 将图片展开成 28x28
5660
if use_gpu:
57-
img = Variable(img).cuda()
58-
label = Variable(label).cuda()
59-
else:
60-
img = Variable(img)
61-
label = Variable(label)
61+
img = img.cuda()
62+
label = label.cuda()
6263
# 向前传播
6364
out = model(img)
6465
loss = criterion(out, label)
65-
running_loss += loss.data[0] * label.size(0)
66+
running_loss += loss.item()
6667
_, pred = torch.max(out, 1)
67-
num_correct = (pred == label).sum()
68-
running_acc += num_correct.data[0]
68+
running_acc += (pred==label).float().mean()
6969
# 向后传播
7070
optimizer.zero_grad()
7171
loss.backward()
7272
optimizer.step()
7373

7474
if i % 300 == 0:
75-
print('[{}/{}] Loss: {:.6f}, Acc: {:.6f}'.format(
76-
epoch + 1, num_epoches, running_loss / (batch_size * i),
77-
running_acc / (batch_size * i)))
78-
print('Finish {} epoch, Loss: {:.6f}, Acc: {:.6f}'.format(
79-
epoch + 1, running_loss / (len(train_dataset)), running_acc / (len(
80-
train_dataset))))
75+
print(f'[{epoch+1}/{num_epochs}] Loss: {running_loss/i:.6f}, Acc: {running_acc/i:.6f}')
76+
print(f'Finish {epoch+1} epoch, Loss: {running_loss/i:.6f}, Acc: {running_acc/i:.6f}')
8177
model.eval()
8278
eval_loss = 0.
8379
eval_acc = 0.
8480
for data in test_loader:
8581
img, label = data
8682
img = img.view(img.size(0), -1)
8783
if use_gpu:
88-
img = Variable(img, volatile=True).cuda()
89-
label = Variable(label, volatile=True).cuda()
90-
else:
91-
img = Variable(img, volatile=True)
92-
label = Variable(label, volatile=True)
93-
out = model(img)
94-
loss = criterion(out, label)
95-
eval_loss += loss.data[0] * label.size(0)
84+
img = img.cuda()
85+
label = label.cuda()
86+
with torch.no_grad():
87+
out = model(img)
88+
loss = criterion(out, label)
89+
eval_loss += loss.item()
9690
_, pred = torch.max(out, 1)
97-
num_correct = (pred == label).sum()
98-
eval_acc += num_correct.data[0]
99-
print('Test Loss: {:.6f}, Acc: {:.6f}'.format(eval_loss / (len(
100-
test_dataset)), eval_acc / (len(test_dataset))))
101-
print('Time:{:.1f} s'.format(time.time() - since))
102-
print()
91+
eval_acc += (pred == label).float().mean()
92+
print(f'Test Loss: {eval_loss/len(test_loader):.6f}, Acc: {eval_acc/len(test_loader):.6f}')
93+
print(f'Time:{(time.time()-since):.1f} s')
10394

10495
# 保存模型
10596
torch.save(model.state_dict(), './logstic.pth')

03-Neural Network/neural_network.py

Lines changed: 32 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,30 @@
44
"""
55

66
import torch
7-
from torch import nn, optim
8-
7+
from torch import nn
98
from torch.utils.data import DataLoader
10-
from torchvision import transforms
11-
from torchvision import datasets
9+
from torchvision import datasets, transforms
1210

13-
batch_size = 32
11+
batch_size = 64
1412
learning_rate = 1e-2
15-
num_epoches = 50
13+
num_epochs = 50
14+
use_gpu = torch.cuda.is_available()
1615

1716
# 下载训练集 MNIST 手写数字训练集
18-
train_dataset = datasets.MNIST(
19-
root='./data', train=True, transform=transforms.ToTensor(), download=True)
17+
train_dataset = datasets.FashionMNIST(
18+
root='../datasets', train=True, transform=transforms.ToTensor(), download=True)
2019

21-
test_dataset = datasets.MNIST(
22-
root='./data', train=False, transform=transforms.ToTensor())
20+
test_dataset = datasets.FashionMNIST(
21+
root='../datasets', train=False, transform=transforms.ToTensor())
2322

2423
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
2524
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
2625

2726

2827
# 定义简单的前馈神经网络
29-
class Neuralnetwork(nn.Module):
28+
class neuralNetwork(nn.Module):
3029
def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
31-
super(Neuralnetwork, self).__init__()
30+
super(neuralNetwork, self).__init__()
3231
self.layer1 = nn.Sequential(
3332
nn.Linear(in_dim, n_hidden_1),
3433
nn.ReLU(True))
@@ -45,68 +44,54 @@ def forward(self, x):
4544
x = self.layer3(x)
4645
return x
4746

48-
49-
model = Neuralnetwork(28 * 28, 300, 100, 10)
50-
if torch.cuda.is_available():
47+
model = neuralNetwork(28 * 28, 300, 100, 10)
48+
if use_gpu:
5149
model = model.cuda()
5250

5351
criterion = nn.CrossEntropyLoss()
54-
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
52+
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
5553

56-
for epoch in range(num_epoches):
57-
print('epoch {}'.format(epoch + 1))
54+
for epoch in range(num_epochs):
5855
print('*' * 10)
56+
print(f'epoch {epoch+1}')
5957
running_loss = 0.0
6058
running_acc = 0.0
6159
for i, data in enumerate(train_loader, 1):
6260
img, label = data
6361
img = img.view(img.size(0), -1)
64-
if torch.cuda.is_available():
65-
img = Variable(img).cuda()
66-
label = Variable(label).cuda()
67-
else:
68-
img = Variable(img)
69-
label = Variable(label)
62+
if use_gpu:
63+
img = img.cuda()
64+
label = label.cuda()
7065
# 向前传播
7166
out = model(img)
7267
loss = criterion(out, label)
73-
running_loss += loss.data[0] * label.size(0)
68+
running_loss += loss.item()
7469
_, pred = torch.max(out, 1)
75-
num_correct = (pred == label).sum()
76-
running_acc += num_correct.data[0]
70+
running_acc += (pred == label).float().mean()
7771
# 向后传播
7872
optimizer.zero_grad()
7973
loss.backward()
8074
optimizer.step()
8175

8276
if i % 300 == 0:
83-
print('[{}/{}] Loss: {:.6f}, Acc: {:.6f}'.format(
84-
epoch + 1, num_epoches, running_loss / (batch_size * i),
85-
running_acc / (batch_size * i)))
86-
print('Finish {} epoch, Loss: {:.6f}, Acc: {:.6f}'.format(
87-
epoch + 1, running_loss / (len(train_dataset)), running_acc / (len(
88-
train_dataset))))
77+
print(f'[{epoch+1}/{num_epochs}] Loss: {running_loss/i:.6f}, Acc: {running_acc/i:.6f}')
78+
print(f'Finish {epoch+1} epoch, Loss: {running_loss/i:.6f}, Acc: {running_acc/i:.6f}')
8979
model.eval()
9080
eval_loss = 0.
9181
eval_acc = 0.
9282
for data in test_loader:
9383
img, label = data
9484
img = img.view(img.size(0), -1)
95-
if torch.cuda.is_available():
96-
img = Variable(img, volatile=True).cuda()
97-
label = Variable(label, volatile=True).cuda()
98-
else:
99-
img = Variable(img, volatile=True)
100-
label = Variable(label, volatile=True)
101-
out = model(img)
102-
loss = criterion(out, label)
103-
eval_loss += loss.data[0] * label.size(0)
85+
if use_gpu:
86+
img = img.cuda()
87+
label = label.cuda()
88+
with torch.no_grad():
89+
out = model(img)
90+
loss = criterion(out, label)
91+
eval_loss += loss.item()
10492
_, pred = torch.max(out, 1)
105-
num_correct = (pred == label).sum()
106-
eval_acc += num_correct.data[0]
107-
print('Test Loss: {:.6f}, Acc: {:.6f}'.format(eval_loss / (len(
108-
test_dataset)), eval_acc / (len(test_dataset))))
109-
print()
93+
eval_acc += (pred == label).float().mean()
94+
print(f'Test Loss: {eval_loss/len(test_loader):.6f}, Acc: {eval_acc/len(test_loader):.6f}\n')
11095

11196
# 保存模型
11297
torch.save(model.state_dict(), './neural_network.pth')

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# pytorch-beginner
2-
toy code for pytorch beginner
2+
Toy project for pytorch beginner with simplest code.
33

4-
**Welcome to visit this [site](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch) to get more detailed chinese pytorch tutorial.**
4+
## Requirements
5+
python 3.7
6+
pytorch 1.0.0+

datasets

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../datasets/

0 commit comments

Comments
 (0)