手写数字识别,计算机视觉领域的Hello World 利用MNIST数据集,55000训练集,5000验证集。 Pytorch实现神经网络手写数字识别 感知机与神经元、权重和偏置、神经网络、输入层、隐藏层、输出层 mac gpu的使用 本节就是对Pytorch可以做的事情有个直观的理解,先理解表面,把大概知识打通,然后再研究细节的东西   
import  torch
import  torch. nn as  nn
import  torchvision
import  torchvision. transforms as  transforms
import  torch. optim as  optim
  
if  not  torch. backends. mps. is_available( ) : if  not  torch. backends. mps. is_built( ) : print ( "MPS not available because the current PyTorch install was not " "built with MPS enabled." ) else : print ( "MPS not available because the current MacOS version is not 12.3+ " "and/or you do not have an MPS-enabled device on this machine." ) 
else : device =  torch. device( "mps" ) 
  
class  Net ( nn. Module) : def  __init__ ( self) : super ( ) . __init__( ) self. fcl =  nn. Linear( 784 , 100 ) self. fc2 =  nn. Linear( 100 , 10 ) def  forward ( self, x) : x =  torch. flatten( x, start_dim =  1 ) x =  torch. relu( self. fcl( x) ) x =  self. fc2( x) return  x
  
max_epochs =  5 
batch_size =  16 
transform =  transforms. Compose( [ transforms. ToTensor( ) ] ) 
trainset =  torchvision. datasets. MNIST( root= './data' , train= True , download= True , transform= transform) 
train_loader =  torch. utils. data. DataLoader( trainset, batch_size= batch_size, shuffle= True ) 
testset =  torchvision. datasets. MNIST( root= './data' , train= False , download= True , transform= transform) 
test_loader =  torch. utils. data. DataLoader( testset, batch_size= batch_size, shuffle= True ) 
  
net =  Net( ) 
net. to( device) 
loss =  nn. CrossEntropyLoss( ) 
optimizer =  optim. SGD( net. parameters( ) , lr= 0.0001 ) def  train ( ) : acc_num= 0 for  epoch in  range ( max_epochs) : for  i, ( data, label)  in  enumerate ( train_loader) : data =  data. to( device) label =  label. to( device) optimizer. zero_grad( ) output =  net( data) Loss =  loss( output, label) Loss. backward( ) optimizer. step( ) pred_class =  torch. max ( output, dim= 1 ) [ 1 ] acc_num +=  torch. eq( pred_class, label. to( device) ) . sum ( ) . item( ) train_acc =  acc_num /  len ( trainset) net. eval ( ) acc_num =  0.0 best_acc =  0 with  torch. no_grad( ) : for  val_data in  test_loader: val_image, val_label =  val_dataoutput =  net( val_image. to( device) ) predict_y =  torch. max ( output ,  dim= 1 ) [ 1 ] acc_num +=  torch. eq( predict_y, val_label. to( device) ) . sum ( ) . item( ) val_acc =  acc_num/ len ( testset) print ( train_acc, val_acc) if  val_acc >  best_acc: torch. save( net. state_dict( ) , './minst.pth' ) best_acc =  val_accacc_num =  0 train_acc =  0 test_acc =  0 print ( 'done' ) train( ) 
  
0.1348 0.3007
done
0.4361 0.5548
done
0.5870666666666666 0.6335
done
0.6435333333333333 0.672
done
0.67915 0.7011
done