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)
也可以使用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);
