[PyTorch]PyTorch/python常用語法/常見坑點


1. make_grid()

2. join與os.path.join()

1.join()函數

語法:‘sep’.join(seq)

參數說明:

sep:分隔符。可以為空

seq:要連接的元素序列、字符串、元組、字典等

上面的語法即:以sep作為分隔符,將seq所有的元素合並成一個新的字符串

返回值:返回一個以分隔符sep連接各個元素后生成的字符串

2、os.path.join()函數

語法:  os.path.join(path1[,path2[,......]])

返回值:將多個路徑組合后返回

注:第一個絕對路徑之前的參數將被忽略

3. 讀文件寫文件

https://www.cnblogs.com/ymjyqsx/p/6554817.html

4. json操作

詳細內容1
詳細內容2)
json.dumps 將 Python 對象編碼成 JSON 字符串
json.loads 將已編碼的 JSON 字符串解碼為 Python 對象
引入json

import json

常用有2個方法,也是最基本的使用方法:
1、dumps:把字典轉成json字符串
2、loads:把json字符串轉成字典

#coding:utf-8
import json
 
test_dict = {'a':1, 'b':2}
 
#把字典轉成json字符串
json_text = json.dumps(test_dict)
print(json_text)
 
#把json字符串轉成字典
json_dict = json.loads(json_text)
print(json_dict)

當然,我寫的例子所使用的字典也比較簡單。大家可以嘗試擬一個復雜的,包含數組的字典。

若你嘗試使用dir方法看json模塊有什么方法時,會發現還有load、dump方法。這兩個方法和上面兩個方法少了一個字母s。
這兩個方法是為了讀寫json文件提供的便捷方法。舉個栗子,json字符串可以保存到文本文件。若只是使用loads和dumps,代碼如下所示。
注意:以下代碼涉及到utf-8文件讀寫,可以參考我前面的文章:Python讀寫utf-8的文本文件
1、把字典轉成json字符串,並保存到文件中

#coding:utf-8
import json
import codecs
 
test_dict = {'a':1, 'b':2}
 
#把字典轉成json字符串
json_text = json.dumps(test_dict)
 
#把json字符串保存到文件
#因為可能json有unicode編碼,最好用codecs保存utf-8文件
with codecs.open('1.json', 'w', 'utf-8') as f:
    f.write(json_text)

2、從json文件中讀取到字典中

#coding:utf-8
import json
import codecs
 
#從文件中讀取內容
with codecs.open('1.json', 'r', 'utf-8') as f:
    json_text = f.read()
 
#把字符串轉成字典
json_dict = json.loads(json_text)

上面代碼,我們可以用load和dump修改。
1、dump把字典轉成json字符串並寫入到文件

#coding:utf-8
import json
import codecs
 
test_dict = {'a':1, 'b':2}
 
#把字典轉成json字符串並寫入到文件
with codecs.open('1.json', 'w', 'utf-8') as f:
    json.dump(test_dict, f)

2、load從json文件讀取json字符串到字典

#coding:utf-8
import json
import codecs
 
#從json文件讀取json字符串到字典
with codecs.open('1.json', 'r', 'utf-8') as f:
    json_dict = json.load(f)

這樣明顯省事很多。

最后,再說一個知識點。如何把json轉成有序的字典。
眾所周知,字典是無序的。所以json的loads方法轉換得來的字典本來就是無序的。
但出於某種需求,需要確保順序正常,按照原本json字符串的順序。
這個需要在解析的時候,把無序字典換成有序字典。如下代碼:

#coding:utf-8
from collections import OrderedDict
import json
 
json_text = '{ "b": 3, "a": 2, "c": 1}'
 
json_dict = json.loads(json_text)
print(u"轉成普通字典")
for key, value in json_dict.items():
    print("key:%s, value:%s" % (key, value))
    
json_dict = json.loads(json_text, object_pairs_hook=OrderedDict)
print(u"\n轉成有序字典")
for key, value in json_dict.items():
    print("key:%s, value:%s" % (key, value))

5. tensorboard使用

在使用GPU進行訓練的時候,要安裝tensorflow與tensorflow-gpu, 有的可能需cuda和cudnn不匹配,所以注意選好版本,安裝好可以開另一個terminal運行 tensorboard --logdir=日志地址相對路徑, 然后在本地游覽器輸入:服務器ip:6006即可

6. python shutil.move 移動文件


#復制文件:
shutil.copyfile("oldfile","newfile") #oldfile和newfile都只能是文件
shutil.copy("oldfile","newfile") #oldfile只能是文件夾,newfile可以是文件,也可以是目標目錄
 
#復制文件夾:
shutil.copytree("olddir","newdir") #olddir和newdir都只能是目錄,且newdir必須不存在
 
#重命名文件(目錄)
os.rename("oldname","newname") #文件或目錄都是使用這條命令
 
#移動文件(目錄)
shutil.move("oldpos","newpos") 
shutil.move("D:/知乎日報/latest/一張優惠券,換你的通訊錄信息,你願意嗎?.pdf", "D:/知乎日報/past/")

7. numpy.squeeze()函數

1)a表示輸入的數組;
2)axis用於指定需要刪除的維度,但是指定的維度必須為單維度,否則將會報錯;
3)axis的取值可為None 或 int 或 tuple of ints, 可選。若axis為空,則刪除所有單維度的條目;
4)返回值:數組
5) 不會修改原數組;

8. numpy中transpose和swapaxes

詳細
transpose()
這個函數如果括號內不帶參數,就相當於轉置,和.T效果一樣,而今天主要來講解其帶參數。
我們看如下一個numpy的數組:

arr=np.arange(16).reshape((2,2,4)) 
arr= 
array([[[ 0, 1, 2, 3], 
[ 4, 5, 6, 7]], 
[[ 8, 9, 10, 11], 
[12, 13, 14, 15]]])

那么有:

arr.transpose(2,1,0)
array([[[ 0,  8],
        [ 4, 12]],

       [[ 1,  9],
        [ 5, 13]],

       [[ 2, 10],
        [ 6, 14]],

       [[ 3, 11],
        [ 7, 15]]])

為什么會是這樣的結果呢,這是因為arr這個數組有三個維度,三個維度的編號對應為(0,1,2),比如這樣,我們需要拿到7這個數字,怎么辦,肯定需要些三個維度的值,7的第一個維度為0,第二個維度為1,第三個3,所以arr[0,1,3]則拿到了7

arr[0,1,3]  #結果就是7

這下應該懂了些吧,好,再回到transpose()這個函數,它里面就是維度的排序,比如我們后面寫的transpose(2,1,0),就是把之前第三個維度轉為第一個維度,之前的第二個維度不變,之前的第一個維度變為第三個維度,好那么我們繼續拿7這個值來說,之前的索引為[0,1,3],按照我們的轉換方法,把之前的第三維度變為第一維度,之前的第一維度變為第三維度,那么現在7的索引就是(3,1,0)
同理所有的數組內的數字都是這樣變得,這就是transpose()內參數的變化。
理解了上面,再來理解swapaxes()就很簡單了,swapaxes接受一對軸編號,其實這里我們叫一對維度編號更好吧,比如:

arr.swapaxes(2,1)  #就是將第三個維度和第二個維度交換
array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 8, 12],
        [ 9, 13],
        [10, 14],
        [11, 15]]])

還是那我們的數字7來說,之前的索引是(0,1,3),那么交換之后,就應該是(0,3,1) 多說一句,其實numpy高維數組的切片也是這樣選取維度的。 這就是transpose和swapaxes函數的講解了

9. inplace操作

in-place operation在pytorch中是指改變一個tensor的值的時候,不經過復制操作,而是直接在原來的內存上改變它的值。可以把它成為原地操作符。

在pytorch中經常加后綴“”來代表原地in-place operation,比如說.add() 或者.scatter()。python里面的+=,*=也是in-place operation。

ReLU函數有個inplace參數,如果設為True,它會把輸出直接覆蓋到輸入中,這樣可以節省內存/顯存。之所以可以覆蓋是因為在計算ReLU的反向傳播時,只需根據輸出就能夠推算出反向傳播的梯度。但是只有少數的autograd操作支持inplace操作(如variable.sigmoid_()),除非你明確地知道自己在做什么,否則一般不要使用inplace操作。

10. torch.nn.MaxUnpool2d()

class torch.nn.MaxUnpool2d(kernel_size, stride=None, padding=0)

Maxpool2d的逆過程,不過並不是完全的逆過程,因為在maxpool2d的過程中,一些最大值的已經丟失。 MaxUnpool2d的輸入是MaxPool2d的輸出,包括最大值的索引,並計算所有maxpool2d過程中非最大值被設置為零的部分的反向。

注意:
MaxPool2d可以將多個輸入大小映射到相同的輸出大小。因此,反演過程可能會變得模棱兩可。 為了適應這一點,可以在調用中將輸出大小(output_size)作為額外的參數傳入。具體用法,請參閱下面示例

參數:

kernel_size(int or tuple) - max pooling的窗口大小
stride(int or tuple, optional) - max pooling的窗口移動的步長。默認值是kernel_size
padding(int or tuple, optional) - 輸入的每一條邊補充0的層數
輸入:
input:需要轉換的tensor
indices:Maxpool1d的索引號
output_size:一個指定輸出大小的torch.Size

大小:
input: (N,C,H_in,W_in)
output:(N,C,H_out,W_out)

\[H{out}=(H{in}-1)stride[0]-2padding[0]+kernel_size[0] \]

\[W{out}=(W{in}-1)stride[1]-2padding[1]+kernel_size[1] \]

也可以使用output_size指定輸出的大小

>>> pool = nn.MaxPool2d(2, stride=2, return_indices=True)
>>> unpool = nn.MaxUnpool2d(2, stride=2)
>>> input = Variable(torch.Tensor([[[[ 1,  2,  3,  4],
    ...                                  [ 5,  6,  7,  8],
    ...                                  [ 9, 10, 11, 12],
    ...                                  [13, 14, 15, 16]]]]))
>>> output, indices = pool(input)
>>> unpool(output, indices)
    Variable containing:
    (0 ,0 ,.,.) =
       0   0   0   0
       0   6   0   8
       0   0   0   0
       0  14   0  16
    [torch.FloatTensor of size 1x1x4x4]

>>> # specify a different output size than input size
>>> unpool(output, indices, output_size=torch.Size([1, 1, 5, 5]))
    Variable containing:
    (0 ,0 ,.,.) =
       0   0   0   0   0
       6   0   8   0   0
       0   0   0  14   0
      16   0   0   0   0
       0   0   0   0   0
    [torch.FloatTensor of size 1x1x5x5]

11. pytorch learning rate decay

本文主要是介紹在pytorch中如何使用learning rate decay.
先上代碼:

def adjust_learning_rate(optimizer, decay_rate=.9):
    for param_group in optimizer.param_groups:
        param_group['lr'] = param_group['lr'] * decay_rate

什么是param_groups?
optimizer通過param_group來管理參數組.param_group中保存了參數組及其對應的學習率,動量等等.所以我們可以通過更改param_group['lr']的值來更改對應參數組的學習率.

# 有兩個`param_group`即,len(optim.param_groups)==2
optim.SGD([
                {'params': model.base.parameters()},
                {'params': model.classifier.parameters(), 'lr': 1e-3}
            ], lr=1e-2, momentum=0.9)

#一個參數組
optim.SGD(model.parameters(), lr=1e-2, momentum=.9)

12. os.walk

1.載入
要使用os.walk,首先要載入該函數
可以使用以下兩種方法

  • import os
  • from os import walk

2.使用
os.walk的函數聲明為:
walk(top, topdown=True, onerror=None, followlinks=False)
參數

  • top 是你所要便利的目錄的地址
  • topdown 為真,則優先遍歷top目錄,否則優先遍歷top的子目錄(默認為開啟)
  • onerror 需要一個 callable 對象,當walk需要異常時,會調用
  • followlinks 如果為真,則會遍歷目錄下的快捷方式(linux 下是 symbolic link)實際所指的目錄(默認關閉)

os.walk 的返回值是一個生成器(generator),也就是說我們需要不斷的遍歷它,來獲得所有的內容。
每次遍歷的對象都是返回的是一個三元組(root,dirs,files)

  • root 所指的是當前正在遍歷的這個文件夾的本身的地址
  • dirs 是一個 list ,內容是該文件夾中所有的目錄的名字(不包括子目錄)
  • files 同樣是 list , 內容是該文件夾中所有的文件(不包括子目錄)

如果topdown 參數為真,walk 會遍歷top文件夾,與top文件夾中每一個子目錄。
常用用法:

def get_files(mydir):
    res = []
    for root, dirs, files in os.walk(mydir, followlinks=True):
        for f in files:
            if f.endswith(".jpg") or f.endswith(".png") or f.endswith(".jpeg") or f.endswith(".JPG"):
                res.append(os.path.join(root, f))
    return res

13. replace

語法:
str.replace(old, new[, max])

參數

  • old – 這是要進行更換的舊子串。
  • new – 這是新的子串,將取代舊的子字符串(子串可以為空)。
  • max – 如果這個可選參數max值給出,僅第一計數出現被替換。
    返回值
    此方法返回字符串的拷貝與舊子串出現的所有被新的所取代。如果可選參數最大值給定,只有第一個計數發生替換。
str = "this is string example....wow!!! this is really string";
print str.replace("is", "was");
print str.replace("is", "was", 3);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM