iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解TensorFlow2实现前向传播
  • 467
分享到

详解TensorFlow2实现前向传播

2024-04-02 19:04:59 467人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录概述会用到的函数张量最小值张量最大值数据集分批迭代截断正态分布relu 激活函数one_hotassign_sub准备工作train 函数run 函数完整代码概述 前向传播 (F

概述

前向传播 (Forward propagation) 是将上一层输出作为下一层的输入, 并计算下一层的输出, 一直到运算到输出层为止.

在这里插入图片描述

会用到的函数

在这里插入图片描述

张量最小值

```reduce_min``函数可以帮助我们计算一个张量各个维度上元素的最小值.

格式:


tf.math.reduce_min(
    input_tensor, axis=None, keepdims=False, name=None
)

参数:

  • input_tensor: 传入的张量
  • axis: 维度, 默认计算所有维度
  • keepdims: 如果为真保留维度, 默认为 False
  • name: 数据名称

张量最大值

```reduce_max``函数可以帮助我们计算一个张量各个维度上元素的最大值.

格式:


tf.math.reduce_max(
    input_tensor, axis=None, keepdims=False, name=None
)

参数:

  • input_tensor: 传入的张量
  • axis: 维度, 默认计算所有维度
  • keepdims: 如果为真保留维度, 默认为 False
  • name: 数据名称

数据集分批

from_tensor_slices可以帮助我们切分传入 Tensor 的第一个维度. 得到的每个切片都是一个样本数据.

在这里插入图片描述

格式:


@staticmethod
from_tensor_slices(
    tensors
)

迭代

我们可以调用iter函数来生成迭代器.

格式:


iter(object[, sentinel])

参数:
-object: 支持迭代的集合对象

  • sentinel: 如果传递了第二个参数, 则参数 object 必须是一个可调用的对象 (如, 函数). 此时, iter 创建了一个迭代器对象, 每次调用这个迭代器对象的__next__()方法时, 都会调用 object

例子:


list = [1, 2, 3]
i = iter(list)
print(next(i))
print(next(i))
print(next(i))

输出结果:

1
2
3

截断正态分布

truncated_nORMal可以帮助我们生成一个截断的正态分布. 生成的正态分布值会在两倍的标准差的范围之内.

在这里插入图片描述

格式:


tf.random.truncated_normal(
    shape, mean=0.0, stddev=1.0, dtype=tf.dtypes.float32, seed=None, name=None
)

参数:

  • shape: 张量的形状
  • mean: 正态分布的均值, 默认 0.0
  • stddev: 正态分布的标准差, 默认为 1.0
  • dtype: 数据类型, 默认为 float32
  • seed: 随机数种子
  • name: 数据名称

relu 激活函数

激活函数有 sigmoid, maxout, relu 等等函数. 通过激活函数我们可以使得各个层之间达成非线性关系.

在这里插入图片描述

激活函数可以帮助我们提高模型健壮性, 提高非线性表达能力, 缓解梯度消失问题.

one_hot

tf.one_hot函数是讲 input 准换为 one_hot 类型数据输出. 相当于将多个数值联合放在一起作为多个相同类型的向量.

格式:


tf.one_hot(
    indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None
)

参数:

  • indices: 索引的张量
  • depth: 指定独热编码维度的标量
  • on_value: 索引 indices[j] = i 位置处填充的标量,默认为 1
  • off_value: 索引 indices[j] != i 所有位置处填充的标量, 默认为 0
  • axis: 填充的轴, 默认为 -1 (最里面的新轴)
  • dtype: 输出张量的数据格式
  • name:数据名称

assign_sub

assign_sub可以帮助我们实现张量自减.

格式:


tf.compat.v1.assign_sub(
    ref, value, use_locking=None, name=None
)

参数:

  • ref: 多重张量
  • value: 张量
  • use_locking:
  • name: 数据名称

准备工作

在这里插入图片描述


import Tensorflow as tf

# 定义超参数
batch_size = 256  # 一次训练的样本数目
learning_rate = 0.001  # 学习率
iteration_num = 20  # 迭代次数

# 读取mnist数据集
(x, y), _ = tf.keras.datasets.mnist.load_data()  # 读取训练集的特征值和目标值
print(x[:5])  # 调试输出前5个图
print(y[:5])  # 调试输出前5个目标值数字
print(x.shape)  # (60000, 28, 28) 单通道
print(y.shape)  # (60000,)

# 转换成常量tensor
x = tf.convert_to_tensor(x, dtype=tf.float32) / 255  # 转换为0~1的形式
y = tf.convert_to_tensor(y, dtype=tf.int32)  # 转换为整数形式

# 调试输出范围
print(tf.reduce_min(x), tf.reduce_max(x))  # 0~1
print(tf.reduce_min(y), tf.reduce_max(y))  # 0~9

# 分割数据集
train_db = tf.data.Dataset.from_tensor_slices((x, y)).batch(batch_size)  # 256为一个batch
train_iter = iter(train_db)  # 生成迭代对象

# 定义权重和bias [256, 784] => [256, 256] => [256, 128] => [128, 10]
w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))  # 标准差为0.1的截断正态分布
b1 = tf.Variable(tf.zeros([256]))  # 初始化为0

w2 = tf.Variable(tf.random.truncated_normal([256, 128], stddev=0.1))  # 标准差为0.1的截断正态分布
b2 = tf.Variable(tf.zeros([128]))  # 初始化为0

w3 = tf.Variable(tf.random.truncated_normal([128, 10], stddev=0.1))  # 标准差为0.1的截断正态分布
b3 = tf.Variable(tf.zeros([10]))  # 初始化为0

输出结果:

[[[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
...
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]]

[[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
...
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]]

[[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
...
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]]

[[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
...
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]]

[[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
...
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]]]
[5 0 4 1 9]
(60000, 28, 28)
(60000,)
tf.Tensor(0.0, shape=(), dtype=float32) tf.Tensor(1.0, shape=(), dtype=float32)
tf.Tensor(0, shape=(), dtype=int32) tf.Tensor(9, shape=(), dtype=int32)

train 函数


def train(epoch):  # 训练
    for step, (x, y) in enumerate(train_db):  # 每一批样本遍历
        # 把x平铺 [256, 28, 28] => [256, 784]
        x = tf.reshape(x, [-1, 784])

        with tf.GradientTape() as tape:  # 自动求解
            # 第一个隐层 [256, 784] => [256, 256]
            # [256, 784]@[784, 256] + [256] => [256, 256] + [256] => [256, 256] + [256, 256] (广播机制)
            h1 = x @ w1 + tf.broadcast_to(b1, [x.shape[0], 256])
            h1 = tf.nn.relu(h1)  # relu激活

            # 第二个隐层 [256, 256] => [256, 128]
            h2 = h1 @ w2 + b2
            h2 = tf.nn.relu(h2)  # relu激活

            # 输出层 [256, 128] => [128, 10]
            out = h2 @ w3 + b3

            # 计算损失MSE(Mean Square Error)
            y_onehot = tf.one_hot(y, depth=10)  # 转换成one_hot编码
            loss = tf.square(y_onehot - out)  # 计算总误差
            loss = tf.reduce_mean(loss)  # 计算平均误差MSE


        # 计算梯度
        grads = tape.gradient(loss, [w1, b1, w2, b2, w3, b3])

        # 更新权重
        w1.assign_sub(learning_rate * grads[0])  # 自减梯度*学习率
        b1.assign_sub(learning_rate * grads[1])  # 自减梯度*学习率
        w2.assign_sub(learning_rate * grads[2])  # 自减梯度*学习率
        b2.assign_sub(learning_rate * grads[3])  # 自减梯度*学习率
        w3.assign_sub(learning_rate * grads[4])  # 自减梯度*学习率
        b3.assign_sub(learning_rate * grads[5])  # 自减梯度*学习率

        if step % 100 == 0:  # 每运行100个批次, 输出一次
            print("epoch:", epoch, "step:", step, "loss:", float(loss))

run 函数


def run():
    for i in range(iteration_num):  # 迭代20次
        train(i)

完整代码


import tensorflow as tf

# 定义超参数
batch_size = 256  # 一次训练的样本数目
learning_rate = 0.001  # 学习率
iteration_num = 20  # 迭代次数

# 读取mnist数据集
(x, y), _ = tf.keras.datasets.mnist.load_data()  # 读取训练集的特征值和目标值
print(x[:5])  # 调试输出前5个图
print(y[:5])  # 调试输出前5个目标值数字
print(x.shape)  # (60000, 28, 28) 单通道
print(y.shape)  # (60000,)

# 转换成常量tensor
x = tf.convert_to_tensor(x, dtype=tf.float32) / 255  # 转换为0~1的形式
y = tf.convert_to_tensor(y, dtype=tf.int32)  # 转换为整数形式

# 调试输出范围
print(tf.reduce_min(x), tf.reduce_max(x))  # 0~1
print(tf.reduce_min(y), tf.reduce_max(y))  # 0~9

# 分割数据集
train_db = tf.data.Dataset.from_tensor_slices((x, y)).batch(batch_size)  # 256为一个batch
train_iter = iter(train_db)  # 生成迭代对象

# 定义权重和bias [256, 784] => [256, 256] => [256, 128] => [128, 10]
w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))  # 标准差为0.1的截断正态分布
b1 = tf.Variable(tf.zeros([256]))  # 初始化为0

w2 = tf.Variable(tf.random.truncated_normal([256, 128], stddev=0.1))  # 标准差为0.1的截断正态分布
b2 = tf.Variable(tf.zeros([128]))  # 初始化为0

w3 = tf.Variable(tf.random.truncated_normal([128, 10], stddev=0.1))  # 标准差为0.1的截断正态分布
b3 = tf.Variable(tf.zeros([10]))  # 初始化为0


def train(epoch):  # 训练
    for step, (x, y) in enumerate(train_db):  # 每一批样本遍历
        # 把x平铺 [256, 28, 28] => [256, 784]
        x = tf.reshape(x, [-1, 784])

        with tf.GradientTape() as tape:  # 自动求解
            # 第一个隐层 [256, 784] => [256, 256]
            # [256, 784]@[784, 256] + [256] => [256, 256] + [256] => [256, 256] + [256, 256] (广播机制)
            h1 = x @ w1 + tf.broadcast_to(b1, [x.shape[0], 256])
            h1 = tf.nn.relu(h1)  # relu激活

            # 第二个隐层 [256, 256] => [256, 128]
            h2 = h1 @ w2 + b2
            h2 = tf.nn.relu(h2)  # relu激活

            # 输出层 [256, 128] => [128, 10]
            out = h2 @ w3 + b3

            # 计算损失MSE(Mean Square Error)
            y_onehot = tf.one_hot(y, depth=10)  # 转换成one_hot编码
            loss = tf.square(y_onehot - out)  # 计算总误差
            loss = tf.reduce_mean(loss)  # 计算平均误差MSE


        # 计算梯度
        grads = tape.gradient(loss, [w1, b1, w2, b2, w3, b3])

        # 更新权重
        w1.assign_sub(learning_rate * grads[0])  # 自减梯度*学习率
        b1.assign_sub(learning_rate * grads[1])  # 自减梯度*学习率
        w2.assign_sub(learning_rate * grads[2])  # 自减梯度*学习率
        b2.assign_sub(learning_rate * grads[3])  # 自减梯度*学习率
        w3.assign_sub(learning_rate * grads[4])  # 自减梯度*学习率
        b3.assign_sub(learning_rate * grads[5])  # 自减梯度*学习率

        if step % 100 == 0:  # 每运行100个批次, 输出一次
            print("epoch:", epoch, "step:", step, "loss:", float(loss))


def run():
    for i in range(iteration_num):  # 迭代20次
        train(i)


if __name__ == "__main__":
    run()

输出结果:

epoch: 0 step: 0 loss: 0.5439826250076294
epoch: 0 step: 100 loss: 0.2263326346874237
epoch: 0 step: 200 loss: 0.19458135962486267
epoch: 1 step: 0 loss: 0.1788959801197052
epoch: 1 step: 100 loss: 0.15782299637794495
epoch: 1 step: 200 loss: 0.1580992043018341
epoch: 2 step: 0 loss: 0.15085121989250183
epoch: 2 step: 100 loss: 0.1432340145111084
epoch: 2 step: 200 loss: 0.14373672008514404
epoch: 3 step: 0 loss: 0.13810500502586365
epoch: 3 step: 100 loss: 0.13337770104408264
epoch: 3 step: 200 loss: 0.1334681361913681
epoch: 4 step: 0 loss: 0.12887853384017944
epoch: 4 step: 100 loss: 0.12551936507225037
epoch: 4 step: 200 loss: 0.125375896692276
epoch: 5 step: 0 loss: 0.12160968780517578
epoch: 5 step: 100 loss: 0.1190723180770874
epoch: 5 step: 200 loss: 0.11880680173635483
epoch: 6 step: 0 loss: 0.11563797295093536
epoch: 6 step: 100 loss: 0.11367204040288925
epoch: 6 step: 200 loss: 0.11331651359796524
epoch: 7 step: 0 loss: 0.11063456535339355
epoch: 7 step: 100 loss: 0.10906648635864258
epoch: 7 step: 200 loss: 0.10866570472717285
epoch: 8 step: 0 loss: 0.10636782646179199
epoch: 8 step: 100 loss: 0.10510052740573883
epoch: 8 step: 200 loss: 0.10468046367168427
epoch: 9 step: 0 loss: 0.10268573462963104
epoch: 9 step: 100 loss: 0.10163718461990356
epoch: 9 step: 200 loss: 0.10121693462133408
epoch: 10 step: 0 loss: 0.09949333965778351
epoch: 10 step: 100 loss: 0.09859145432710648
epoch: 10 step: 200 loss: 0.09819269925355911
epoch: 11 step: 0 loss: 0.0966767817735672
epoch: 11 step: 100 loss: 0.09586615860462189
epoch: 11 step: 200 loss: 0.09550992399454117
epoch: 12 step: 0 loss: 0.09417577087879181
epoch: 12 step: 100 loss: 0.09341947734355927
epoch: 12 step: 200 loss: 0.09310202300548553
epoch: 13 step: 0 loss: 0.09193204343318939
epoch: 13 step: 100 loss: 0.09122277796268463
epoch: 13 step: 200 loss: 0.09092779457569122
epoch: 14 step: 0 loss: 0.0899026170372963
epoch: 14 step: 100 loss: 0.08923697471618652
epoch: 14 step: 200 loss: 0.08895798027515411
epoch: 15 step: 0 loss: 0.08804921805858612
epoch: 15 step: 100 loss: 0.08742769062519073
epoch: 15 step: 200 loss: 0.0871589332818985
epoch: 16 step: 0 loss: 0.08635203540325165
epoch: 16 step: 100 loss: 0.0857706069946289
epoch: 16 step: 200 loss: 0.0855005756020546
epoch: 17 step: 0 loss: 0.08479145169258118
epoch: 17 step: 100 loss: 0.08423925191164017
epoch: 17 step: 200 loss: 0.08396687358617783
epoch: 18 step: 0 loss: 0.08334997296333313
epoch: 18 step: 100 loss: 0.08281457424163818
epoch: 18 step: 200 loss: 0.08254452794790268
epoch: 19 step: 0 loss: 0.08201286941766739
epoch: 19 step: 100 loss: 0.08149122446775436
epoch: 19 step: 200 loss: 0.08122102916240692

到此这篇关于详解TensorFlow2实现前向传播的文章就介绍到这了,更多相关TensorFlow2前向传播内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解TensorFlow2实现前向传播

本文链接: https://www.lsjlt.com/news/134521.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解TensorFlow2实现前向传播
    目录概述会用到的函数张量最小值张量最大值数据集分批迭代截断正态分布relu 激活函数one_hotassign_sub准备工作train 函数run 函数完整代码概述 前向传播 (F...
    99+
    2024-04-02
  • 前向传播(张量)- 实战
    目录 手写数字识别流程 前向传播(张量)- 实战 MNIST手写数字集7000*10张图片 60k张图片训练,10k张图片测试 每张图...
    99+
    2023-01-31
    张量 前向 实战
  • 机器学习之前向传播(Forward Propagation)和反向传播(Back propagation)
    前向传播(Forward Propagation)和反向传播(Back propagation)是深度学习中神经网络训练的两个关键步骤。 前向传播(Forward Propagation): 定义:前向传播是指从神经网络的输入层到输出层的...
    99+
    2023-08-30
    神经网络 人工智能 深度学习
  • Python反向传播实现线性回归步骤详细讲解
    目录1. 导入包2. 生成数据3. 训练数据4. 绘制图像5. 代码1. 导入包 我们这次的任务是随机生成一些离散的点,然后用直线(y = w *x + b )去拟合 首先看一下我们...
    99+
    2024-04-02
  • 详解TensorFlow2实现线性回归
    目录概述MSE线性回归公式梯度下降线性回归实现计算 MSE梯度下降迭代训练主函数完整代码概述 线性回归 (Linear Regression) 是利用回归分析来确定两种或两种以上变量...
    99+
    2024-04-02
  • Caffe中怎么进行前向传播
    在Caffe中进行前向传播是通过调用网络模型中的Forward函数来实现的。首先,需要加载已经定义好的网络模型和相应的权重参数。然后...
    99+
    2024-03-07
    Caffe
  • pytorch实现梯度下降和反向传播图文详细讲解
    目录反向传播手动完成线性回归pytorch API完成线性回归优化器类实现反向传播 这里说一下我的理解,反向传播是相对于前向计算的,以公式J(a,b,c)=3(a+bc)为例,前向计...
    99+
    2023-05-17
    pytorch梯度下降 pytorch反向传播 pytorch梯度下降和反向传播
  • Python怎么实现softmax反向传播
    这篇文章主要介绍“Python怎么实现softmax反向传播”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python怎么实现softmax反向传播”文章能帮助大家解决问题。反向传播求导可以看到,s...
    99+
    2023-07-05
  • 使用tensorflow 实现反向传播求导
    看代码吧~ X=tf.constant([-1,-2],dtype=tf.float32) w=tf.Variable([2.,3.]) truth=[3.,3.] Y=w*X ...
    99+
    2024-04-02
  • 详解R语言实现前向逐步回归(前向选择模型)
    目录前向逐步回归原理数据导入并分组导入数据特征与标签分开存放前向逐步回归构建输出特征集合从空开始一次创建属性列表模型效果评估前向逐步回归原理 前向逐步回归的过程是:遍历属性的一列子集...
    99+
    2024-04-02
  • Python实现softmax反向传播的示例代码
    目录概念反向传播求导代码概念 softmax函数是常用的输出层函数,常用来解决互斥标签的多分类问题。当然由于他是非线性函数,也可以作为隐藏层函数使用 反向传播求导 可以看到,soft...
    99+
    2023-05-15
    Python实现softmax 反向传播 Python softmax 反向传播 Python 反向传播
  • pytorch如何实现多个反向传播操作
    小编给大家分享一下pytorch如何实现多个反向传播操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!从一个错误说起:RuntimeError: Trying t...
    99+
    2023-06-15
  • 如何使用tensorflow实现反向传播求导
    这篇文章给大家分享的是有关如何使用tensorflow实现反向传播求导的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。看代码吧~X=tf.constant([-1,-2],dtype=tf.float32)w=tf...
    99+
    2023-06-15
  • SpringMVC中如何实现前台向后台传递值
    今天就跟大家聊聊有关SpringMVC中如何实现前台向后台传递值,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、概述。在很多企业的开法中常常用到SpringMVC+Spring+H...
    99+
    2023-05-31
    springmvc 如何实现 传值
  • 详解Vue实现直播功能
    最近公司刚好在做直播,那么今天就记录一下遇到的坑,公司服务器用的亚马逊aws,所以直接看官方的api就可以了,aws官方地址aws直播api 先看下具体的实现后的效果图把 按照网上...
    99+
    2024-04-02
  • python中异常的传播详解
    目录1、异常的传播2、如何处理异常1、异常的传播 当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播。如果函数中没有对异常进行处理,则异常会继续向函数调用者传播...
    99+
    2024-04-02
  • pytorch loss反向传播出错的解决方案
    今天在使用pytorch进行训练,在运行 loss.backward() 误差反向传播时出错 : RuntimeError: grad can be implicitly creat...
    99+
    2024-04-02
  • Java实现前缀树详解
    目录一.前缀树1.什么是前缀树2.前缀树的举例二.前缀树的实现1.前缀树的数据结构2.插入字符串3.查找字符串4.查找前缀三.词典中最长的单词1.题目描述2.问题分析3.代码实现一....
    99+
    2023-05-18
    Java前缀树 Java前缀树实现
  • PyTorch梯度下降反向传播实例分析
    本文小编为大家详细介绍“PyTorch梯度下降反向传播实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“PyTorch梯度下降反向传播实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言:反向传播的目...
    99+
    2023-06-29
  • Vueqiankun微前端实现详解
    目录引言What:微前端是什么Why:为什么选择微前端微前端能做到什么为什么不使用iFrameHow:微前端实践在主应用中注册微应用在子应用导出相应的生命周期钩子结尾引言 前端时间有...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作