pytorch小問題

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模型的保存和恢復

  1. 最原始的方式是直接將Module整體 torch.save(nn.Module())

  2. 獲取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寫博客的測試 請忽略
Jα(x)=m=0(1)mm!Γ(m+α+1)(x2)2m+α,行內公式示例 J_\alpha(x) = \sum_{m=0}^\infty \frac{(-1)^m}{m! \Gamma (m + \alpha + 1)} {\left({ \frac{x}{2} }\right)}^{2m + \alpha} \text {,行內公式示例}

薪水

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章