简单的来说神经网络就是通过梯度下降来达到目的的一种算法。
其公式为:
递归函数:
这函数是神经网络的逻辑函数
(w的维度为(n,1)在单层神经网络中n一般等于输入值个数)
(为激活函数)
损失函数:
神经网络的学习过程就是不断的进行梯度下降来获取权重参数的过程,学习过程就是以该损失函数为基准,找出能使它的值达到最小的权重函数。损失函数还是前向传播的终点也是反向传播的起点,损失函数将预测的输出值与实际输出值进行运算,得出的结果越小,训练模型越好。
成本函数:
成本函数的目的是求解w,b使得全局的J(w,b)最小。
引用相应的库:
import numpy as np
初始化w,b:
def initialize_with_zeros(dim):
"""
这个函数用于初始化权重数组w和偏置/阈值b.
参数:
dim -- w的大小,看上面的神经网络模型图可知,dim在本例中是12288,因为一个特征输入对应一个权重。
返回值:
w -- 权重数组
b -- 偏置bias
"""
w = np.zeros((dim,1))
b = 0
return w, b
进行前向传播与反向传播:
def propagate(w, b, X, Y):
"""
参数:
X -- 输入值,
Y -- 输入值对应的标签,
返回值:
cost -- 成本
dw -- w的梯度
db -- b的梯度
"""
m = X.shape[1]
# 前向传播
A = U(np.dot(w.T, X) + b) #U代表激活函数,需要自己设定
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
进行梯度下降;
def optimize(w, b, X, Y, num_iterations, learning_rate, print_cost = False):
"""
参数:
num_iterations -- 循环次数
learning_rate -- 学习率
print_cost -- 为True时,每优化50次就把成本cost打印出来,以便我们观察成本的变化
返回值:
params -- 优化后的w和b
costs -- 每优化50次,将成本记录下来,成本越小,表示参数越优化
"""
costs = []
for i in range(num_iterations):
grads, cost = propagate(w, b, X, Y) # 计算得出梯度和成本
# 从字典中取出梯度
dw = grads["dw"]
db = grads["db"]
# 进行梯度下降,更新参数,使其越来越优化,使成本越来越小
w = w - learning_rate * dw
b = b - learning_rate * db
# 将成本记录下来
if i % 50 == 0:
costs.append(cost)
if print_cost:
print ("优化%i次后成本是: %f" %(i, cost))
params = {"w": w,
"b": b}
return params, costs
以上工具函数数便已经准备好了,那么便可以将其整合成主函数:
def model(X_train, Y_train, num_iterations = 自己设定, learning_rate =自己设定 , print_cost = False):
"""
参数:
X_train -- 训练输入值
Y_train -- 训练输入值对应的标签
num_iterations -- 优化多少次
learning_rate -- 学习率
print_cost -- 为True时,每优化50次就把成本cost打印出来,以便我们观察成本的变化
返回值:
d -- 返回一些信息
"""
# 初始化待训练的参数
w, b = initialize_with_zeros(X_train.shape[0])
# 使用训练数据来训练/优化参数
parameters, costs = optimize(w, b, X_train, Y_train, num_iterations, learning_rate, print_cost)
# 从字典中分别取出训练好的w和b
w = parameters["w"]
b = parameters["b"]