相关介绍
目前在在跟着大佬学习人工智能,学了两个章节后,感觉自己学的不是很通透,所以想试试写下来会不会好一点,也是给自己做一个总结。
人工智能算法,是仿照人大脑中神经元的构成和运行的机制所提出的算法。
上图就是一个神经元的示意图,从多个触角上进行输入,每个触角的权重不相同,权重与触角的输入相乘后决定一个人的行为。就比如说一个人面对水,他把手伸进去,决定他要不要拿出来的因素有几个,比如说水的温度,外界的温度,个人的体温等等,每个都有不同的权重。第一次不知道水温的时候,就是试探,之后再决定伸进去与否,这个过程就是权重的调节。而人工智能就是仿照这么一个过程,在不断调节权重的过程中,最终实现想要的结果的一个过程。
这几天学习了一个单神经元的人工智能算法,对于是或者不是的选择上有着比较好的应用。下面,我就分享一个单神经元情况下的人工智能算法的思路和代码。上文我们说到,人工智能算法是一个不断计算和调节的过程,想必大家高中的时候就学过求导的运算,但是那个时候的其实算是一种理想情况的求导,而现在我们需要利用实际的计算值实现实际值和理想值之间的误差,在通过学习率调节权重变化的速率,最终达到相对理想的一个权重效果。
既然涉及到求导的问题,这里需要大家去复习一下链式法则(这个以后的博文会出现,本文只是人工智能的一个记录帖),通过链式法则进行反向求导。下面我先展示一下,单个神经元的人工智能算法的思维导图:
之后是涉及到的一些函数及相关函数用法的简单表达(更复杂的以后会相继给大家更新):
所需函数
以上便是各种函数以及各种函数的用法,下面进入实战环节:
首先我们要加载几个用到的库:
import numpy as np #科学计算的库
import matplotlib.pyplot as plt #画图的库
import h5py #h5数据类型读取的库
数据的读取和存储
我们要实现数据的读取,先编写一个能够读取数据集的函数:
def load_data():
train_dataset = h5py.File('datasets/train_catvnoncat.h5',"r") #加载训练数据集
train_set_x_orig = np.array(train_dataset["train_set_x"][ : ]) #加载数据集中的图片特征数据
train_set_y_orig = np.array(train_dataset["train_set_y"][ : ]) #加载标签数据(已经预处理过,确定了那些是那些不是)
test_dataset = h5py.File('datasets/test_catvnoncat.h5',"r") #加载测试数据集
test_set_x_orig = np.array(test_dataset["test_set_x"][:])
test_set_y_orig = np.array(test_dataset["test_set_y"][:])
classes = np.array(test_dataset["list_classes"][ : ]) #加载标签类别数据
train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0])) # 把数组的维度从(209,)变成(1, 209)
test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0])) # 从(50,)变成(1, 50)
return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes
激活函数
激活函数在思维导图中也写了,是为了提高学习的效率和最后的结果,也就是提升整个人工智能的智商。前面所进行的计算全都是线性的,而激活函数最大的最用就是打破线性的约束条件,强化网络学习的能力,所以激活函数最大的特点就是非线性,而且不同的激活函数也有不同的特点。常用的激活函数大家可以转到下面这个帖子去看看:链接: https://zhuanlan.zhihu.com/p/73214810.
本次单个神经元的网络使用的是Sigmoid函数,函数的值域是(0,1):
def sigmoid(z):
s = 1 / (1 + np.exp(-z)) #z可以是一个数值,也可以是一个数组,结果与之相对应
return s
参数初始化
在单个神经元的人工智能函数中,可以对权重数组w和偏量数组b(个人觉得有点像线性回归函数里后面在y轴上的轴距)全部初始化为0(神经网络中是不可以对权重设置为0的):
def initialize_with_zeros(dim):
w = np.zeros((dim, 1))
b = 0
return w, b
损失函数
损失函数,就是利用正向传导(学习已知结果的图片)和反向传导(计算误差,也就是求导的过程)实现对参数变化过程的计算,方便在学习函数中进行参数的学习和调节。损失函数的种类也有很多种,需要根据自己的实际需要进行选择,有需要的可以看看下面这个帖子:链接: https://zhuanlan.zhihu.com/p/58883095.下面使用的是交叉熵损失函数:
def propagate(w, b, X, Y):
m = X.shape[1]
# 前向传播
A = sigmoid(np.dot(w.T, X) + b)
cost = -np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A)) / m
# 反向传播
dZ = A - Y
dw = np.dot(X, dZ.T) / m
db = np.sum(dZ) / m
# 将dw和db保存到字典里面,这里就是确定权重和偏置量变化量的过程
grads = {
"dw": dw,
"db": db}
return grads, cost
学习函数
学习,顾名思义:就像人类学习的过程一样,通过不断微调自己的行为达到一个自己理想值的情况,每个人的学习过程也受到个人天赋的影响,学习率高,就少学几次