1.4 矩阵方程$Ax=b$
线性代数中一个基本的思想是把向量的线性组合看作矩阵与向量的积.
定义 若$A$是$m\times n$矩阵,它的各列为$a_1,\cdots,a_n$.若$x$是$\mathbb{R}^n$中的向量,则$A$与$x$的积(记为$Ax$)就是$A$的各列以$x$中对应元素为权的线性组合,即
注意$Ax$仅当$A$的列数等于$x$中的元素个数时才有定义.
我们一路奋战,不是为了改变世界,而是为了不让世界改变我们
线性方程组的重要性质都可用向量概念与符号来描述。
仅含一列的矩阵称为列向量,或简称向量.包含两个元素的向量如下所示.
$u=\begin{bmatrix}
3 \\
-1 \\
\end{bmatrix}$,$v=\begin{bmatrix}
0.2 \\
0.3 \\
\end{bmatrix}$,$w=\begin{bmatrix}
w_1 \\
w_2 \\
\end{bmatrix}$
其中$w_1$和$w_2$是任意实数.所有两个元素的向量的集记为$\mathbb{R}^2$,$\mathbb{R}$表示向量中的元素是实数,而指数2表示每个向量包含两个元素.
$\mathbb{R}^2$中两个向量相等当且仅当其对应元素相等.因此,$\begin{bmatrix} 4\\ 7 \\ \end{bmatrix}$和$\begin{bmatrix} 7\\ 4 \\ \end{bmatrix}$是不相等的,因为$\mathbb{R}^2$中的向量是实数的有序对.
行化简算法可用于任意矩阵,不管它是否为某一方程组的增广矩阵.首先需要引入两类重要的矩阵,包含1.1节中的“三角形”矩阵;在以下的定义中,矩阵中非零行或列指矩阵中至少包含一个非零元素的行或列;非零行的先导元素是指该行中最左边的非零元素.
定义 一个矩阵称为阶梯形(或行阶梯形),若它有以下三个性质:
- 每一非零行都在每一零行之上.
- 某一行的先导元素所在的列位于前一行先导元素的右边.
- 某一先导元素所在列下方元素都是零.
若一个阶梯形矩阵还满足以下性质,则称它为简化阶梯形(或简化行阶梯形)- 每一非零行的先导元素是1
- 每一先导元素1是该元素所在列的唯一非零元素.
若一个矩阵具有阶梯形(简化阶梯形),就称它为阶梯形(简化阶梯形)矩阵.
实现复杂神经网络的思想:在面向对象语言中构造类,把相同的块封装成一个类来减少代码冗余
Inception Module
在构建神经网络中,往往对于网络的超参数比较难以选择,例如卷积核的大小。
可以并行使用卷积核,神经网络能够自动进行权重的选择,找到最优的卷积组合。
卷积运算参数量计算:
$192@28\times 28 $ -> $5\times 5$Convolution -> $32@28\times 28$
Operations:$5^2\times 28^2 \times 192 \times 32$
代码实现Inception Module1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35# -*- coding: UTF-8 -*-
import torch
import torch.nn as nn
import torch.nn.functional as F
class InceptionA(nn.Module):
def __init__(self,in_channels):
super(InceptionA,self).__init__()
self.branch1x1 = nn.Conv2d(in_channels=in_channels,out_channels=16,kernel_size=1)
self.branch5x5_1 = nn.Conv2d(in_channels=in_channels,out_channels=16,kernel_size=1)
self.branch5x5_2 = nn.Conv2d(in_channels=16,out_channels=24,kernel_size=5,padding=2)
self.branch3x3_1 = nn.Conv2d(in_channels=in_channels,out_channels=16,kernel_size=1)
self.branch3x3_2 = nn.Conv2d(in_channels=16,out_channels=24,kernel_size=3,padding=1)
self.branch3x3_3 = nn.Conv2d(in_channels=24,out_channels=24,kernel_size=3,padding=1)
self.branch_pool = nn.Conv2d(in_channels=in_channels,out_channels=24,kernel_size=1)
def forward(self,x):
branch1x1 = self.branch1x1(x)
branch5x5 = self.branch5x5_1(x)
branch5x5 = self.branch5x5_2(branch5x5)
branch3x3 = self.branch3x3_1(x)
branch3x3 = self.branch3x3_2(branch3x3)
branch3x3 = self.branch3x3_3(branch3x3)
branch_pool = F.avg_pool2d(x,kernel_size=3,stride=1,padding = 1)
branch_pool = self.branch_pool(branch_pool)
out_puts = [branch1x1,branch5x5,branch3x3,branch_pool]
return torch.cat(out_puts,dim=1)
1 | class Net(nn.Module): |
torchversion工具包提供数据集1
2
3
4
5
6
7
8
9
10import torchvision
# MINIST数据集 手写数字识别
train_set = torchvision.datasets.MNIST(root='./datast/minist',train=True,download=True)
test_set = torchvision.datasets.MNIST(root='./datast/minist',train=False,download=True)
# cifar10数据集 10分类数据集,猫、狗...
train_set = torchvision.datasets.CIFAR10(root='./datast/cifar10',train=True,download=True)
train_set = torchvision.datasets.CIFAR10(root='./datast/cifar10',train=False,download=True)