4
4
"""
5
5
6
6
import torch
7
- from torch import nn , optim
8
-
7
+ from torch import nn
9
8
from torch .utils .data import DataLoader
10
- from torchvision import transforms
11
- from torchvision import datasets
9
+ from torchvision import datasets , transforms
12
10
13
- batch_size = 32
11
+ batch_size = 64
14
12
learning_rate = 1e-2
15
- num_epoches = 50
13
+ num_epochs = 50
14
+ use_gpu = torch .cuda .is_available ()
16
15
17
16
# 下载训练集 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 )
20
19
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 ())
23
22
24
23
train_loader = DataLoader (train_dataset , batch_size = batch_size , shuffle = True )
25
24
test_loader = DataLoader (test_dataset , batch_size = batch_size , shuffle = False )
26
25
27
26
28
27
# 定义简单的前馈神经网络
29
- class Neuralnetwork (nn .Module ):
28
+ class neuralNetwork (nn .Module ):
30
29
def __init__ (self , in_dim , n_hidden_1 , n_hidden_2 , out_dim ):
31
- super (Neuralnetwork , self ).__init__ ()
30
+ super (neuralNetwork , self ).__init__ ()
32
31
self .layer1 = nn .Sequential (
33
32
nn .Linear (in_dim , n_hidden_1 ),
34
33
nn .ReLU (True ))
@@ -45,68 +44,54 @@ def forward(self, x):
45
44
x = self .layer3 (x )
46
45
return x
47
46
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 :
51
49
model = model .cuda ()
52
50
53
51
criterion = nn .CrossEntropyLoss ()
54
- optimizer = optim .SGD (model .parameters (), lr = learning_rate )
52
+ optimizer = torch . optim .SGD (model .parameters (), lr = learning_rate )
55
53
56
- for epoch in range (num_epoches ):
57
- print ('epoch {}' .format (epoch + 1 ))
54
+ for epoch in range (num_epochs ):
58
55
print ('*' * 10 )
56
+ print (f'epoch { epoch + 1 } ' )
59
57
running_loss = 0.0
60
58
running_acc = 0.0
61
59
for i , data in enumerate (train_loader , 1 ):
62
60
img , label = data
63
61
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 ()
70
65
# 向前传播
71
66
out = model (img )
72
67
loss = criterion (out , label )
73
- running_loss += loss .data [ 0 ] * label . size ( 0 )
68
+ running_loss += loss .item ( )
74
69
_ , 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 ()
77
71
# 向后传播
78
72
optimizer .zero_grad ()
79
73
loss .backward ()
80
74
optimizer .step ()
81
75
82
76
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} ' )
89
79
model .eval ()
90
80
eval_loss = 0.
91
81
eval_acc = 0.
92
82
for data in test_loader :
93
83
img , label = data
94
84
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 ()
104
92
_ , 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 ' )
110
95
111
96
# 保存模型
112
97
torch .save (model .state_dict (), './neural_network.pth' )
0 commit comments