VisualPytorch發佈域名+雙服務器以下:
http://nag.visualpytorch.top/static/ (對應114.115.148.27)
http://visualpytorch.top/static/ (對應39.97.209.22)html
首先打開網址,進入網站的首頁。網站有遊客遊覽模式和用戶登陸模式,建議先註冊登陸一個帳號,也是十分簡便的啦,由於這樣可使用更多的功能。python
頁面頭部有三個選項,分別爲VisualPytorch, 幫助和聯繫咱們,VisualPytorch就是主頁面,能夠進行模型的搭建,幫助頁面是本網站的簡單教程以及相關知識的講解,在聯繫咱們界面,能夠給咱們反饋你在使用過程當中的遇到的問題,幫助咱們進步呀。git
在VisualPytorch界面左側有可選擇的網絡層,這些層就是用來搭建神經網絡模型的基本組件,在網絡層的下面還有訓練參數配置,主要用於肯定模型的全局訓練參數。下面給你們簡單展現一下如何拖拽和刪除這些組件框,以及組件框參數的位置。github
在VisualPytorch界面左上角有生成代碼按鈕,當你搭建好本身的神經網絡模型以後,就能夠點擊這個按鈕,而後會跳轉到代碼頁面,你也就能夠看到生成的代碼啦,而後再點擊下載代碼,就能夠把代碼下載到本地,暢快的玩耍一番啦。算法
考慮到也許後續還要用本身搭建過的模型,因此咱們實現了保存模型這一功能(貼心的團隊,有木有),當你搭建好一個模型以後,能夠直接選擇保存,而後模型就會保存到你的帳號啦,下次你登陸還能夠查看本身以前的模型。json
咱們的網站旨在利用清晰的可視化模型來幫助熱愛deep learning的你快速搭建想搭建的模型。canvas
目前支持的神經網絡層有:reshape層,全鏈接層,一維卷積層,二維卷積層; 這些層及其涉及的參數的具體含義都與pytorch官方文檔裏一致。數組
模型的搭建經過將左側的各種層模塊拖入右側畫布並連線來完成。服務器
main.py裏的代碼主要是涉及全局的參數以及訓練部分,目前該部分還有待完善。網絡
model.py裏則主要是搭建的模型代碼,整個模型咱們封裝成了一個類,類名是 NET。
註冊用戶擁有保存本身搭建的模型並管理的權限,用戶能夠經過點擊頁面上顯示的用戶名,彈出 模型查看 和 登出 選項,點擊模型查看便可進入模型管理的頁面,該頁面會顯示用戶曾搭建並保存的全部模型,每一個模型都有對應的 查看 和 刪除 按鈕。點擊查看便可進入模型搭建的頁面並恢復用戶曾保存的模型,用戶能夠對該模型進行從新編輯。點擊刪除便可刪除相應的模型。
VGG卷積神經網絡是牛津大學在2014年提出來的模型,它在圖像分類和目標檢測任務中都表現出很是好的結果。同時,VGG16模型的權重由ImageNet訓練而來。
AlexNet是2012年ImageNet項目的大規模視覺識別挑戰中的勝出者,該項目一種巧妙的手法打破了舊觀念,開創了計算機視覺的新局面。
一種新型的深度網絡結構,它能夠加強模型在感覺野內對局部區域的辨別能力。
返回一個有相同數據但大小不一樣的tenser。返回的tenser必須有與原tenser相同的數據和相同數目的元素,但能夠有不一樣的大小。一個tenser必須是連續的contiguous()
才能被查看。
簡單來看,view的參數就比如一個矩陣的行和列的值,當爲一個數n的時候,則將數據大小變爲1xn。
參數:
class torch.nn.Linear(in_features, out_features, bias=True)
對輸入數據作線性變換:y*=*Ax+b
參數:
形狀:
變量:
例子:
>>> m = nn.Linear(20, 30) >>> input = autograd.Variable(torch.randn(128, 20)) >>> output = m(input) >>> print(output.size())
該層不須要參數,做爲幾個層之間的銜接,須要注意的是,該函數的輸入能夠爲多個向量。
torch.cat(inputs, dimension=0) → Tensor
在給定維度上對輸入的張量序列seq
進行鏈接操做。
torch.cat()
能夠看作 torch.split()
和 torch.chunk()
的反操做。 cat()
函數能夠經過下面例子更好的理解。
參數:
例子:
>>> x = torch.randn(2, 3) >>> x 0.5983 -0.0341 2.4918 1.5981 -0.5265 -0.8735 [torch.FloatTensor of size 2x3] >>> torch.cat((x, x, x), 0) 0.5983 -0.0341 2.4918 1.5981 -0.5265 -0.8735 0.5983 -0.0341 2.4918 1.5981 -0.5265 -0.8735 0.5983 -0.0341 2.4918 1.5981 -0.5265 -0.8735 [torch.FloatTensor of size 6x3] >>> torch.cat((x, x, x), 1) 0.5983 -0.0341 2.4918 0.5983 -0.0341 2.4918 0.5983 -0.0341 2.4918 1.5981 -0.5265 -0.8735 1.5981 -0.5265 -0.8735 1.5981 -0.5265 -0.8735 [torch.FloatTensor of size 2x9]
class torch.nn.Softmax(dim=None)
將Softmax函數應用於n維輸入Tensor,對它們進行從新縮放,使得n維輸出Tensor的元素位於[0,1]範圍內而且總和爲1。
函數表達式:
Softmax(xi)=exi∑jexjSoftmax(xi)=exi∑jexj
返回:
參數:
例子:
>>> m = nn.Softmax() >>> input = torch.randn(2, 3) >>> output = m(input)
torch.nn.Dropout(p=0.5, inplace=False)
在訓練期間,使用伯努利分佈的樣本以機率p將輸入張量的某些元素隨機置零。 在每次前向傳播時,每一個通道將獨立清零。事實證實,這是一種有效的技術,可用於規範化和防止神經元的協同適應。
例子:
a = torch.randn(10,1) >>> tensor([[ 0.0684], [-0.2395], [ 0.0785], [-0.3815], [-0.6080], [-0.1690], [ 1.0285], [ 1.1213], [ 0.5261], [ 1.1664]]) torch.nn.Dropout(0.5)(a) >>> tensor([[ 0.0000], [-0.0000], [ 0.0000], [-0.7631], [-0.0000], [-0.0000], [ 0.0000], [ 0.0000], [ 1.0521], [ 2.3328]])
class torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
卷積神經網絡中每層卷積層(Convolutional layer)由若干卷積單元組成,每一個卷積單元的參數都是經過反向傳播算法最佳化獲得的。卷積運算的目的是提取輸入的不一樣特徵,第一層卷積層可能只能提取一些低級的特徵如邊緣、線條和角等層級,更多層的網路能從低級特徵中迭代提取更復雜的特徵。
以一維卷積層爲例,輸入的尺度是(N, C_in,L),輸出尺度( N,C_out,L_out)的計算方式:
layer_type<下拉框二選一,conv/conv_transpose> - 分別表示卷積與反捲積 默認值爲conv
conv和conv_transpose參數相同
形狀:
變量:
tensor
) - 卷積的權重,大小是(out_channels
, in_channels
, kernel_size
)tensor
) - 卷積的偏置係數,大小是(out_channel
)例子:
>>> m = nn.Conv1d(16, 33, 3, stride=2) >>> input = autograd.Variable(torch.randn(20, 16, 50)) >>> output = m(input)
在神經網絡中,池化函數(Pooling Function)通常將上一層卷積函數的結果做爲本身的輸入。通過卷積層提取過特徵以後,咱們獲得的通道數可能會增大不少,也就是說數據的維度會變得更高,這個時候就須要對數據進行池化操做,也就是降維操做。
池化操做是用每一個矩陣的最大值或是平均值來表明這個矩陣,從而實現元素個數的減小,而且最大值和平均值操做可使得特徵提取具備「平移不變性」。
layer_type<下拉框三選一,選項包括max_pool, avg_pool, max_unpool > 默認值爲max_pool
torch.nn.functional.max_pool1d(input, kernel_size, stride=None, padding=0, dilation=1, ceil_mode=False, return_indices=False)
對由幾個輸入平面組成的輸入信號進行最大池化。通常狀況下咱們只須要用到type, kernel_size, stride=None, padding=0
這些參數。
參數:
例子:
>>> # pool of square window of size=3, stride=2 >>> m = nn.MaxPool3d(3, stride=2) >>> # pool of non-square window >>> m = nn.MaxPool3d((3, 2, 2), stride=(2, 1, 2)) >>> input = torch.randn(20, 16, 50,44, 31) >>> output = m(input)
torch.nn.functional.avg_pool1d(input, kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True)
對由幾個輸入平面組成的輸入信號進行平均池化。通常狀況下咱們只須要用到type, kernel_size, stride=None, padding=0
這些參數。
參數:
例子:
>>> # pool of square window of size=3, stride=2 >>> input = Variable(torch.Tensor([[[1,2,3,4,5,6,7]]])) >>> F.avg_pool1d(input, kernel_size=3, stride=2) Variable containing: (0 ,.,.) = 2 4 6 [torch.FloatTensor of size 1x1x3]
torch.nn.MaxUnpool1d(kernel_size, stride=None, padding=0)
參數:
例子:
>>> pool = nn.MaxPool1d(2, stride=2, return_indices=True) >>> unpool = nn.MaxUnpool1d(2, stride=2) >>> input = torch.tensor([[[1., 2, 3, 4, 5, 6, 7, 8]]]) >>> output, indices = pool(input) >>> unpool(output, indices) tensor([[[ 0., 2., 0., 4., 0., 6., 0., 8.]]]) >>> # Example showcasing the use of output_size >>> input = torch.tensor([[[1., 2, 3, 4, 5, 6, 7, 8, 9]]]) >>> output, indices = pool(input) >>> unpool(output, indices, output_size=input.size()) tensor([[[ 0., 2., 0., 4., 0., 6., 0., 8., 0.]]]) >>> unpool(output, indices) tensor([[[ 0., 2., 0., 4., 0., 6., 0., 8.]]])
激活函數做用在人工神經網絡上,負責將神經元的輸入映射到輸出端。增長了神經網絡的非線性,使得神經網絡能夠任意逼近任意非線性函數,從而使神經網絡應用到衆多的非線性模型中。
layer_type<下拉框,包括relu/sigmoid/tanh/leaky relu/PRelu/RRelu> 默認值爲relu
函數表達式:
\(relu(x)=max(0,x)\)
對應圖像:
函數表達式:
\(LeakyRelu(x)=max(x,0) + negative\_slope*min(0,x)\)
參數:
對應圖像:
函數表達式:
\(sigmoid(x)=\frac{1}{1+e^{-x}}\)
函數圖像:
函數表達式:
\(tanh(x)=\frac{e^x-e^{-x}}{e^x+e^-x}\)
函數圖像:
torch.nn.PReLU(num_parameters=1, init=0.25)
函數表達式:PReLU(x)=max(0,x)+a∗min(0,x)
函數圖像:
相似leaky relu, 可是負數部分斜率可學習
參數:
torch.nn.RReLU(lower=0.125, upper=0.3333333333333333, inplace=False)
函數表達式:
相似leaky relu, 可是負數部分斜率爲隨機均勻分佈
參數:
torch.nn.RNN(*args, **kwargs)
RNN(Recurrent Neural Networks,循環神經網絡)不只會學習當前時刻的信息,也會依賴以前的序列信息。因爲其特殊的網絡模型結構解決了信息保存的問題。因此RNN對處理時間序列和語言文本序列問題有獨特的優點。遞歸神經網絡都具備一連串重複神經網絡模塊的形式。在標準的RNNs中,這種重複模塊有一種很是簡單的結構。
計算公式:
具體參數含義:ht是隱藏層在時間t時的狀態,xt是時間t時的輸入,h(t-1)是隱藏層在t-1時的狀態。若是非線性激活函數爲relu,那麼tanh將用ReLU代替。
參數:
torch.nn.LSTM(*args, **kwargs)
Long Short Term Memory networks(如下簡稱LSTMs),一種特殊的RNN網絡,該網絡設計出來是爲了解決長依賴問題。該網絡由 [Hochreiter & Schmidhuber (1997)引入,並有許多人對其進行了改進和普及。他們的工做被用來解決了各類各樣的問題,直到目前還被普遍應用。
LSTM的計算公式較爲複雜,下圖截取了pytorch官方文檔中的部份內容:
參數:
layer_type<下拉框,選項包括batch_norm/group_norm/instance_norm> 默認值爲batch_norm
咱們在對數據訓練以前會對數據集進行歸一化,歸一化的目的歸一化的目的就是使得預處理的數據被限定在必定的範圍內(好比[0,1]或者[-1,1]),從而消除奇異樣本數據致使的不良影響,同時便於加快訓練速度。
torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
計算公式:
參數:
例子:
>>> m = nn.BatchNorm1d(100) >>> # Without Learnable Parameters >>> m = nn.BatchNorm1d(100, affine=False) >>> input = torch.randn(20, 100) >>> output = m(input)
torch.nn.GroupNorm(num_groups, num_channels, eps=1e-05, affine=True)
計算公式:
參數:
例子:
>>> # Separate 6 channels into 3 groups >>> m = nn.GroupNorm(3, 6) >>> # Separate 6 channels into 6 groups (equivalent with InstanceNorm) >>> m = nn.GroupNorm(6, 6) >>> # Put all 6 channels into a single group (equivalent with LayerNorm) >>> m = nn.GroupNorm(1, 6) >>> # Activating the module >>> output = m(input)
torch.nn.InstanceNorm1d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
計算公式:
參數:
例子:
>>> # Without Learnable Parameters >>> m = nn.InstanceNorm1d(100) >>> # With Learnable Parameters >>> m = nn.InstanceNorm1d(100, affine=True) >>> input = torch.randn(20, 100, 40) >>> output = m(input)
epoch<正整數> - 全數據集訓練次數 默認值爲10
當一個完整的數據集經過了神經網絡一次而且返回了一次,這個過程稱爲一次>epoch。(也就是說,全部訓練樣本在神經網絡中都 進行了一次正向傳播 和一次反向傳播 )
再通俗一點,一個Epoch就是將全部訓練樣本訓練一次的過程。
learning_rate<0-1內實數> - 學習率 默認值爲0.01
學習率(Learning rate)做爲監督學習以及深度學習中重要的超參,其決定着目標函數可否收斂到局部最小值以及什麼時候收斂到最小值。合適的學習率可以使目標函數在合適的時間內收斂到局部最小值。
batch_size<正整數> - 每次訓練個數 默認值爲1
當一個Epoch的樣本(也就是全部的訓練樣本)數量可能太過龐大(對於計算機而言),就須要把它分紅多個小塊,也就是就是分紅多個Batch 來進行訓練。batch_size爲每批樣本的大小。
dataset<下拉框,共包含mnist,cifar10,stl10,svhn> - 訓練數據集 默認值爲mnist
mnist:該數據集包含60,000個用於訓練的示例和10,000個用於測試的示例。這些數字已通過尺寸標準化並位於圖像中心,圖像是固定大小(28x28像素),其值爲0到1。爲簡單起見,每一個圖像都被平展並轉換爲784(28 * 28)個特徵的一維numpy數組。
下載連接:http://yann.lecun.com/exdb/mnist/
cifar10:該數據集共有60000張彩色圖像,這些圖像是32*32,分爲10個類,每類6000張圖。這裏面有50000張用於訓練,構成了5個訓練批,每一批10000張圖;另外10000用於測試,單獨構成一批。測試批的數據裏,取自10類中的每一類,每一類隨機取1000張。抽剩下的就隨機排列組成了訓練批。注意一個訓練批中的各種圖像並不必定數量相同,總的來看訓練批,每一類都有5000張圖。
下載連接:http://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz
stl10:STL-10 是一個圖像數據集,包含 10 類物體的圖片,每類 1300 張圖片,500 張訓練,800 張測試,每張圖片分辨率爲 96x96。除了具備類別標籤的圖片以外,還有 100000 張無類別信息的圖片。
下載連接:https://cs.stanford.edu/~acoates/stl10/
svhn:SVHN(Street View House Number)Dateset 來源於谷歌街景門牌號碼,原生的數據集1也就是官網的 Format 1 是一些原始的未經處理的彩色圖片,以下圖所示(不含有藍色的邊框),下載的數據集含有 PNG 的圖像和 digitStruct.mat 的文件,其中包含了邊框的位置信息,這個數據集每張圖片上有好幾個數字,適用於 OCR 相關方向。
下載連接:http://ufldl.stanford.edu/housenumbers/
ifshuffle<勾選框,默認爲勾選,在json中爲True,不然爲False> - 是否打亂數據集 默認爲true
platform<下拉框,共包含CPU,GPU> - 運行平臺 默認CPU
下拉框,共包括StepLR, MultiStepLR, ExponentialLR, CosineAnnealingLR,ReduceLROnPleateau,None 默認值爲None
pytorch提供了幾種根據epoch調整學習率的方法。
使用方法:learning_rate_scheduler應在優化器方向傳播後進行應用,以下例所示:
>>> scheduler = ... >>> for epoch in range(100): >>> train(...) >>> validate(...) >>> scheduler.step()
在每一個step_size時期,經過gamma下降每一個參數組的學習率。 這種衰減可能與此調度程序外部的學習速率的其餘更改同時發生。 當last_epoch = -1時,將初始lr設置爲lr。
例子:
>>> # Assuming optimizer uses lr = 0.05 for all groups >>> # lr = 0.05 if epoch < 30 >>> # lr = 0.005 if 30 <= epoch < 60 >>> # lr = 0.0005 if 60 <= epoch < 90 >>> # ... >>> scheduler = StepLR(optimizer, step_size=30, gamma=0.1) >>> for epoch in range(100): >>> train(...) >>> validate(...) >>> scheduler.step()
當epoch到達milestone後,經過gamma衰減每一個參數組的學習率。這種衰減可能與此調度程序外部的學習速率的其餘更改同時發生。 當last_epoch = -1時,將初始lr設置爲lr。
例子:
>>> # Assuming optimizer uses lr = 0.05 for all groups >>> # lr = 0.05 if epoch < 30 >>> # lr = 0.005 if 30 <= epoch < 80 >>> # lr = 0.0005 if epoch >= 80 >>> scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1) >>> for epoch in range(100): >>> train(...) >>> validate(...) >>> scheduler.step()
在每一個epoch以gamma衰減每一個參數組的學習率。 當last_epoch = -1時,將初始lr設置爲lr。
此函數較爲複雜,下圖爲pytorch文檔中對其計算方法的相關說明:
當指標中止改善時,下降學習率。 一旦學習停滯,模型一般會受益於將學習率下降2-10倍。 該調度程序讀取一個指標數量,若是在patience時期沒有看到改善,則學習速度會下降。
例子:
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9) >>> scheduler = ReduceLROnPlateau(optimizer, 'min') >>> for epoch in range(10): >>> train(...) >>> val_loss = validate(...) >>> # Note that step should be called after validate() >>> scheduler.step(val_loss)
下拉框,共包含SGD,RMSprop,Adam,Adamax,ASGD 默認值爲Adam
優化器是用來計算和更新影響模型訓練和輸出的網絡參數(w和b),從而最小化(或最大化)損失函數Loss。
優化器是求解最優解的過程,能夠變相理解爲求損失函數極值的問題,因變量爲Loss,自變量(優化變量)爲w和b,所以須要用到一階導數(梯度),極值處其方程梯度(一階導數)爲零。有些時候會對優化變量進行約束,包括等式約束和不等式約束,定義了優化變量的可行域,如L1正則化和L2正則化。
Stochastic Gradient Descent
實現隨機梯度降低(可選帶動量)。
例子:
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9) >>> optimizer.zero_grad() >>> loss_fn(model(input), target).backward() >>> optimizer.step()
Averaged Stochastic Gradient Descent
實現平均隨機梯度降低。
實現Adam算法進行梯度降低。
Adam算法介紹:https://arxiv.org/abs/1412.6980
實現RMSprop 算法進行梯度降低。
RMSprop 算法介紹:https://arxiv.org/pdf/1308.0850v5.pdf
實現Adamax算法(基於無窮範數的Adam的變體)。
Adamax算法介紹:https://arxiv.org/abs/1412.6980
下拉框,共包含MSELoss,CrossEntropyLoss,L1Loss,NLLLoss,BCELoss 默認值爲MSELoss
損失函數(loss function)是用來估量你模型的預測值f(x)與真實值Y的不一致程度,它是一個非負實值函數,一般使用L(Y, f(x))來表示,損失函數越小,模型的魯棒性就越好。
均方偏差
pytorch文檔中計算函數:
例子:
>>> loss = nn.MSELoss() >>> input = torch.randn(3, 5, requires_grad=True) >>> target = torch.randn(3, 5) >>> output = loss(input, target) >>> output.backward()
交叉熵損失
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()
mean absolute error(MAE)
pytorch文檔中計算函數:
例子:
>>> loss = nn.L1Loss() >>> input = torch.randn(3, 5, requires_grad=True) >>> target = torch.randn(3, 5) >>> output = loss(input, target) >>> output.backward()
negative log likelihood loss
pytorch文檔中計算函數:
例子:
>>> m = nn.LogSoftmax(dim=1) >>> loss = nn.NLLLoss() >>> # input is of size N x C = 3 x 5 >>> input = torch.randn(3, 5, requires_grad=True) >>> # each element in target has to have 0 <= value < C >>> target = torch.tensor([1, 0, 4]) >>> output = loss(m(input), target) >>> output.backward() >>> >>> >>> # 2D loss example (used, for example, with image inputs) >>> N, C = 5, 4 >>> loss = nn.NLLLoss() >>> # input is of size N x C x height x width >>> data = torch.randn(N, 16, 10, 10) >>> conv = nn.Conv2d(16, C, (3, 3)) >>> m = nn.LogSoftmax(dim=1) >>> # each element in target has to have 0 <= value < C >>> target = torch.empty(N, 8, 8, dtype=torch.long).random_(0, C) >>> output = loss(m(conv(data)), target) >>> output.backward()
Binary Cross Entropy between the target and the output
pytorch文檔計算函數:
例子:
>>> m = nn.Sigmoid() >>> loss = nn.BCELoss() >>> input = torch.randn(3, requires_grad=True) >>> target = torch.empty(3).random_(2) >>> output = loss(m(input), target) >>> output.backward()
本教程部分參考了PyTorch中文手冊和PyTorch官方文檔,若是想要更詳細深刻了解的請訪問該手冊和文檔。
若以爲官方文檔較難讀懂,先看如下我的博客: