(pytorch-深度学习系列)使用Pytorch实现小型卷积神经网络网络
卷積層
卷積神經網絡中每層卷積層(Convolutional layer)由若干卷積單元組成,每個卷積單元的參數都是通過反向傳播算法最佳化得到的。卷積運算的目的是提取輸入的不同特征,第一層卷積層可能只能提取一些低級的特征如邊緣、線條和角等層級,更多層的網路能從低級特征中迭代提取更復雜的特征。
·
pytorch的卷積層:
一維卷積層,輸入的尺度是(N, C_in,L),輸出尺度( N,C_out,L_out)的計算方式:
out(N_i, C_{out_j})=bias(C {out_j})+\sum^{C{in}-1}{k=0}weight(C{out_j},k)\bigotimes input(N_i,k) bigotimes: 表示相關系數計算 stride: 控制相關系數的計算步長 dilation: 用于控制內核點之間的距離,詳細描述在[這里](https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md) groups: 控制輸入和輸出之間的連接, group=1,輸出是所有的輸入的卷積;group=2,此時相當于有并排的兩個卷積層,每個卷積層計算輸入通道的一半,并且產生的輸出是輸出通道的一半,隨后將這兩個輸出連接起來。參數說明如下:
Parameters:in_channels(int) – 輸入信號的通道 out_channels(int) – 卷積產生的通道 kerner_size(int or tuple) - 卷積核的尺寸 stride(int or tuple, optional) - 卷積步長 padding (int or tuple, optional)- 輸入的每一條邊補充0的層數 dilation(int or tuple, `optional``) – 卷積核元素之間的間距 groups(int, optional) – 從輸入通道到輸出通道的阻塞連接數 bias(bool, optional) - 如果bias=True,添加偏置舉例:
m = nn.Conv1d(16, 33, 3, stride=2) input = Variable(torch.randn(20, 16, 50)) output = m(input) print(output.size()) #torch.Size([20, 33, 24])二維卷積層:
class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)例子:
>>> # With square kernels and equal stride >>> m = nn.Conv2d(16, 33, 3, stride=2) >>> # non-square kernels and unequal stride and with padding >>> m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2)) >>> # non-square kernels and unequal stride and with padding and dilation >>> m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2), dilation=(3, 1)) >>> input = autograd.Variable(torch.randn(20, 16, 50, 100)) >>> output = m(input)池化層
class torch.nn.MaxPool1d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)對于輸入信號的輸入通道,提供1維最大池化(max pooling)操作
參數:kernel_size(int or tuple) - max pooling的窗口大小 stride(int or tuple, optional) - max pooling的窗口移動的步長。默認值是kernel_size padding(int or tuple, optional) - 輸入的每一條邊補充0的層數 dilation(int or tuple, optional) – 一個控制窗口中元素步幅的參數 return_indices - 如果等于True,會返回輸出最大值的序號,對于上采樣操作會有幫助 ceil_mode - 如果等于True,計算輸出信號大小的時候,會使用向上取整,代替默認的向下取整的操作例子:
>>> # pool of size=3, stride=2 >>> m = nn.MaxPool1d(3, stride=2) >>> input = autograd.Variable(torch.randn(20, 16, 50)) >>> output = m(input)全連接層
class torch.nn.Linear(in_features, out_features, bias=True) 參數: in_features - 每個輸入樣本的大小 out_features - 每個輸出樣本的大小 bias - 若設置為False,這層不會學習偏置。默認值:True卷積神經網絡
卷積神經網絡(Convolutional Neural Network,CNN)是一種前饋神經網絡,它的人工神經元可以響應一部分覆蓋范圍內的周圍單元,對于大型圖像處理有出色表現。
pytorch實現ConvNet(注釋詳解)
import torch from torch.autograd import Variable #torch.autograd提供了類和函數用來對任意標量函數進行求導。 import torch.nn as nn import torch.nn.functional as F class MNISTConvNet(nn.Module):def __init__(self):super(MNISTConvNet, self).__init__()''' 這是對繼承自父類的屬性進行初始化。而且是用父類的初始化方法來初始化繼承的屬性。 也就是說,子類繼承了父類的所有屬性和方法,父類屬性自然會用父類方法來進行初始化。''' #定義網絡結構self.conv1 = nn.Conv2d(1, 10, 5)self.pool1 = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(10, 20, 5)self.pool2 = nn.MaxPool2d(2, 2)self.fc1 = nn.Linear(320, 50)self.fc2 = nn.Linear(50, 10)def forward(self, input):x = self.pool1(F.relu(self.conv1(input)))x = self.pool2(F.relu(self.conv2(x))).view(320)x = self.fc1(x)x = self.fc2(x)return xnet = MNISTConvNet() print(net) input = Variable(torch.randn(1, 1, 28, 28)) out = net(input) print(out.size())pytorch卷積層與池化層輸出的尺寸的計算公式詳解
要設計卷積神經網絡的結構,必須匹配層與層之間的輸入與輸出的尺寸,這就需要較好的計算輸出尺寸
我在這里詳細講了如何計算尺寸,請瀏覽
torch.nn.functional詳解
· Convolution 函數
torch.nn.functional.conv1d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)對幾個輸入平面組成的輸入信號應用1D卷積。
參數: - -input – 輸入張量的形狀 (minibatch x in_channels x iW) - - weight – 過濾器的形狀 (out_channels, in_channels, kW) - - bias – 可選偏置的形狀 (out_channels) - - stride – 卷積核的步長,默認為1例子:
>>> filters = autograd.Variable(torch.randn(33, 16, 3)) >>> inputs = autograd.Variable(torch.randn(20, 16, 50)) >>> F.conv1d(inputs, filters)· Pooling 函數
torch.nn.functional.avg_pool1d(input, kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True)對由幾個輸入平面組成的輸入信號進行一維平均池化。
參數: - kernel_size – 窗口的大小 - - stride – 窗口的步長。默認值為kernel_size - - padding – 在兩邊添加隱式零填充 - - ceil_mode – 當為True時,將使用ceil代替floor來計算輸出形狀 - - count_include_pad – 當為True時,這將在平均計算時包括補零例子:
>>> # 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.functional.relu(input, inplace=False)· Normalization 函數
torch.nn.functional.batch_norm(input, running_mean, running_var, weight=None, bias=None, training=False, momentum=0.1, eps=1e-05)· 線性函數
torch.nn.functional.linear(input, weight, bias=None)· Dropout 函數
torch.nn.functional.dropout(input, p=0.5, training=False, inplace=False)· 距離函數(Distance functions)
torch.nn.functional.pairwise_distance(x1, x2, p=2, eps=1e-06)計算向量v1、v2之間的距離
x1:第一個輸入的張量 x2:第二個輸入的張量 p:矩陣范數的維度。默認值是2,即二范數。例子:
>>> input1 = autograd.Variable(torch.randn(100, 128)) >>> input2 = autograd.Variable(torch.randn(100, 128)) >>> output = F.pairwise_distance(input1, input2, p=2) >>> output.backward()· 損失函數(Loss functions)
torch.nn.functional.nll_loss(input, target, weight=None, size_average=True)負的log likelihood損失函數.
參數:- input - (N,C) C 是類別的個數 - - target - (N) 其大小是 0 <= targets[i] <= C-1 - - weight (Variable, optional) – 一個可手動指定每個類別的權重。如果給定的話,必須是大小為nclasses的Variable - - size_average (bool, optional) – 默認情況下,是mini-batchloss的平均值,然而,如果size_average=False,則是mini-batchloss的總和。總結
以上是生活随笔為你收集整理的(pytorch-深度学习系列)使用Pytorch实现小型卷积神经网络网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么Java开发人员都带眼镜 | 程序
- 下一篇: 推荐系统--联邦学习下的矩阵分解(6)