import torch
import torch. nn as nn
import torchvision
import torchvision. transforms as transforms
import time
device = torch. device( 'cuda' if torch. cuda. is_available( ) else 'cpu' )
num_epochs = 10
num_classes = 10
batch_size = 200
learning_rate = 0.001
train_dataset = torchvision. datasets. MNIST( root= '../../data' ,
train= True ,
transform= transforms. ToTensor( ) ,
download= True )
test_dataset = torchvision. datasets. MNIST( root= '../../data' ,
train= False ,
transform= transforms. ToTensor( ) )
train_loader = torch. utils. data. DataLoader( dataset= train_dataset,
batch_size= batch_size,
shuffle= True )
test_loader = torch. utils. data. DataLoader( dataset= test_dataset,
batch_size= batch_size,
shuffle= False )
class ConvNet ( nn. Module) :
def __init__ ( self, num_classes= 10 ) :
super ( ConvNet, self) . __init__( )
self. layer1 = nn. Sequential( nn. Conv2d( 1 , 16 , kernel_size= 5 , stride= 1 , padding= 2 ) ,
nn. BatchNorm2d( 16 ) ,
nn. ReLU( ) ,
nn. MaxPool2d( kernel_size= 2 , stride= 2 ) )
self. layer2 = nn. Sequential( nn. Conv2d( 16 , 32 , kernel_size= 5 , stride= 1 , padding= 2 ) ,
nn. BatchNorm2d( 32 ) ,
nn. ReLU( ) ,
nn. MaxPool2d( kernel_size= 2 , stride= 2 ) )
self. fc = nn. Linear( 7 * 7 * 32 , num_classes)
def forward ( self, x) :
out = self. layer1( x)
out = self. layer2( out)
out = out. reshape( out. size( 0 ) , - 1 )
out = self. fc( out)
return out
model = ConvNet( num_classes) . to( device)
criterion = nn. CrossEntropyLoss( )
optimizer = torch. optim. Adam( model. parameters( ) , lr= learning_rate)
start = time. time( )
total_step = len ( train_loader)
for epoch in range ( num_epochs) :
for i, ( images, labels) in enumerate ( train_loader) :
images = images. to( device)
labels = labels. to( device)
outputs = model( images)
loss = criterion( outputs, labels)
optimizer. zero_grad( )
loss. backward( )
optimizer. step( )
if ( i+ 1 ) % 100 == 0 :
print ( 'Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'
. format ( epoch+ 1 , num_epochs, i+ 1 , total_step, loss. item( ) ) )
Epoch [1/10], Step [100/300], Loss: 0.1235
Epoch [1/10], Step [200/300], Loss: 0.0800
Epoch [1/10], Step [300/300], Loss: 0.0638
Epoch [2/10], Step [100/300], Loss: 0.1008
Epoch [2/10], Step [200/300], Loss: 0.0510
Epoch [2/10], Step [300/300], Loss: 0.0924
Epoch [3/10], Step [100/300], Loss: 0.0230
Epoch [3/10], Step [200/300], Loss: 0.0456
Epoch [3/10], Step [300/300], Loss: 0.0413
Epoch [4/10], Step [100/300], Loss: 0.0509
Epoch [4/10], Step [200/300], Loss: 0.0124
Epoch [4/10], Step [300/300], Loss: 0.0416
Epoch [5/10], Step [100/300], Loss: 0.0698
Epoch [5/10], Step [200/300], Loss: 0.0155
Epoch [5/10], Step [300/300], Loss: 0.0185
Epoch [6/10], Step [100/300], Loss: 0.0094
Epoch [6/10], Step [200/300], Loss: 0.0239
Epoch [6/10], Step [300/300], Loss: 0.0536
Epoch [7/10], Step [100/300], Loss: 0.0165
Epoch [7/10], Step [200/300], Loss: 0.0144
Epoch [7/10], Step [300/300], Loss: 0.0044
Epoch [8/10], Step [100/300], Loss: 0.0099
Epoch [8/10], Step [200/300], Loss: 0.0128
Epoch [8/10], Step [300/300], Loss: 0.0436
Epoch [9/10], Step [100/300], Loss: 0.0312
Epoch [9/10], Step [200/300], Loss: 0.0062
Epoch [9/10], Step [300/300], Loss: 0.0445
Epoch [10/10], Step [100/300], Loss: 0.0209
Epoch [10/10], Step [200/300], Loss: 0.0025
Epoch [10/10], Step [300/300], Loss: 0.0048
end = time. time( )
print ( '用时:{}.' . format ( end- start) )
用时:52.60681462287903.
model. eval ( )
with torch. no_grad( ) :
correct = 0
total = 0
for images, labels in test_loader:
images = images. to( device)
labels = labels. to( device)
outputs = model( images)
_, predicted = torch. max ( outputs. data, 1 )
total += labels. size( 0 )
correct += ( labels== predicted) . sum ( ) . item( )
print ( 'Test accuracy of the model on the 10000 test images:{}%'
. format ( 100 * correct/ total) )
Test accuracy of the model on the 10000 test images:98.88%
torch. save( model. state_dict( ) , 'model.ckpt' )