pytorch張量的保存和恢復
tensor本身就是對象 如果想要保存和恢復對應的對象 使用 torch.save 和 torch.load即可
就像picke的load 和dump一樣
t2 = torch.randn([1024, 1024])
torch.save(t2, "t1.pth")
t2l = torch.load(t2, "t1.pth")
當然save和load 還涉及到具體的設備 比如在GPU上的變量被保存時應該怎麼恢復到CPU上 存在這個問題
這需要使用torch.load 中的 map_location 參數
具體看這裏 torch.load 的設備映射參數
pytorch中的nn.Module 和nn.Sequencal 扮演了什麼角色
模型本質上是一堆的tensor組成的計算圖。 nn.Module其實就是一個外殼 在文檔中被稱之爲
Containers
把模型包括的一些作爲參數的張量和張量之間的聯繫關係記錄下來。之後可以一併返回給優化器。或者在保存的時候作爲一個整體被保存到硬盤上。
對於nn.Module() 創建的對象是一個callable 對象本質上是一個 函數
net = MyModule() # MyModule() extends from nn.Module
output = net(input) # 其實調用給的是MyModule中的 forward()
pytorch模型的保存和恢復
-
最原始的方式是直接將Module整體 torch.save(nn.Module())
-
獲取nn.Module 的state_dict 然後只使用torch.save保存state_dict 這樣不保存模型結構 這樣會比較省時間和空間 但是回覆的時候 必須要有先創建之前的模型的結構 將使用torch.load() 載入的state_dict 載入到對應的 Module中即可 這種適用於訓練過程中保存模型的需求
pytorch中的優化器相關
對於計算圖中的每個tensor 可以從loss標量開始 使用loss.backward()計算出對應的每個tensor的 梯度 也就是 tensor.grad
創建一個優化器其時 傳入的參數是 Module的 參數
# 將net1的參數傳入到 SGD 優化器中
optimizer = torch.optim.SGD(net1.parameters(), lr=0.5)
# ....此處循環進行進行
optimizer.zero_grad() # 將優化器控制的網絡參數的梯度清零
loss.backward() # 反向傳播計算給每個對應的tensor生成梯度
optimizer.step() # step 就是根據learning rate 和backward 生成的參數 來更新tensor的值
pytorch中的損失函數
損失函數的調用舉例
loss = nn.CrossEntropyLoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.empty(3, dtype=torch.long).random_(5)
output = loss(input, target)
output.backward()
從上面的例子中可以看到 nn.CrossEntropyLoss 這個類創建了對象以後直接把對象當做函數用 這樣看起來有一點奇怪 但是實際上是 在python中函數本身就是實現了 __call__()
方法的對象 所以其實是 在nn.CrossEntropyLoss的類方法__call__()
中實現了計算交叉熵的邏輯
pytorch中的內置函數
pytorch的內置函數 比如 nn.Relu() nn.Linear() 等 和上面的交叉熵類似 本質上是類 實際上可以看做是一個可以定製化的函數 可以把一些參數 在創建具體對象的時候就像構造偏函數一樣傳入部分參數 數據當做最終的參數傳入
下面是第一次用markdown寫博客的測試 請忽略