【TensorFlow1.X】系列学习笔记【入门二】

【TensorFlow1.X】系列学习笔记【入门二】

大量经典论文的算法均采用 TF 1.x 实现, 为了阅读方便, 同时加深对实现细节的理解, 需要 TF 1.x 的知识


文章目录

  • 【TensorFlow1.X】系列学习笔记【入门二】
  • 前言
  • 神经网络的参数
  • 神经网络的搭建
    • 前向传播
    • 反向传播
  • 总结


前言

学习了张量、计算图、会话等基础知识,下一步就是实现神经网络的搭建了,本篇博文将讲解搭建神经网络的过程,并简练总结搭建八股。【参考】


神经网络的参数

神经网络的参数是指在神经网络模型中需要学习的可调整值。这些参数用于调整模型的行为,定了神经网络的行为和性能,使其能够更好地拟合训练数据和进行预测。
在典型的神经网络中,参数主要存在于两个部分,用变量表示:

  1. 权重(Weights):
    权重是连接神经网络中不同层的神经元之间的参数。每个连接都有一个关联的权重,用于调整信息在网络中的传递。权重决定了每个输入对于特定神经元的重要性。在训练过程中,神经网络通过优化算法来调整权重,以最小化预测输出与实际输出之间的差距。
  2. 偏置(Biases):
    偏置是神经元的可调整参数,用于调整神经元的激活阈值。每个神经元都有一个关联的偏置值,它在计算神经元的输出时被加到加权输入上。偏置允许神经元对不同的输入模式做出不同的响应。

这些权重和偏置参数是在训练过程中学习的,通过反向传播算法和优化方法(如梯度下降)来更新,训练过程旨在最小化损失函数,以使神经网络能够更准确地进行预测。

在 TensorFlow 1.x 中,可以使用以下方法来初始化神经网络的参数:

方法功能
tf.random_normal()生成正态分布随机数
tf.truncated_normal()生成去掉过大偏离点的正态分布随机数
tf.random_uniform()生成均匀分布随机数
tf.random_uniform()生成均匀分布随机数
tf.zeros表示生成全 0 数组
tf.ones表示生成全 1 数组
tf.fill表示生成全定值数组
tf.constant表示生成直接给定值的数组
import tensorflow as tf
w = tf.Variable(tf.random_normal([2,3], stddev=2, mean=0, seed=1))
# => <tf.Variable 'Variable:0' shape=(2, 3) dtype=float32_ref>
w = tf.Variable(tf.truncated_normal([2,3], stddev=2, mean=0, seed=1))
# => <tf.Variable 'Variable_1:0' shape=(2, 3) dtype=float32_ref>
w = tf.random_uniform([2,3], minval=0, maxval=1, dtype=tf.int32, seed=1)
# => Tensor("random_uniform:0", shape=(2, 3), dtype=int32)
w = tf.zeros([3,2], tf.int32)
# => Tensor("zeros:0", shape=(3, 2), dtype=int32)
w = tf.ones([3,2], tf.int32)
# => Tensor("ones:0", shape=(3, 2), dtype=int32)
w = tf.fill([3,2], 6)
# => Tensor("Fill:0", shape=(3, 2), dtype=int32)
w = tf.constant([3,2])
# => Tensor("Const:0", shape=(2,), dtype=int32)

注意:①随机种子如果去掉每次生成的随机数将不一致,②如果没有特殊要求标准差、均值、随机种子是可以不写的。


神经网络的搭建

神经网络模型的实现过程:

  1. 准备数据集:作为神经网络模型的训练\测试数据
  2. 前向传播:搭建模型结构,先搭建计算图,再用会话执行,计算输出
  3. 反向传播:模型学习到大量特征数据,迭代优化模型参数
  4. 完成训练,验证模型精度

由此可见,基于深度学主要分为两个过程,即训练过程和使用过程。 训练过程是第一步、第二步、第三步的循环迭代,使用过程是第四步,一旦参数优化完成就可以固定这些参数,实现特定应用了。当前很多实际应用中,会优先使用现有的成熟可靠的模型结构,用个人的数据集训练模型,判断是否能对个人数据集作出正确响应,再适当更改网络结构,反复迭代,让机器自动训练参数找出最优结构和参数,以固定专用模型。

前向传播

前向传播就是搭建模型的计算过程,让模型具有推理能力,可以针对一组输入给出相应的输出。
举个案例,假如快递运输费用,体积为 x1,重量为 x2,体积和重量就是我们选择的特征,把它们输入到神经网络,当体积和重量这组数据走过神经网络后会得到一个输出,即费用。
假如输入的特征值是:体积 0.7 重量 0.5:

由图可知,隐藏层节点 a11=x1w11+x2w21=0.14+0.15=0.29,同理算得节点 a12=0.32,a13=0.38,最终计算得到输出层 Y=-0.015,这便实现了前向传播过程。

前向传播过程的 tensorflow 描述:

  1. 输入层: X X X n × 2 {\rm{n}} \times 2 n×2的矩阵,表示一次输入 n n n组特征,这组特征包含了体积和重量两个元素。
    x = tf.placeholder(tf.float32, shape=(None, 2))
    
  2. 隐藏层: W ( F r o n t N o d e N u m b e r , R e a r N o d e N u m b e r ) ( l a y e r s ) W_{(F{\rm{rontNodeNumber}},R{\rm{earNodeNumber)}}}^{({\rm{layers}})} W(FrontNodeNumber,RearNodeNumber)(layers)是待优化的参数,对于第一计算层的 w ( 1 ) {w^{({\rm{1}})}} w(1)前面有两个节点,后面有三个节点, w ( 1 ) {w^{({\rm{1}})}} w(1)是个两行三列矩阵:
    W ( 1 ) = [ w ( 1 , 1 ) ( 1 ) w ( 1 , 2 ) ( 1 ) w ( 1 , 3 ) ( 1 ) w ( 2 , 1 ) ( 1 ) w ( 2 , 2 ) ( 1 ) w ( 2 , 3 ) ( 1 ) ] {W^{(1)}} = \left[ {\begin{array}{cc} {w_{(1,1{\rm{)}}}^{(1)}}&{w_{(1,2{\rm{)}}}^{(1)}}&{w_{(1,3{\rm{)}}}^{(1)}}\\ {w_{(2,1{\rm{)}}}^{(1)}}&{w_{(2,2{\rm{)}}}^{(1)}}&{w_{(2,3{\rm{)}}}^{(1)}} \end{array}} \right] W(1)=[w(1,1)(1)w(2,1)(1)w(1,2)(1)w(2,2)(1)w(1,3)(1)w(2,3)(1)],即 a ( 1 ) = [ a 11 , a 12 , a 13 ] = X W ( 1 ) {a^{\left( 1 \right)}} = \left[ {{a_{11}},{\rm{ }}{a_{12}},{\rm{ }}{a_{13}}} \right] = X{W^{(1)}} a(1)=[a11,a12,a13]=XW(1)
    对于第二计算层的 w ( 2 ) {w^{({\rm{2}})}} w(2)前面有三个节点,后面有1个节点, w ( 2 ) {w^{({\rm{2}})}} w(2)是个三行一列矩阵:
    W ( 2 ) = [ w ( 1 , 1 ) ( 2 ) w ( 2 , 1 ) ( 2 ) w ( 3 , 1 ) ( 2 ) ] {W^{(2)}} = \left[ {\begin{array}{cc} {w_{(1,1{\rm{)}}}^{(2)}}\\ {w_{(2,1{\rm{)}}}^{(2)}}\\ {w_{(3,1{\rm{)}}}^{(2)}} \end{array}} \right] W(2)= w(1,1)(2)w(2,1)(2)w(3,1)(2) ,即 y = a ( 1 ) W ( 1 ) {y} = {a^{\left( 1 \right)}}{W^{(1)}} y=a(1)W(1)
    a = tf.matmul(x, w1)
    y = tf.matmul(a, w2)
    

神经网络共有几层(或当前是第几层网络)都是指的计算层,所有的计算层统称为隐藏层,而隐藏层的计算层计算出结果通常称做中间特征,不要错把这些当作隐藏层。

完整的前向传播代码。

import tensorflow as tf# 定义输入和参数
# 用tf.placeholder定义输入,在sess.run函数中要用feed_dict指定输入
x = tf.placeholder(tf.float32, shape=(None, 2))
w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))# 定义前向传播过程
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)# 汇总所有待优化变量
init_op = tf.global_variables_initializer()# 调用会话计算结果
# 变量初始化、计算图节点运算都要用会话(with结构)实现
with tf.Session() as sess:# 在sess.run函数中变量初始化sess.run(init_op)# 在sess.run函数中计算图节点运算print("the result of tf3_5.py is:\n",sess.run(y, feed_dict={x: [[0.7,0.5],[0.2,0.3],[0.3,0.4],[0.4,0.5]]}))print("w1:\n", sess.run(w1))print("w2:\n", sess.run(w2))

反向传播

反向传播:训练模型参数,在所有参数上用梯度下降,使 NN 模型在训练数据上的损失函数最小。
反向传播过程的 tensorflow 描述:

  1. 损失函数(loss):计算得到的预测值 y 与已知真实值 y_的误差。均方误差 MSE
    是比较常用的方法之一,它计算前向传播求出的预测值与已知真实值之差的平方再求平均: M S E ( y _ , y ) = ∑ i = 1 n ( y − y _ ) 2 n MSE(y\_,y) = \frac{{\sum\nolimits_{i = 1}^n {{{(y - y\_)}^2}} }}{n} MSE(y_,y)=ni=1n(yy_)2
    loss_mse = tf.reduce_mean(tf.square(y-y_)) 
    
  2. 反向传播优化方法:以减小 loss 值为优化目标,常见的三种有随机梯度下降、momentum 优化器、adam优化器等优化方法。
    # 学习率(learning_rate):决定每次参数更新的幅度。
    train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss) 
    train_step = tf.train.MomentumOptimizer(learning_rate, momentum).minimize(loss) 
    train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)
    
    方法功能
    tf.train.GradientDescentOptimizer()梯度下降用于最小化损失函数。它通过计算损失函数关于每个可训练参数的梯度,并将参数沿着梯度的反方向进行更新,以减少损失函数的值。
    tf.train.MomentumOptimizer()动量优化器在梯度下降的基础上引入了动量的概念,以加速训练过程,它通过累积之前梯度的方向来更新参数,以减少损失函数的值。
    tf.train.AdamOptimizer()结合了动量优化器和自适应学习率的思想。它根据梯度的平均值和方差来自适应地调整学习率,以在训练过程中更好地适应不同参数的变化,以减少损失函数的值。

完整的反向传播代码。

# coding:utf-8
# 0导入模块,生成模拟数据集。
import tensorflow as tf
import numpy as np# 每次训练的数量
BATCH_SIZE = 8
SEED = 23455# 基于seed产生随机数
rdm = np.random.RandomState(SEED)
# 随机数返回32行2列的矩阵 表示32组 体积和重量 作为输入数据集
X = rdm.rand(32, 2)
# 从X这个32行2列的矩阵中 取出一行 判断如果和小于1 给Y赋值1 如果和不小于1 给Y赋值0
# 作为输入数据集的标签(正确答案)
Y_ = [[int(x0*0.5+x1*0.8)] for (x0, x1) in X]# 定义神经网络的输入、参数和输出,定义前向传播过程。
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=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))a = tf.matmul(x, w1)
y = tf.matmul(a, w2)# 定义损失函数及反向传播方法。
loss_mse = tf.reduce_mean(tf.square(y - y_))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)
# train_step = tf.train.MomentumOptimizer(0.001,0.9).minimize(loss_mse)
# train_step = tf.train.AdamOptimizer(0.001).minimize(loss_mse)# 生成会话,训练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))# 训练模型# 悬链次数STEPS = 3000for i in range(STEPS):# 随机选取一组batchsize为8的数据段start = (i * BATCH_SIZE) % 32end = start + BATCH_SIZEsess.run(train_step, feed_dict={x: X[start:end], y_: Y_[start:end]})if i % 500 == 0:total_loss = sess.run(loss_mse, feed_dict={x: X, y_: Y_})print("After %d training step(s), loss_mse on all data is %g" % (i, total_loss))# 输出训练后的参数取值。print("w1:\n", sess.run(w1))print("w2:\n", sess.run(w2))

总结

梳理出神经网络搭建的八股,搭建过程分四步完成:准备工作、前向传播、反向传播和循环迭代:

  1. 导入模块,生成模拟数据集;
  2. 前向传播:定义输入、参数和输出;
  3. 反向传播:定义损失函数、反向传播方法;
  4. 生成会话,训练n轮。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/165784.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas数据处理分析系列3-数据如何预览

Pandas-数据预览 Pandas 导入数据后,我们通常需要对数据进行预览,以便更好的进行数据分析。常见数据预览的方法如下: ①head() 方法 功能:读取数据的前几行,默认显示前5行 语法结构:df.head(行数) df1=pd.read_excel("销售表.xlsx",sheet_name="手机销…

WMS透明仓库:实现仓储的全方位可视化与优化

一、WMS透明仓库的定义与特点 1. WMS透明仓库的定义&#xff1a;WMS透明仓库是一种基于信息技术的仓库管理系统&#xff0c;通过实时数据采集、分析和可视化&#xff0c;将仓库内外的物流流程、库存状态、人员活动等信息以透明的方式展示给相关利益方。 2. 实时数据采集&…

Hadoop学习总结(搭建Hadoop集群(完全分布式模式))

学习搭建Hadoop集群&#xff08;完全分布式模式&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1wwTKk-XxHbccHjE-Xk2PTA 提取码&#xff1a;q7j7 在SecurityCRT 或者在 Xshell 进行虚拟机链接 &#xff08;这里使用Xshell &#xff09; 在hadoop001里配置 如果没…

中文编程开发语言工具构件说明:屏幕截取构件的编程操作

屏幕截取 用于截取指定区域的图像。 图 标&#xff1a; 构件类型&#xff1a;不可视 重要属性 l 截取类型 枚举型&#xff0c;设置在截取屏幕时的截取类型。包括&#xff1a;全屏幕、指定区域、活动窗口三种。当全屏幕截取时相当于执行了硬拷屏&#xff08;PrintScre…

0基础学习PyFlink——模拟Hadoop流程

学习大数据还是绕不开始祖级别的技术hadoop。我们不用了解其太多&#xff0c;只要理解其大体流程&#xff0c;然后用python代码模拟主要流程来熟悉其思想。 还是以单词统计为例&#xff0c;如果使用hadoop流程实现&#xff0c;则如下图。 为什么要搞这么复杂呢&#xff1f; 顾…

xlive.dll下载安装方法分享,教你快速修复xlive.dll文件

在运行某些应用程序或游戏时&#xff0c;你可能会遭遇到"xlive.dll缺失"错误提示&#xff0c;这可能导致程序无法正常运行。本文将向你介绍一些可行的解决方法教你下载xlive.dll文件&#xff0c;并详细阐述xlive.dll是什么文件以及导致其缺失的原因。 一.理解"x…

Docker-镜像的备份迁移及私有仓库的搭建

一、Docker-备份与迁移 A服务器系统配置 B服务器系统配置 1.用命令将容器保存为镜像。 案例&#xff0c;将A服务器的Docker容器迁移到另外一台服务器B&#xff0c;A服务器的容器配置过对应的文件&#xff0c;不想在B服务器重新搭建&#xff0c;可以使用该案例。 docker c…

FL studio21永久激活码 附带一键下载安装包

玩音乐的朋友&#xff0c;对FL studio肯定不陌生&#xff0c;目前最新的版本是FL studio21&#xff0c;这是一款非常强大且专业的音频制作软件&#xff0c;而且还可以编曲、剪辑、录音、混音等等之类的创作操作&#xff0c;使你的计算机成为一个全功能录音室。下面小编就来和大…

抛砖引玉:Redis 与 接口自动化测试框架的结合

接口自动化测试已成为保证软件质量和稳定性的重要手段。而Redis作为一个高性能的缓存数据库&#xff0c;具备快速读写、多种数据结构等特点&#xff0c;为接口自动化测试提供了强大的支持。勇哥这里粗略介绍如何结合Python操作Redis&#xff0c;并将其应用于接口自动化测试框架…

Qt实现一个电子相册

一、要实现的功能 在窗口中可以显示图片&#xff0c;并且能够通过两个按钮进行图片的前进和后退的顺序切换。有一个按钮&#xff0c;通过这个按钮可以从所存图片资源中随机选取一个图片进行展示通过按钮可以控制图片自动轮播顺序切换的开始与停止&#xff0c;显示当前系统的时…

使用 LF Edge eKuiper 将物联网流处理数据写入 Databend

作者&#xff1a;韩山杰 Databend Cloud 研发工程师 https://github.com/hantmac LF Edge eKuiper LF Edge eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源软件&#xff0c;可以运行在各类资源受限的边缘设备上。eKuiper 的主要目标是在边缘端提供一个流媒体软件…

大模型必备算力:CPUGPU天梯图(2023年最新版)

在当今计算机世界&#xff0c;CPU、GPU和显卡的性能成为了衡量计算机性能的重要指标。今天深入了解CPU、GPU和显卡天梯图。 首先&#xff0c;CPU作为计算机的大脑&#xff0c;负责处理各种任务。它的性能主要由核心数、主频和缓存大小决定。其中&#xff0c;核心数和主频决定了…

kubeadm初始化搭建cri-dockerd记录 containerd.io

07.尚硅谷_搭建K8s集群&#xff08;kubeadm方式&#xff09;-部署master节点_哔哩哔哩_bilibili 视频里的版本只有1.17而现在&#xff08;2023.10.20&#xff09;kubernetes最新版本是1.28&#xff0c;需要搭载cri-dockerd&#xff0c; 先去网站下载了对应的rpm包cri-dockerd…

计算机网络篇之TCP滑动窗口

文章目录 前言概述 前言 在网络数据传输时&#xff0c;若传输的原始数据包比较大&#xff0c;会将数据包分解成多个数据包进行发送。需要对数据包确认后&#xff0c;才能发送下一个数据包。在等待确认包的这个过程浪费了大量的时间&#xff0c;不过还好TCP引入了滑动窗口的概念…

2022最新版-李宏毅机器学习深度学习课程-P26 Recurrent Neural Network

RNN 应用场景&#xff1a;填满信息 把每个单词表示成一个向量的方法&#xff1a;独热向量 还有其他方法&#xff0c;比如&#xff1a;Word hashing 单词哈希 输入&#xff1a;单词输出&#xff1a;该单词属于哪一类的概率分布 由于输入是文字序列&#xff0c;这就产生了一个问…

【算法|动态规划No.27】leetcode516. 最长回文子序列

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

快速自动化处理JavaScript渲染页面的方法

目录 一、使用无头浏览器 二、使用JavaScript渲染引擎 三、使用前端框架工具 随着互联网技术的不断发展&#xff0c;JavaScript已经成为Web开发中不可或缺的一部分。然而&#xff0c;在自动化处理JavaScript渲染页面方面&#xff0c;却常常让开发者感到头疼。本文将介绍一些快…

02 开闭原则

官方定义&#xff1a; 开闭原则规定软件中的对象、类、模块和函数对扩展应该是开放的&#xff0c;但对于修 改是封闭的。这意味着应该用抽象定义结构&#xff0c;用具体实现扩展细节&#xff0c;以此确保 软件系统开发和维护过程的可靠性。 通俗解释&#xff1a; 对扩展开放…

基础MySQL的语法练习

基础MySQL的语法练习 create table DEPT(DEPTNO int(2) not null,DNAME VARCHAR(14),LOC VARCHAR(13) );alter table DEPTadd constraint PK_DEPT primary key (DEPTNO);create table EMP (EMPNO int(4) primary key,ENAME VARCHAR(10),JOB VARCHAR(9),MGR …

运营商大数据精准营销,击碎你的固化营销思维

大数据精准营销服务是大数据应用的典型场景之一&#xff0c;也是依托大数据和互联网提升企业效率的一种有效手段。但是&#xff0c;在选择大数据服务的很多时候&#xff0c;企业往往要考虑法律与合规的问题&#xff0c;其中比较重要的是数据获取渠道与数据是否脱敏。在所有大数…