卷积神经网络
基于CNN的一个网络  全连接层是指相邻神经元之间都有连接。CNN中,有时将卷积层的输入输出数据成为特征图。
全连接层的问题
全连接层会忽视输入数据的形状,比如输入数据是一张图像,图像通常是3维数据,包括长,宽,通道,但是向全连接层输入时,需要将3维数据拉平为1维。通常,形状包含了某些重要的空间信息。
卷积运算

填充
有时在进行卷积层处理之前,要向输入数据的周围填入固定的数据(比如0),称为填充。使用填充主要是为了调整输出的大小。比如,对大小为(4,4)的输入数据应用(3,3)滤波器(有时也被称为核),输出大小变为(2,2).如果多次进行卷积运算,那么某个时刻输出数据的大小可能变为1,为了避免这种情况,对数据进行填充。

步幅
应用滤波器的位置的间隔称为步幅。增大步幅之后,输出大小会变小。
 数据输出规模的计算公式:式中要分别可以除尽,在部分框架中会报错,或者向最近的整数四舍五入。 
3维数据的卷积运算
通道方向上有多个特征图时,会按通道进行输入数据和滤波器的卷积运算,并将结果相加,从而得到输出。滤波器的通道数要和输入数据的通道数一致,大小可以设定为任意值,不过每个通道上的大小要一致。

池化层
池化是缩小高,长方向上的空间的运算,将一个范围内的数据集约成一个元素的处理,缩小空间的大小。一般来说,池化的窗口大小会和步幅设定成相同的值。常见的池化有MAX池化和Average池化。在图像识别领域,主要使用MAX池化。
池化的特征:
- 没有要学习的参数
- 通道数不发生变化
- 对微小的位置变化具有鲁棒性
卷积层的实现
class Convolution:
def __init__(self, w, b, stride = 1, pad = 0):
self.w = w
self.b = b
self.stride = stride
self.pad = pad
def forward(self, x):
FN, C, FH, FW = self.w.shape
N, C, H, W = x.shape
out_h = int(1 + (H + 2 * self.pad - FH) / self.stride)
out_w = int(1 + (W + 2 * self.pad - FW) / self.stride)
col = im2col(x, FH, FW, self.stride)
col_w = self.w.reshape(FN, -1).T
out = np.dot(cpl, col_w) + self.b
out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2)
return out
池化层的实现
在通道方向上独立,池化的应用区域按通道单独展开。
class Pooling:
def __init__(self, pool_h, pool_w, stride = 1, pad = 0):
self.pool_h = pool_h
self,pool_w = pool_w
self.stride = stride
self.pad = pad
def forward(self, x):
N, C, H, W = x.shape
out_h = int(1 + (H - self.pool_h) / self.stride)
out_w = int(1 + (W - self.pool_w) / self.stride)
col = im2col(x, self.pool_h, self.pool_w, self.stride, self.pad)
col = col.reshape(-1, self.pool_h * self.pool_w)
out = np.max(col, axis = 1)
out = out.reshape(N, out_h, out_w, C).transpose(0, 3, 1, 2)
return out
最具代表性的CNN
两者的区别:
- 激活函数不同,LeNet使用sigmoid函数,现在的CNN主要使用Relu函数
- LeNet使用子采样缩小中间数据的大小,现在的CNN池化是主流
- AlexNet使用Dropout
深度学习
深度学习是加深了层的深度神经网络
加深层的好处
减少网络的参数数量
深度学习的高速化
强化学习
强化学习的基本框架是,代理根据环境选择行动,然后通过这个行动改变环境。根据环境的变化,代理获得某种报酬。强化学习的目的是决定代理的行动方针,以获得更好的报酬。

在使用了深度学习的强化学习方法中,有一个叫做Deep Q-Network (DQN)方法。该方法基于被称为Q学习的强化学习方法。在Q学习中,为了确定最合适的行动,需要确定一个被称为最优行动价值函数的函数。为了近似这个函数,DQN使用了深度学习。
|