2.1 神经元模型
梯度为各个向量的偏导数组成的向量
f=wx+b
IndentationError: unindent does not match any outer indentation level
占位问题 一定要用同样的tab来进行代码对齐!
推导两个导数的函数公式如下:
然后用代码表示出:
- 初始化一个加了误差的模型的数据
- 计算这个模型和真实数据的误差
- 计算梯度(b和w的导数参照上面的公式)
- 梯度更新(自己定义计算训练的次数 更新依照x=x-学习率*梯度
代码如下 :主要就是按照以上流程进行
import tensorflow as tf
import sys
import numpy as np
#采样数据
data=[]
for i in range (100): #循环采样100次
x=np.random.uniform(-10.,10.) #均匀分布的U中随机采样数据x
eps =np.random.normal(0.,0.01) #噪声
y=1.477*x+0.089+eps
data.append([x,y])
data=np.array(data) #转化为2维数组
#计算误差
#循环计算每个点与真实值的差的平方和 以获得均方误差
def mse(w,b,points):
totalError=0
for i in range(0,len(points)): #循环迭代所有的点
x=points[i,0] #获得i号点的x
y=points[i,1] #获得i号点的y
totalError=(y-(w*x+b))**2
return totalError/float(len(points)) #获得均方差
#计算梯度
def step_gradient(b_current,w_current,points,lr):
b_gradient=0 #计算函数误差在所有点上的导数,并更新w,b
w_gradient=0
M=float(len(points)) #总样本数
for i in range(0,len(points)):
x=points[i,0]
y=points[i,1]
b_gradient += (2/M) * ((w_current*x+b_current)-y) #函数对b的导数
w_gradient += (2/M) * ((w_current*x+b_current)-y) * x #函数对w的导数
new_b = b_current - (lr * b_gradient) #根据算法更新w b其中lr是学习率
new_w = w_current - (lr * w_gradient)
return [new_b, new_w]
#梯度更新 根据 x=x-(学习率)* (导数)
def gradient_descent(points, starting_b, starting_w, lr, num_iterations):
b = starting_b # b的初始值 # 循环更新 w,b 多次
w = starting_w # w的初始值
for step in range(num_iterations): # 根据梯度下降算法更新多次
b, w = step_gradient(b, w, np.array(points), lr) # 计算梯度并更新一次
loss = mse(b, w, points) # 计算当前的均方差,用于监控训练进度
if step%50 == 0: # 打印误差和实时的 w,b 值
print(f"iteration:{step}, loss:{loss}, w:{w}, b:{b}")
return [b, w] # 返回最后一次的 w,b
def main():
lr=0.01 #学习率
initial_b = 0 # 初始化b为0
initial_w = 0 # 初始化w为0
num_iterations = 1000 # 训练优化1000次,返回最优w*,b*和训练Loss的下降过程
[b, w] = gradient_descent(data, initial_b, initial_w, lr, num_iterations)
loss = mse(b, w, data) # 计算最优数值解w,b上的均方差
print(f'Final loss:{loss}, w:{w}, b:{b}')
但是这个代码块并没有运行出结果 ,没有输出
希望可以帮助到你!