深度学习入门——鱼书笔记
第三章 神经网络
3.1激活函数
概念:将输入信号的总和转换为输出信号
图中,x1,x2,b 的输出总和为a,通过h()激活函数 转换为y这个输出信号
朴素感知机与多层感知机(神经网络)的主要区别就是是否使用了sigmoid这样的平滑激活函数
3.2 sigmoid函数
公式:
阶跃函数的代码实现:
def step_function(x):
if x>0:
return x #只有当x大于0时返回原值
else:
return 0
上面的代码只适用于x为实数,若x为Numpy数组则需改进代码:
def set_function(x):
y=x>0 #对x这个Numpy矩阵进行x>0的操作会返回给y一个bool类型的矩阵
return y.astype(np.int) #将y矩阵中True作为1输出,False作为0输出
sigmoid函数代码实现
def sigmoid(x):
return 1/(1+np.exp(-x))
上述代码同样适用于x是Numpy矩阵的情况,因为np.exp会产生Numpy矩阵,其余的运算会进行广播运算
sigmoid图像代码的实现
x= np.arange(-5.0,5.0,0.1)#产生一个Numpy数组,从-5.0到5.0 中间间隔为0.1
y=sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1,1.1) #y轴范围为-0.1——1.1
plt.show()
sigmoid与阶跃函数的不同:
1.sigmoid函数曲线是平滑变化的,而阶跃函数的变化是突变
2.第二点不同书上说的是会返回0-1之间的实数,个人感觉与第一点不同是相通的
共同点:
- 会对重要的信息进行输出增大,而对重要性偏小的信息进行缩小
- 两者都属于非线性函数
神经网络的激活函数必须使用非线性函数,因为使用线性函数的话,加深神经网络的层数就没有意义了
我的理解是:当对y=ax+b的输出y再进行y1=ay+b操作之后 最终还是能用一个线性y=ax+b来表示,所以不管叠加多少层,效果等同于一层线性
3.3 Relu函数
Relu函数的代码实现:
def relu(x):
return np.maximum(0,x) #当值小于0时输出0,当值大于0时输出x的原值
3.4 多维数组的运算
(重点,个人感觉如果对数组的运算不熟练后面对神经网络各个权重的数量会很模糊,不利于理解整个网络的构造)
A=np.array([1,2,3,4])
np.ndim(A)#获得A数组的维度,输出:1
A.shape#获得A数组的形状,输出(4,)代表4列
A.shape[0]#获得A数组的列数,输出4
二维数组
>>> B = np.array([[1,2], [3,4], [5,6]])
>>> print(B)
[[1 2]
[3 4]
[5 6]]
>>> np.ndim(B)
2
>>> B.shape#代表3行2列
(3, 2)
矩阵的乘法:
具体乘法的计算可以看线性代数中的方法,np中的实现是用
np.dot(A,B)#A*B矩阵
np.dot(A,B)!=np.dot(B,A)
矩阵点乘:左边矩阵的列数要等于右边矩阵的行数
神经网络的内积:
总结:矩阵的行数等于输入的数据量,列数为输出的数据量
3.5 softmax函数
但由于计算机运算上有一定的缺陷,所以会有溢出问题,需要进行改进
3.6 mnist数据集
load_mnist函数以“(训练图像 ,训练标签 ),(测试图像,测试标签 )”的 形式返回读入的MNIST数据。
normalize:表示是否将输入图像正规化
flatten:是否展开成一维数组
one_hot_label:是否将标签表示为one-hot(比如当label为2时,其余标签都为0,2 的标签为1的数组,若不开启这个选项,则label表示成2)
import sys, os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
from PIL import Image
def img_show(img): #定义imageshow的函数
pil_img = Image.fromarray(np.uint8(img))#接受的img是Numpy函数或者一维数组,fromarray函数将其转换成PIL对象,np.uint8是一个数据类型转换函数,将图像转换成无符号8位数,0-255
pil_img.show()
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True,
normalize=False) #其中x-train 有60000行,784列,t-train有60000行,1列,测试集为10000个元素
img = x_train[0] #取x-train的第1个一维数组,也就是图像的数据
label = t_train[0] #取t-train的第1个标签内容
print(label) # 5
print(img.shape) # (784,) 是一个784长度的一维数组
img = img.reshape(28, 28) # 把图像的形状变成原来的尺寸
print(img.shape) # (28, 28)
img_show(img)
3.7 批处理
x, t = get_data()
network = init_network()
batch_size = 100 # 批数量
accuracy_cnt = 0
for i in range(0, len(x), batch_size): #range(起点,终点,步伐) 代表每次取batch—size的数据,从0取到len(x)-1
x_batch = x[i:i+batch_size]
y_batch = predict(network, x_batch)
p = np.argmax(y_batch, axis=1) #argmax输出的是axis=1 第1维度上最大元素的下标
accuracy_cnt += np.sum(p == t[i:i+batch_size])#p和t都是Numpy数组,用==来判断会生成True和False组成的数组,np.sum会统计其中True的个数
print("Accuracy:" + str(float(accuracy_cnt) / len(x)))