[人工知能入門] コードの実行には計算に時間がかかり、GPU を使用してネットワークをトレーニングし、Tensor の List 要素を Tensor、model.train() および model.eval() に変換します。
1. コード実行時間の計算
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) )
2. GPU を使用してネットワークをトレーニングする
PyTorch を使用して GPU を呼び出してネットワークをトレーニングするのは簡単で、モデルとデータを 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 秒かかりましたが、その効果は依然として非常に明白です。
3. 要素が Tensor である List は Tensor に変換されます
通常のリストを Tensor に変換するのは次のように簡単です。
a = [ 1 , 2 , 3 ]
b = torch. tensor( a)
ただし、テンソルを含む List の場合、上記の方法を使用するとエラーが報告されますが、 torch.stack
次のように変換できます。
a = torch. rand( ( 2 , 3 ) )
a_list = [ a for _ in range ( 3 ) ]
A = torch. stack( a_list)
4.model.train() と model.eval()
PyTorch は、トレーニング モードと評価 (推論) モードを切り替える 2 つの方法、model.train() と model.eval() を提供します。
一般的な使用法は、トレーニングの開始前にmodel.trian()を記述し、テスト中にmodel.eval()を記述します。
トレーニング プログラムの上に model.train() を追加して、 启用 batch normalization 和 dropout
BN レイヤーがデータの各バッチの平均と分散を使用できるようにし、Dropout が一部のネットワーク接続をランダムに無視してパラメーターをトレーニングおよび更新できるようにします。
model.eval() を推論プログラムの上に追加して、 不启用 Batch Normalization 和 Dropout
BN 層の平均と分散が変更されずドロップアウトが失敗することを確認します。つまり、すべてのネットワーク接続が利用され、ニューロンがランダムに破棄されないようにします。