深度学习入门笔记
编程语言和库
-
Python 3.x
-
NumPy
-
Matplotlib
常用运算
Numpy
import numpy as np
x = np.array([1.0,2.0])
y = np.arange(0,6,0.1) #以0.1为单位,生成0到6的数据
print(x.shape,x.ndim,x.dtype)
X = np.array([[1.0,2.0],
[3.0,4.0]])
x = x.flatten() #将x转换为一维数组
x[np.array([0,1])] #获取索引为0,1的元素
x < 2 #布尔类型的array数组
Z = X.reshape() #改变多维数组的形式
G = X.dot(y) #矩阵乘法 X,y满足前行乘后列一一对应
np.argmax(x) #取出数组中的最大值的索引,将获取被赋给参数x的数组中的最大值元素的索引
batch_mask = np.random.choice(train_size,batch_size) #得到一个包含被选数据的索引的数组 batch_size是选取个数 train_size是被选数组
grad = np.zeros_like(x) # 生成和x形状相同的数组
W = np.random.randn(2,3) # 用高斯分布进行初始化 随机
Matplotlib
Matplotlib 是用于绘制图形的库,使用Matplotlib可以轻松地绘制图形和实现数据的可视化。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.image import imread
x = np.arange(0,6,0.1)
y = np.sin(x)
plt.plot(x,y,linestyle='-',color='red',lable='sin')
plt.xlabel("x") #x轴标签
plt.ylabel("y") #y轴标签
plt.xlim(-1,7) #指定x轴的范围
plt.ylim(-0.1,1.1) #指定y轴的范围
plt.title('sin & cos') #标题
plt.legend()
img = imread('lena.png')
plt.imshow(img)
plt.show()
lambda表示法
Python中定义简单的函数
f = lambda w:net.loss(x,t)
# 等同于 f(W) W是伪参数
def f(W):
return net.loss(x,t)
常见知识点
输入层 隐藏层 输出层
权重 偏重
激活函数(activation function)
- 阶跃函数 线性的 折跃的
- sigmoid函数 平滑的
- ReLU(Rectified Linear Unit)函数 非常常用的
- identity_function(x) 输出层激活函数
维度
第一个维度对应第0维
二维数组称为矩阵(matrix)
数组的横向排列称为行(row),纵向排列称为列(column)
矩阵的第0维是列方向,第1维是行方向 axis = 1
预处理(pre-processing) 对神经网络的输入数据进行某种既定的转换称为预处理
-
正规化(normalization)
把数据限定到某个范围内的处理称为正规化
批处理(batch processing)
批处理对计算机的运算大有利处,可以大幅缩短每张图像的处理时间
batch_size = 100 #批数量
accuracy_cnt = 0
for i in range(0,len(x),batch_size):
x_batch = x[i:i+batch_size]
y_batch = predict(network,x_batch)
p = np.argmax(y_batch,axis=1)
accuracy_cnt += np.sum(p == t[i:i+batch_size])
print("Accuracy:" + str(float(accracy_cnt) / len(x))
深度学习
有时也称为端到端机器学习(end-to-end machine learning)
训练数据(监督数据)用来学习 寻找最优的参数
测试数据 评价模型的泛化能力
泛化能力 指处理未被观察过的数据的能力
拟合
- 过拟合 只对某个数据集过度拟合的状态称为过拟合(over fitting)不在训练数据中的数字图像却无法被识别的现象
- 低拟合
损失函数(loss function)
神经网络以某个指标为线索寻找最优权重参数 这个指标就是损失函数
-
均方误差(mean squared error)
最小结果就是最优解
-
交叉熵误差(cross entropy error)
交叉熵误差的值是由正确解标签所对应的输出结果决定的
one-hot表示法 将正确解标签表示为1,其他标签表示为0的表示法
mini-batch
让损失函数实现对所有训练数据计算,最后还要除于N进行正规化
从所有训练数据中随机选取一部分数据进行训练(称为mini-batch,小批量),然后对每个mini-batch进行学习
# mini-batch版交叉熵误差
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
梯度(参数的导数)
- 导数是负的,通过使该权重参数向正方向改变,可以减少损失函数的值
- 相反,通过使该权重参数向负方向改变,可以减少损失函数的值
数值微分
梯度法使用梯度的信息决定前进的方向 求导数确定单减方向
numerical_diff(f, x)
来源于数值微分的英文numerical differentiation
这个函数有两个参数,即“函数f”和“传给函数f的参数x”
舍入误差(rounding error)
指因省略小数的精细部分的数值(比如,小数点第8位以后的数值)而造成最终的计算结果上的误差
计算函数f在(x + h)和(x − h)之间的差分
因为这种计算方法以x为中心,计算它左右两边的差分,所以也称为中心差分(而(x + h)和x之间的差分称为前向差分)
def numerical_diff(f, x):
h = 1e-4 # 0.0001
return (f(x+h) - f(x-h)) / (2*h)
偏导数
我们把这里讨论的有多个变量的函数的导数称为偏导数
def function_2(x):
"""
x0,x1:多变量
f(x0,x1) = x0**2 + x1**2
"""
return x[0]**2 + x[1]**2
梯度(多变量)
由全部变量的偏导数汇总而成的向量称为梯度(gradient)
def numerical_gradient(f, x):
h = 1e-4 # 0.0001
grad = np.zeros_like(x) # 生成和x形状相同的数组
for idx in range(x.size):
tmp_val = x[idx]
# f(x+h)的计算
x[idx] = tmp_val + h
fxh1 = f(x)
# f(x-h)的计算
x[idx] = tmp_val - h
fxh2 = f(x)
grad[idx] = (fxh1 - fxh2) / (2*h)
x[idx] = tmp_val # 还原值
return grad
梯度法
在梯度法中,函数的取值从当前位置沿着梯度方向前进一定距离,然后在新的地方重新求梯度,再沿着新梯度方向前进, 如此反复,不断地沿梯度方向前进。像这样,通过不断地沿梯度方向前进, 逐渐减小函数值的过程就是梯度法(gradient method)。
-
梯度下降法(gradient descent method)
寻找最小值的梯度法
-
梯度上升法(gradient ascent method)
寻找最大值的梯度法
学习率
超参数
超参数需要尝试多个值,以便找到一种可以使学习顺利 进行的设定
梯度法的数学公式
η表示更新量,在神经网络的学习中,称为学习率(learning rate)。学习率决定在一次学习中,应该学习多少,以及在多大程度上更新参数。人工设置
- 不能过大
- 不能过小
def gradient_descent(f, init_x, lr=0.01, step_num=100):
"""
f:function_2(x) 要进行优化的函数
init_x:变量x数组 初始值
lr:learning rate学习率
step_num:梯度法的重复次数
"""
x = init_x
for i in range(step_num):
grad = numerical_gradient(f, x)
x -= lr * grad
return x
神经网络的梯度
损失函数关于权重参数的梯度,即损失函数关于权重参数的导数
神经网络的学习
-
mini-batch
从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减小mini-batch的损失函数的值。
-
计算梯度
为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向(这里的梯度是损失函数关于权重参数的)
-
更新参数
将权重参数沿梯度方向进行微小更新。
超参数:学习率
-
重复
重复步骤1、步骤2、步骤3
涉及到重复次数、epoch
常见函数
阶跃函数 隐藏层激活函数 线性函数 与神经网络的区别
def step_function(x):
y = x > 0
return y.astype(np.int)
sigmoid函数 隐藏层激活函数 非线性函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
ReLU函数 隐藏层激活函数 非线性函数
def relu(x):
return np.maximum(0,x)
identity_function函数 输出层 激活函数 恒等函数 回归问题用该函数
def identity_function(x):
return x
forward函数 从输入到输出方向的传递处理
def forward(network,x):
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2, W3) + b3
y = identity_function(a3)
return y
predict函数 进行推理
def forward(network,x):
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2, W3) + b3
y = softmax(a3)
return y
softmax函数 输出总和为1是softmax函数的一个重要特性 输出可以解释为“概率” 输出层 激活函数 分类问题用
不改变原来元素之间的大小关系 只是让数控制在0 ~ 1之间 总和为 1 能够视为概率
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c) # 溢出对策
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
均方误差(mean squared error)损失函数
def mean_squared_error(y,t):
"""
y:softmax函数的输出
t:监督数据
"""
return 0.5 * np.sum((y-t)**2)
交叉熵误差(cross entropy error)损失函数
def cross_entropy_error(y, t):
"""
delta:预处理 防止溢出
y:softmax函数的输出 输出越大 交叉熵误差越小 为1时,误差为0
"""
delta = 1e-7
return -np.sum(t * np.log(y + delta))
标签:return,函数,梯度,batch,笔记,深度,np,def,入门
From: https://www.cnblogs.com/libuqiong/p/16990872.html