Tensorflow机器学习,学习反向传播过程

本文介绍了Tensorflow机器学习中的反向传播过程,详细阐述了反向传播的定义,它通过梯度下降法最小化损失函数。重点讨论了均方误差作为损失函数的概念和计算方式,并说明了反向传播的训练方法,特别是学习率的作用。最后,通过代码展示了结合前向传播实现神经网络的完整过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tensorflow机器学习,学习反向传播过程

简介

——搭建一个简单的神经网络

——前向传播

——方向传播过程

——八股之正则化

1,反向传播的定义

BP算法(即误差反向传播算法)适合于多层神经元网络的一种学习算法,它建立在梯度下降法的基础上。BP网络的输入输出关系实质上是一种映射关系:一个 输入m输出的BP神经网络所完成的功能是从 维欧氏空间向m维欧氏空间中一有限域的连续映射,这一映射具有高度非线性。它的信息处理能力来源于简单非线性函数的多次复合,因此具有很强的函数复现能力。这是BP算法得以应用的基础。

—— 简单来说,反向传播就是训练参数模型,在所有参数上用梯度下降的方式,使NN模型在训练数据上的损失最小。
—— 损失函数(loss):指预测的值 (y) 与已知的标准答案 (y_)的差距
而损失函数的计算可以用很多种方法,下面,我们就来讲其中的一个方法,均方误差

—(1)均方误差(MSE)的概念均方误差

它的意思是从 i 开始到之后每个预测值 yiy_i 的差的平方求和,再除以n个样本数

—(2)均方误差用函数表示:

loss = tf.reduce_mean(tf.square(y-y_))

2,反向传播的训练方法

反向传播训练的方法主要以减小loss值为优化目标
它主要用到的函数如下

train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)

我们采用第一种方法,你也可以尝试其他方法看看优化的效果有什么不同
——其中, learning_rate是学习率,什么是学习率呢?就是决定参数每次更新幅度的数(可以理解为每次学习的幅度大小)

3,接下来,我们用代码结合上一章内容(前向传播)来实现整个神经网络过程

前向传播过程

不理解的朋友,在代码中已经有非常详细的注释了

# coding:utf-8
# 导入模块,生成模拟数据集
import tensorflow as tf
import numpy as np

BATCH_SIZE = 8
seed = 666

# 基于seed生产随机数
rng = np.random.RandomState(seed)
# 随机数返回32行2列的矩阵 表示32组 体积和重量 作为输入数据集
X = rng.rand(32, 2)
# 从X这个32行2列的矩阵中 取出一行 判断如果和小于1 给Y赋值1 如果和不小于1 给Y赋值0
# 作为输入数据集的标签(正确答案)
Y = [[int(x0 + x1 < 1)] for (x0, x1) in X]
print("X:\n", X)
print("Y:\n", Y)

# 定义神经网络的输入、参数和输出,定义前向传播过程
x = tf.placeholder(tf.float32, shape=(None, 2))
y_ = tf.placeholder(tf.float32, shape=(None, 1))
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=2))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=2))

a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

# 2定义损失函数及反向传播方法
loss = tf.reduce_mean(tf.square(y - y_))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
# train_step = tf.train.MomentumOptimizer(0.991,0.9).minimize(loss)
# train_step = tf.train.AdamOptimizer(0.001).minimize(loss)

# 生成会话, 训练STEPS轮
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    # 输出目前(未经训练) 的参数取值。
    print("w1:\n", sess.run(w1))
    print("w2:\n", sess.run(w2))
    print("\n")

    # 训练模型
    STEPS = 3000
    for i in range(STEPS):
        start = (i * BATCH_SIZE) % 32
        end = start + BATCH_SIZE
        sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
        if i % 500 == 0:
            total_loss = sess.run(loss, feed_dict={x: X, y_: Y})
            print("After %d training step(s), loss on all data is %g" % (i, total_loss))

    # 输出训练后的参数取值
    print("\n")
    print("w1:\n", sess.run(w1))
    print("w2:\n", sess.run(w2))

结果为

X:
WARNING: Logging before flag parsing goes to stderr.
 [[0.70043712 0.84418664]
 [0.67651434 0.72785806]
 [0.95145796 0.0127032 ]
 [0.4135877  0.04881279]
 [0.09992856 0.50806631]
 [0.20024754 0.74415417]
 [0.192892   0.70084475]
 [0.29322811 0.77447945]

 [0.00510884 0.11285765]
 [0.11095367 0.24766823]
 [0.0232363  0.72732115]
 [0.34003494 0.19750316]
 [0.90917959 0.97834699]
 [0.53280254 0.25913185]
 [0.58381262 0.32569065]
 [0.88889931 0.62640453]
 [0.81887369 0.54734542]
 [0.41671201 0.74304719]
 [0.36959638 0.07516654]
 [0.77519298 0.21940924]
 [0.07934213 0.48678052]
 [0.1536739  0.82846513]
 [0.19136857 0.27040895]
 [0.56103442 0.90238039]
 [0.85178834 0.41808196]
 [0.39347627 0.01622051]
 [0.29921337 0.35377822]
 [0.89350267 0.78613657]
 [0.77138693 0.42005486]
 [0.77602514 0.46430814]
 [0.18177017 0.8840256 ]
 [0.71879227 0.6718813 ]]
Y:
 [[0], [0], [1], [1], [1], [1], [1], [0], [1], [1], [1], [1], [0], [1], [1], [0], [0], [0], [1], [1], [1], [1], [1], [0], [0], [1], [1], [0], [0], [0], [0], [0]]

w1:
 [[-0.85811085 -0.19662298  0.13895045]
 [-1.2212768  -0.40341285 -1.1454041 ]]
w2:
 [[-0.85811085]
 [-0.19662298]
 [ 0.13895045]]


After 0 training step(s), loss on all data is 0.785053
After 500 training step(s), loss on all data is 0.452825
After 1000 training step(s), loss on all data is 0.443921
After 1500 training step(s), loss on all data is 0.443254
After 2000 training step(s), loss on all data is 0.442924
After 2500 training step(s), loss on all data is 0.442648


w1:
 [[-0.7031774  -0.16427353  0.07961477]
 [-1.118631   -0.38113183 -1.1755049 ]]
w2:
 [[-0.5047402 ]
 [-0.09774721]
 [ 0.27635282]]

以上就是整个神经网络的传播过程了,不懂的朋友留言评论,互相学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值