【人工智能概论】 代码运行耗时计算、使用GPU训练网络、元素是Tensor的List转化成Tensor、model.train()与model.eval()
一. 代码运行耗时计算
import time
import math
def time_duration ( start) :
s = time. time( ) - start
m = math. floor( s/ 60 )
s -= m * 60
return '%d分%d秒' % ( m, s)
start = time. time( )
print ( "hello world" )
print ( '本轮训练时长:' , time_duration( start) )
二. 使用GPU训练网络
利用PyTorch调用GPU训练网络是间容易的事,只需要把模型(model)、数据(data)送入到GPU中即可。 代码举例:
model = Net( )
device = torch. device( "cuda:0" if torch. cuda. is_available( ) else "cpu" )
model. to( device)
for data in train_dataloader:
inputs, target = data
inputs, target = inputs. to( device) , target. to( device)
实操下来,训练某个网络160轮,用CPU耗时20分29秒,用GPU耗时3分56秒,可见效果还是十分明显的。
三. 元素是Tensor的List转化成Tensor
a = [ 1 , 2 , 3 ]
b = torch. tensor( a)
但对于包含了tensor的List,还用以上的办法就会报错,可以通过torch.stack
进行转换,如下。
a = torch. rand( ( 2 , 3 ) )
a_list = [ a for _ in range ( 3 ) ]
A = torch. stack( a_list)
四. model.train()与model.eval()
PyTorch提供了两种方式来切换训练和评估(推断)模式,分别是:model.train() 和 model.eval()。 一般用法是:在训练开始之前写上model.trian() ,在测试时写上model.eval() 。 在训练程序上方添加model.train(),作用是启用 batch normalization 和 dropout
,以保证BN层能够用到每一批数据的均值和方差,Dropout能随机忽略一部分网络连接来训练更新参数。 在推断程序上方添加model.eval() ,作用是不启用 Batch Normalization 和 Dropout
,以保证BN层的均值和方差不变,Dropout失效,即利用到所有网络连接,不进行随机舍弃神经元。