學習pytorch路程之動手學深度學習-3.4-3.7
置信度、置信區間參考:https://cloud.tencent.com/developer/news/452418 本人感覺還是挺好理解的
交叉熵參考博客:https://www.cnblogs.com/kyrieng/p/8694705.html https://blog.csdn.net/tsyccnh/article/details/79163834 個人感覺還不錯,好理解
(這段瞅瞅就行了)torchvision包,服務於PyTorch深度學習框架的,用於構建計算機視覺模型,主要構成有:
torchvision.datasets:加載數據的函數及常用的數據集接口
torchvision.mdoels:包含常用的模型結構(含預訓練模型),例如AlexNet、VGG、ResNet等
torchvision.transforms:常用的圖片變換,例如裁剪、旋轉等
torchvision.utils:其他一些有用的方法
一行里畫出多張圖像和對應標簽的函數
def show_fashion_mnist(images, labels):
use_svg_display()
# 這里的_表示我們忽略(不使用)的變量
_, figs = plt.subplots(1, len(images), figsize=(12, 12))
# subplots(row, cloumn, figsize=(12, 12)) row:子圖的行數,即有幾行;column:子圖的列數,即一行有幾個圖;
# figsize:子圖的Height和Width 其他參數請參考博客https://www.cnblogs.com/zhouzhe-blog/p/9614761.html 感謝大佬
# fig, ax = subplots() fig:返回一個圖像fig(這是一個整幅圖像,含有子圖);ax:返回子圖列表(fig的子圖)
for f, img, lbl in zip(figs, images, labels):
# zip()把可迭代的對象中的元素打包成一個個的元組,返回這些元組的列表。若是可迭代對象的元素個數不一致,
# 則返回列表的長度與最短的對象相同https://www.runoob.com/python/python-func-zip.html
f.imshow(img.view((28, 28)).numpy()) # imshow(x,cmap) x表示要顯示圖片的變量,cmap為顏色圖譜,默認為RGB(A)
# imshow()其他參數可百度
f.set_title(lbl) # 設置圖像標題
f.axes.get_xaxis().set_visible(False) # 設置x軸不可見
f.axes.get_yaxis().set_visible(False) # 設置y軸不可見
plt.show()
查看數據集前10個圖片及對應標簽
X, y = [], [] for i in range(10): X.append(mnist_train[i][0]) # 每個圖片對應的tensor(形狀如torch.size([1, 28, 28]))附加到列表X中 y.append(mnist_train[i][1]) # 每個圖像對應的labels的數字代表(即用0-9代替了標簽) show_fashion_mnist(X, get_fashion_mnist_labels(y))
# get_fashion_mnist_labels()通過數字獲取對應的標簽 show_fashion_mnist()顯示圖片和對應的label
softmax回歸實現
torch.gather()函數的理解
下面說說我對gather()函數的理解,gather(input,dim,index,out=None),對於gather函數我百度了一些解釋,參考了一些博客,如 https://www.jianshu.com/p/5d1f8cd5fe31 (對dim=0時的三維tensor解釋的可以) https://blog.csdn.net/edogawachia/article/details/80515038
以上述第一個博客的tensor為例,
input = tensor([[[18., 5., 7., 1., 1.], [ 3., 26., 9., 7., 9.], [ 10., 28., 22., 27., 0.]], [[ 26., 10., 20., 29., 18.], [ 5., 24., 26., 21., 3.], [ 10., 29., 10., 0., 22.]]]) index = torch.LongTensor([[[0,1,2,0,2], [0,0,0,0,0], [1,1,1,1,1]], [[1,2,2,2,2], [0,0,0,0,0], [2,2,2,2,2]]]) 首先明確tensor的形狀是(2,3,5),即第一層中括號里有2個維度,第二層中括號里有3個維度,第三層中括號里有5個維度,所以(2,3,5) dim = 1 即用index里值修改代替index對應位置的數值的下標中第2個下標值。例如index中下標為(0,0,0)的對應值0,用對應值0替換 下標中第2個值0得出(0,0,0),然后去input中取下標為(0,0,0)的值18放入輸出tensor下標(0,0,0)對應位置;index中下標為(0,0,1)的對應 值1,用對應值1替換下標中第2個值得出(0,1,1),取出input中下標為(0,1,1)的值為26放入輸出tensor下標(0,0,1)對應位置;index中下標為(1,0,1) 對應值2,用對應值2替換下標中第2個值得出(1,2,1),取出input中下標為(1,2,1)的值為29放入輸出tensor下標(1,0,1)對應位置。 依次類推,得出輸出tensor如下: tensor([[[ 18., 26., 22., 1., 0.], [ 18., 5., 7., 1., 1.], [ 3., 26., 9., 7., 9.]], [[ 5., 29., 10., 0., 22.], [ 26., 10., 20., 29., 18.], [ 10., 29., 10., 0., 22.]]]) dim = 2 同理dim=1,這次只不過是替換下標中第3個值。如index中下標為(0,0,4)的對應值2,替換后得(0,0,2),取input值為7 index2 = torch.LongTensor([[[0,1,1,0,1], [0,1,1,1,1], [1,1,1,1,1]], [[1,0,0,0,0], [0,0,0,0,0], [1,1,0,0,0]]]) dim = 0 同理dim=1,這次是替換下標中第1個值。如index2中下標為(0,0,1)的對應值1,替換后的(1,0,1),取input值為10
torch.argmax()函數的理解
我真是菜的一批,看了好久(一看就困),以博客 https://blog.csdn.net/weixin_42494287/article/details/92797061 的三維的例子為例,說一下個人的理解
a=torch.tensor([ [ [1, 5, 5, 2], [9, -6, 2, 8], [-3, 7, -9, 1] ], [ [-1, 7, -5, 2], [9, 6, 2, 8], [3, 7, 9, 1] ]]) # a的形狀為(2,3,4)比較時,若是第一塊和第二塊比,值一樣,則取第二塊的位置值;dim表示維度,要干掉的維度
b=torch.argmax(a,dim=0) dim=0,干掉第一維,也就是剩下(3,4),即紅色中括號里對應位置數字相比,第一個紅色中括號對應位置數字大,則取0,否則取1。 值相同取第二個紅色中括號對應值1(對應上面的黑色粗體字)。(為什么取0/1?) 結果: tensor([[0, 1, 0, 1], [1, 1, 1, 1], [1, 1, 1, 1]]) c=torch.argmax(a,dim=1) dim=1,干掉第二維,也就是剩下(2,4),即藍色和熒光綠色中括號里對應位置數字相對,藍色剩一行,熒光綠色剩一行。以藍色為例,第一個藍色中括號 數值大則取0,第二個藍色中括號數值大則取1,第三個藍色中括號數值大則取2。(為什么取0/1/2?) 結果: tensor([[1, 2, 0, 1], [1, 2, 2, 1]]) d=torch.argmax(a,dim=2) dim=2,干掉第三維,也就是剩下(2,3),即紅色中括號為2,藍色和熒光綠色為3,也就是藍色和熒光綠色中括號里剩一個值並轉置(或者說取了值后放 在一個列表里)。例如:第一個藍色中括號:有2個5,取第二個5,取值2;第二個藍色中括號:9最大,取值0;第三個藍色中括號:7最大,取值1。組成列表為[2,0,1] 結果: tensor([[2, 0, 1], [1, 0, 2]]) 二維也一樣,去掉某一維即可
看明白了argmax函數后,torch.sum(input,dim,output)也就懂了,不過sum是把要干掉的維度上數求和(即合並成一個)
torch.nn.CrossEntropyLoss()
這個交叉熵損失函數把input tensor進行了softmax()、log()、NLLLoss()計算,即三合一。見博客 https://blog.csdn.net/qq_22210253/article/details/85229988 博主寫的很好,感謝博主