天天看點

MAML-CNN代碼筆記一些方法預處理在本代碼中學到的東西

該代碼中編寫了許多初始化權重的資訊,其他的代碼都沒有加載過初始化參數的資訊嗎?

一些方法

string.punctuation

import string
string.punctuation      #所有的标點字元
'!"#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~'
           

torch.nn.Parameter()

在刷官方Tutorial的時候發現了一個用法self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size)),看了官方教程裡面的解釋也是雲裡霧裡,于是在棧溢網看到了一篇解釋,并做了幾個實驗才算完全了解了這個函數。首先可以把這個函數了解為類型轉換函數,将一個不可訓練的類型Tensor轉換成可以訓練的類型parameter并将這個parameter綁定到這個module裡面(net.parameter()中就有這個綁定的parameter,是以在參數優化的時候可以進行優化的),是以經過類型轉換這個self.v變成了模型的一部分,成為了模型中根據訓練可以改動的參數了。使用這個函數的目的也是想讓某些變量在學習的過程中不斷的修改其值以達到最優化。

torch.nn.init.kaiming_normal_

#根據tensor的次元初始化參數
import torch
import torch.nn as nn
 
w = torch.empty(2, 3)
 
# torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
nn.init.kaiming_normal_(w, mode='fan_out', nonlinearity='relu')
# tensor([[ 0.2530, -0.4382,  1.5995],
#         [ 0.0544,  1.6392, -2.0752]])
           

nn.ParameterList()

和上面的nn.ParameterList()配合使用

首先聲明一個ParameterList()

vars=nn.ParameterList()
w=nn.Parameter(torch.ones(*param[:4]))
vars.append(w)
           

再輸出ParameterList()就可以看到變化了

torch.ones(*size)

param[:4] [32, 3, 3, 3]
w = nn.Parameter(torch.ones(*param[:4]))
           
MAML-CNN代碼筆記一些方法預處理在本代碼中學到的東西
MAML-CNN代碼筆記一些方法預處理在本代碼中學到的東西

argparser.parse_args()

csv.reader()

傳回一個reader對象,利用該對象周遊csv檔案中的行。

with open(self.root) as csvfile:
            csvreader = csv.reader(csvfile, delimiter=',')
            next(csvreader, None)  # skip (filename, label)

            for i, row in enumerate(csvreader):
           

np.random.choice()

#numpy.random.choice(a, size=None, replace=True, p=None)

#從a(隻要是ndarray都可以,但必須是一維的)中随機抽取數字,并組成指定大小(size)的數組

#replace:True表示可以取相同數字,False表示不可以取相同數字

#數組p:與數組a相對應,表示取數組a中每個元素的機率,預設為選取每個元素的機率相同。

selected_cls = np.random.choice(self.cls_num, self.n_way, False) 
 #随機不重複地取數資料,在cls_num中随機不重複地取n_way個數。
           

random.sample方法

selected_text = random.sample(self.dictLabels[str(cls)], self.k_spt + self.k_qry)
#第一個參數是資料,第二個參數是資料的個數
           

tensorboard X進行可視化

參考文檔:https://www.jianshu.com/p/46eb3004beca

torchvision.utils.make_grid

torchvision.utils.make_grid(tensor, nrow=8, padding=2, normalize=False, range=None, scale_each=False, pad_value=0)

參數清單如上,參考部落格如下:

https://blog.csdn.net/a362682954/article/details/81196840

做的是将若幹圖像拼接成一幅圖像,padding表示圖檔之間的間隔,padding預設值為2.可以設定為其他值。

參考:https://blog.csdn.net/u012343179/article/details/83007296

plt.ion()

參考資料:https://blog.csdn.net/zbrwhut/article/details/80625702

Variable

https://www.jianshu.com/p/46a04f1f6085

tensor是Pytorch中的完美元件,但是建構神經網絡還遠遠不夠,我們需要能夠建構計算圖的tensor,這就是Variable。在torch中的Variable就是一個存放會變化的值的地理位置,裡面的值會不斷變化,就像一個裝雞蛋的籃子,雞蛋數會不斷發生變化,裡面的雞蛋就是torch的Tensor了(torch是用tensor計算的,tensor裡面的參數都是variable的形式)。Variable是對tensor的封裝,操作和tensor是一樣的,但是每個Variable都有三個屬性,Variable中的tensor本身.data,對應tensor的梯度.grad以及這個Variable是通過說明方式得到的.grad_fn。如果用Variable進行計算,那傳回的也是一個同類型的Variable

調用類的時候的一些情況

def __init__中的參數是必須在調用該類的時候就需要傳入的

而def forward()中的參數是需要在調用類的對象時候需要傳入

maml=Meta(vocab_size,embedding_dim,n_filters,output_dim,dropout,pad_idx)
 accs = maml(x_spt, y_spt, x_qry, y_qry)
而Meta類的定義如下

class Meta(nn.Module):
    """
    Meta Learner
    """
    def __init__(self, args,vocab_size, embedding_dim, n_filters,
                 filter_sizes, output_dim, dropout, pad_idx,static):
    def forward(self, x_spt, y_spt, x_qry, y_qry):
如: 
#調入類的執行個體(聲明類)
maml = Meta(args,vocab_size=len(vocab),filter_sizes=[3,4,5],embedding_dim=100,n_filters=100,output_dim=1,dropout=0.5,pad_idx=0).to(device)
#調用類的對象(使用類)
accs = maml(x_spt, y_spt, x_qry, y_qry)
           

使用dataset類的時候

一個錯誤

在沒有看到bert的部落格前是想用word2vec來做預訓練的模型,出的一個問題是直接用torch.tensor().long()直接去轉換我們的英文字元,但是需要注意的是,我們需要先建構一個字典,将我們的資料在預處理的過程中,要将資料轉換成對應的詞典的索引。這樣再繼續構成tensor才可以,否則我們無法對其進行使用。這也就是為什麼我們需要先建構詞典,之後再使用預訓練模型bert或者word2vec。通過這個我們也就知道了對文本的基本處理流程(1.導入資料 2.對資料進行處理(分詞,除去停用詞,和一些無用的标點符号。) 3.建構詞典 4.dataloader 5.下遊任務)他的

__getitem__(self,index)

方法隻要data和label一一對應,也就是大小尺寸一樣就可以,不用注意index指的是什麼,即使data的次元很複雜,我們也隻需用

data[index]

,

label[index]

即可。

def __getitem__(self, index):
        support_x = self.support_x_batch[index]
        support_y = self.support_y_batch[index]
        qry_x = self.qry_x_batch[index]
        qry_y = self.qry_y_batch[index]
        return support_x, qry_x, support_y, qry_y
           

需要修改的地方

  1. miniimagenet_train檔案中的config檔案,定義了網絡層的前向傳播的執行過程。根據我們的需求來進行定義,最重要的是尺寸問題。
  2. learner.py基本不用修改可以使用我們自己定義的
  3. 修改x_spt, y_spt, x_qry, y_qry的構成。主要是對Minilmageenet.py檔案的一個更改,更改了檔案的預處理過程,重新編寫了create_batch函數。
  4. 因為圖檔是每張圖檔存一個位置是以用的是索引來引用圖檔,但是文本的話我們直接索引即可。因為隻有兩類是以,我們可以在直接在檔案進行分類即可。而且對于最後一步的将圖檔轉為向量,這一步完全可以放到learner的網絡結構第一層來進行處理。主要的工作就是,将資料分成sup_x,sup_y,qur_x,que_y這四個。其中的

    np.random.choice

    很重要。

預處理

  1. 讀取資料并分詞,将每一條評論構成一個txt檔案。
因為源程式中的是每個圖檔是一個單獨的檔案,那麼我們也将每條評論構成一條單獨的檔案。對每個檔案進行預處理,分詞,去除停用詞,建構詞典。
#在目前py檔案的目錄下按csv檔案中的資料按'\n'分成一個一個txt檔案
import re

text = open(r'F:\研一\NLP\資料集\IMDB Dataset.csv',"r", encoding='UTF-8').read()    #打開本體TXT檔案

text = str(text)
print(text)

b=re.split('\n',text)
print(b)
n=0
for i in b:
    n+=1
    with open('%s.txt'%n,'w', encoding='UTF-8') as f:
        f.write(i)
           

2.讀取某檔案夾下面的所有檔案名,并将其儲存到Excel中。

3.可以見其他幾篇部落格,文本資料預處理(自己定義),文本預處理(torchtext),讀取檔案以及一些處理方法。

在本代碼中學到的東西

如何對自己的語料庫劃分成support,query,改寫dataset類
用自己的語料庫使用Word2Vec
統計詞頻,建構詞典
對資料進行一些簡單的預處理

繼續閱讀