1.感知机是神经网络的起源。
2.偏置决定了神经元被激活的容易程度。具体表现我为 y = wx + b b为偏置项 w为权重
3.常用激活函数及实现
1)阶越函数
y = x>0?1:0
实现:
def step_function(x):
return np.array(x > 0, dtype=np.int)
2)sigmoid函数
y = 1/(1+exp(-x))
实现:
def sigmoid(x):
return 1 / (1 + np.exp(-x))
3)ReLu函数
y = x>0?x:0
实现:
def relu(x):
return np.maximum(0, x)
4.输出层设计(softmax,)
Yk = exp(Ak)/sum(exp(Ai))
通常会大数溢出,
因此做个改动,都减去最大值,归1化处理。
实现:
def softmax(x):
x = x - np.max(x)
return np.exp(x) / np.sum(np.exp(x))
5 . 感知机与神经网络的区别
主要是激活函数不一样,感知机用的不连续的阶越函数,而神经网络一般用连续的RELU或者sigmoid函数。
6.批处理学习一下
7.损失函数
表示神经网络的恶劣程度,性能有多好。常用的损失函数有:
<1>均方误差
实现:
def mean_squared_error(y, t):
return 0.5 * np.sum((y-t)**2)
<2>交差商误差
def cross_entropy_error(y, t):
delta = 1e-7
return -np.sum(t * np.log(y + delta))
误差的值越小,表示与真实值越相近。
8.mini-batch学习
onehot 编码
def cross_entropy_error(y, t):
if y.ndim == 1:
t = t.reshape(1, t.size)
y = y.reshape(1, y.size)
batch_size = y.shape[0]
return -np.sum(t*np.log(y + 1e-7))/batch_size
包含非onehot编码
def cross_entropy_error1(y, t):
if y.ndim == 1:
t = t.reshape(1, t.size)
y = y.reshape(1, y.size)
if t.size == y.size:
t = t.argmax(axis=1)
batch_size = y.shape[0]
return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size
损失函数:
在进行神经网络的学习时,不能将识别精度作为指标。因为如果以识别精度为指标,则参数的导数在绝大多数地方都会变为0.
9.误差反向传播
激活层的实现:
1)RELU
class Relu:
def __init__(self):
self.mask = None
def forward(self, x):
self.mask = (x <= 0) #萃取小于等于0的数的坐标
out = x.copy()
out[self.mask] = 0 #将小于等于0的数置0
return out
def backward(self, dout):
dout[self.mask] = 0 #反向传播小于等于0 为0 大于零,原样
dx = dout
return dx
2)Sigmoid
class Sigmoid:
def __init__(self):
self.out = None
def forward(self, x):
out = sigmoid(x)
self.out = out
return out
def backward(self, dout):
dx = dout * (1.0 - self.out) * self.out
return dx
3)Affine层
class Affine:
def __init__(self, W, b):
self.W =W
self.b = b
self.x = None
self.dW = None
self.db = None
def forward(self, x):
self.x = x
out = np.dot(self.x, self.W) + self.b
return out
def backward(self, dout):
dx = np.dot(dout, self.W.T)
self.dW = np.dot(self.x.T, dout)
self.db = np.sum(dout, axis=0)
return dx
4)softmax-with-loss
class SoftmaxWithLoss:
def __init__(self):
self.loss = None
self.y = None #
self.t = None #
def forward(self, x, t):
self.t = t
self.y = softmax(x)
self.loss = cross_entropy_error(self.y, self.t)
return self.loss
def backward(self, dout=1):
batch_size = self.t.shape[0]
if self.t.size == self.y.size: #
dx = (self.y - self.t) / batch_size
else:
dx = self.y.copy()
dx[np.arange(batch_size), self.t] -= 1
dx = dx / batch_size
return dx
10.学习算法步骤
神经网络存在合适的权重和偏转,调整权重和偏转以便拟合训练数据的过程称为学习,神经网络的学习主要分成如下4个步骤:
步骤1 mini-batch
从训练数据中挑选一部分数据,称为mini-batch
步骤2 计算梯度
为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。
步骤3 更新参数
将权重参数沿梯度减小的方向进行微小更新。
步骤4 重复
重复步骤1,步骤2,步骤3,直至训练完成。