使用pytorch实现LeNet
import torch
import torch. nn as nn
import torch. nn. functional as F
"""
神经网络的典型训练过程如下:
定义包含一些可学习的参数(或者叫权重)神经网络模型;
在数据集上迭代;
通过神经网络处理输入;
计算损失(输出结果和正确值的差值大小);
将梯度反向传播回网络的参数;
更新网络的参数,主要使用如下简单的更新原则: weight = weight - learning_rate * gradient
"""
class Net ( nn. Module) :
def __init__ ( self) :
super ( Net, self) . __init__( )
self. conv1 = nn. Conv2d( 3 , 6 , 5 )
self. conv2 = nn. Conv2d( 6 , 16 , 5 )
self. fc1 = nn. Linear( 16 * 5 * 5 , 120 )
self. fc2 = nn. Linear( 120 , 84 )
self. fc3 = nn. Linear( 84 , 10 )
def forward ( self, x) :
x = F. max_pool2d( F. relu( self. conv1( x) ) , ( 2 , 2 ) )
x = F. max_pool2d( F. relu( self. conv2( x) ) , 2 )
x = x. view( - 1 , 16 * 5 * 5 )
x = F. relu( self. fc1( x) )
x = F. relu( self. fc2( x) )
x = self. fc3( x)
return x
"""
``torch.nn`` 只支持小批量输入。整个 ``torch.nn`` 包都只支持小批量样本,
而不支持单个样本。 例如,``nn.Conv2d`` 接受一个4维的张量, ``每一维分别是
sSamples * nChannels * Height * Width(样本数*通道数*高*宽)``。 如果你
有单个样本,只需使用 ``input.unsqueeze(0)`` 来添加其它的维数
"""
net = Net( )
print ( net)
params = list ( net. parameters( ) )
print ( len ( params) )
print ( params[ 0 ] . size( ) )
input = torch. randn( 1 , 1 , 32 , 32 )
out = net( input )
print ( out)
net. zero_grad( )
out. backward( torch. randn( 1 , 10 ) )
criterion = nn. MSELoss( )
target = torch. randn( 10 )
target = target. view( 1 , - 1 )
output = net( input )
loss = criterion( output, target)
print ( loss)
net. zero_grad( )
print ( 'conv1.bias.grad before backward' )
print ( net. conv1. bias. grad)
loss. backward( )
print ( 'conv1.bias.grad after backward' )
print ( net. conv1. bias. grad)
import torch. optim as optim
optimizer = optim. SGD( net. parameters( ) , lr= 0.01 )
optimizer. zero_grad( )
output = net( input )
loss = criterion( output, target)
loss. backward( )
optimizer. step(
import torchvision
import torchvision. transforms as transforms
transform = transforms. Compose(
[ transforms. ToTensor( ) ,
transforms. Normalize( ( 0.5 , 0.5 , 0.5 ) , ( 0.5 , 0.5 , 0.5 ) ) ] )
trainset = cifar( root = './input/cifar10' , segmentation= 'train' , transforms= transform)
testset = cifar( root = './input/cifar10' , segmentation= 'test' , transforms= transform)
trainloader = torch. utils. data. DataLoader( trainset, batch_size= batch_size, shuffle= True , num_workers= 2 )
testloader = torch. utils. data. DataLoader( testset, batch_size= batch_size, shuffle= False , num_workers= 2 )
classes = ( 'plane' , 'car' , 'bird' , 'cat' ,
'deer' , 'dog' , 'frog' , 'horse' , 'ship' , 'truck' )
net2 = Net( )
criterion2 = nn. CrossEntropyLoss( )
optimizer2 = optim. SGD( net2. parameters( ) , lr= 0.001 , momentum= 0.9 )
for epoch in range ( 2 ) :
running_loss = 0.0
for i, data in enumerate ( trainloader, 0 ) :
inputs, labels = data
optimizer2. zero_grad( )
outputs = net2( inputs)
loss = criterion2( outputs, labels)
loss. backward( )
optimizer2. step( )
running_loss += loss. item( )
if i % 2000 == 1999 :
print ( '[%d, %5d] loss: %.3f' %
( epoch + 1 , i + 1 , running_loss / 2000 ) )
running_loss = 0.0
print ( 'Finished Training' )