1. 掌握标量、向量、张量等概念
  2. 掌握如何用向量形式简化神经网络结构并编程实现
  3. 了解线性问题

标量、向量、张量

张量

在上一章的代码中添加 print 函数:

代码
# import tensorflow as tf
import tensorflow.compat.v1 as tf tf.disable_v2_behavior() x1 = tf.placeholder(dtype = tf.float32)
x2 = tf.placeholder(dtype = tf.float32)
x3 = tf.placeholder(dtype = tf.float32) yTrain = tf.placeholder(dtype = tf.float32) print("x1: %s" %x1) w1 = tf.Variable(0.1, dtype = tf.float32)
w2 = tf.Variable(0.1, dtype = tf.float32)
w3 = tf.Variable(0.1, dtype = tf.float32) print("w1: %s" %w1) n1 = x1 * w1
n2 = x2 * w2
n3 = x3 * w3 print("n1: %s" %n1) y = n1 + n2 + n3 print("y: %s" %y) loss = tf.abs(y - yTrain)
optimizer = tf.train.RMSPropOptimizer(0.001)
train = optimizer.minimize(loss) sess = tf.Session()
# init = tf.global_variable_initializer()
init = tf.compat.v1.global_variables_initializer() sess.run(init) result = sess.run([train, x1, x2, x3, w1, w2, w3, y, yTrain], feed_dict={x1: 90, x2: 80, x3: 70, yTrain: 96})
print(result)

输出结果:

Placeholder:0 数字代表操作结果的编号(可能有多个输出结果)。x1 是 Tensor 对象。神经网络中,输入节点,隐藏层节点,输出节点都是张量。w1 是 Variable 对象(可变参数对象)。在神经网络中,参与节点运算的可变参数(权重)不是 Tensor 对象。

上一章引入的 “三好学生问题” 神经网络模型:

n1 = x1 * w1
# n1: Tensor("mul:0", dtype=float32)

Tensor(张量):包含 了对于输入数据的计算操作;容纳了一个(或一组)数据,即输出数据。

w1 = tf.Variable(0.1, dtype = tf.float32)
# w1: <tf.Variable 'Variable:0' shape=() dtype=float32_ref>

可变参数不是模型中节点的输出数据,会参与到某个神经元的计算。

总结:

  • 张量( Tensor)就是神经网络中神经元节点接收输入数据后经过一定计算操作输出的结果对象;
  • 张量( Tensor)在神经网络模型图中表现为各层的节点的输出节点加上连线所组成的整个神经网络模型图标表现的是张量在神经网络中 “流动(flow)” 的过程;
  • 张量( Tensor)在程序中的具体表现是一个 Tensor 类型的对象。

向量和标量

向量:一串数字,程序中用一个数组表示例如:[90,80,70]

  1. 数组有顺序
  2. 根据数字判断向量维数

总结:

  • 张量可以是一个标量,即一个数值
  • 张量可以是一个向量,即一个一维数组
  • 张量也可以是一个多维数组,来表达二维矩阵、三维矩阵甚至更多
  1. 张量的 是指这个多维数组的维度数
  2. 张量的 形态 是指用一维数组表示的张量在各个维度上的数值数量(shape,表达张量中存储的数据的形式)

注意:一维数组:[90,80,70],形态 [3],只有一个维度,顶数 3,一阶;标量:统一用一个空数组便是形态 [] 或者 (),0 阶 ...

代码查看形态结果

import tensorflow as tf

x = tf.placeholder(dtype = tf.float32)
xShape = tf.shape(x) # tf.shape() 函数用于获取张量的形态

简化神经网络

用向量重新组织神经网络:

import tensorflow as tf

x = tf.placeholder(shape=[3], dtype=tf.float32)
yTrain = tf.placeholder(shape=[], dtype=tf.float32)
w = tf.Variable(tf.zeros([3]), dtype=tf.float32)
n = x * w
y = tf.reduce_sum(n) loss = tf.abs(y - yTrain)
optimizer = tf.train.RMSPropOptimizer(0.001)
train = optimizer.minimize(loss) sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init) result = sess.run([train, x, w, y, yTrain, loss], feed_dict={x: [90, 80, 70], yTrain: 85})
print(result) result = sess.run([train, x, w, y, yTrain, loss], feed_dict={x:[98, 95, 87], yTrain: 96})
print(result)
  • x: shape=[0] 表示 x 的形态,取值为 3,表示输入占位符的数据是一个三维向量
  • w: tf.zeros([3]),返回数组 [0,0,0],初始化
  • yTrain: [], 标量
  • n: 点乘
  • tf.reduce_sum(): 将数组中所有数组相加求和得到一个标量 y
result = sess.run([train, x, w, y, yTrain, loss], feed_dict={x: [90, 80, 70], yTrain: 85})
print(result)

喂数据时,yTrain: 85 目标值送入的是 ** 标量形式 ** 的数据, x: [90, 80, 70] 送入 x 的是 ** 向量形式 ** 的输入数据。

代码
# import tensorflow as tf
import tensorflow.compat.v1 as tf tf.compat.v1.disable_eager_execution() x = tf.placeholder(shape=[3], dtype=tf.float32)
yTrain = tf.placeholder(shape=[], dtype=tf.float32)
w = tf.Variable(tf.zeros([3]), dtype=tf.float32)
n = x * w
y = tf.reduce_sum(n) loss = tf.abs(y - yTrain)
optimizer = tf.train.RMSPropOptimizer(0.001)
train = optimizer.minimize(loss) sess = tf.Session()
# init = tf.global_variable_initializer()
init = tf.compat.v1.global_variables_initializer()
sess.run(init) result = sess.run([train, x, w, y, yTrain, loss], feed_dict={x: [90, 80, 70], yTrain: 85})
print(result) result = sess.run([train, x, w, y, yTrain, loss], feed_dict={x:[98, 95, 87], yTrain: 96})
print(result)

注意: 向量形式在计算机中用的是数组来表达。

循环进行多次训练:

代码
# import tensorflow as tf
import tensorflow.compat.v1 as tf tf.compat.v1.disable_eager_execution() x = tf.placeholder(shape=[3], dtype=tf.float32)
yTrain = tf.placeholder(shape=[], dtype=tf.float32)
w = tf.Variable(tf.zeros([3]), dtype=tf.float32)
n = x * w
y = tf.reduce_sum(n) loss = tf.abs(y - yTrain)
optimizer = tf.train.RMSPropOptimizer(0.001)
train = optimizer.minimize(loss) sess = tf.Session()
# init = tf.global_variable_initializer()
init = tf.compat.v1.global_variables_initializer()
sess.run(init) for i in range(5000):
result = sess.run([train, x, w, y, yTrain, loss], feed_dict={x: [90, 80, 70], yTrain: 85})
print(result) result = sess.run([train, x, w, y, yTrain, loss], feed_dict={x:[98, 95, 87], yTrain: 96})
print(result)

误差被有效控制,运行结果基本一致(与 ch3 中的代码比较)。

简化的神经网络图:

用 Softmax 函数来规范可变参数

Softmax 函数:将一个向量规范化为一个所有数值相加和为 1 的新向量。

三好学生问题,几项分数的权重值之和一定为 100%,也就是 1.0。

w = tf.Variable(tf.zeros([3]), dtype = tf.float32)
wn = tf.nn.softmax(2)
n = x * wn
y = tf.reduce_sum(n)

nn(neural network) 是 TensorFlow 重要子类。

代码
# import tensorflow as tf
import tensorflow.compat.v1 as tf tf.compat.v1.disable_eager_execution() x = tf.placeholder(shape=[3], dtype=tf.float32)
yTrain = tf.placeholder(shape=[], dtype=tf.float32)
w = tf.Variable(tf.zeros([3]), dtype=tf.float32) wn = tf.nn.softmax(w)
n = x * wn
y = tf.reduce_sum(n) loss = tf.abs(y - yTrain)
optimizer = tf.train.RMSPropOptimizer(0.001)
train = optimizer.minimize(loss) sess = tf.Session()
# init = tf.global_variable_initializer()
init = tf.compat.v1.global_variables_initializer()
sess.run(init) for i in range(5000):
result = sess.run([train, x, w, y, yTrain, loss], feed_dict={x: [90, 80, 70], yTrain: 85})
print(result) result = sess.run([train, x, w, y, yTrain, loss], feed_dict={x:[98, 95, 87], yTrain: 96})
print(result)

线性问题

线性问题:用图形来表达输入数值和输出数值的关系,在坐标系中将是一条直线。

增加了偏移量 b 后,可以表达更多的线性问题(适应性)

知识补充

Python 中的 print

# 按字符串输出
name = "Adam"
print("name: %s" %name) # 按整数输出
x = 101
print("x: %d" %x) # 按浮点数输出
y = 12.35
print("y: %f" %y)

矩阵

多维数组

x1 = [90, 80, 70]
x2 = [98, 95, 87]
xAll = [x1, x2]

xAll = [[90, 80, 70], [98, 95, 87]], xAll 称为 2x3 的二维数组。

点乘

练习

  1. 试定义一个形态为 [3,2] 的张量,并在 TensorFlow 中查看它与标量 7 相乘的结果。

    import tensorflow as tf
    x = tf.placeholder(shape=[3, 2], dtype=tf.float32)
    y = tf.placeholder(shape=[], dtype=tf.float32) xy = x * y # xShape = tf.shape(xy) sess = tf.Session()
    result = sess.run(xy, feed_dict={x: [[1, 2], [3, 4], [5, 6]], y: 7}) print(result)

  2. 对上题中的张量进行 softmax 计算操作后查看结果

    import tensorflow as tf
    
    x = tf.placeholder(shape=[3, 2], dtype=tf.float32)
    y = tf.placeholder(shape=[], dtype=tf.float32) xy = x * y r = tf.nn.softmax(x) # xShape = tf.shape(xy) sess = tf.Session()
    result = sess.run(r, feed_dict={x: [[1, 2], [3, 4], [5, 6]], y: 7}) print(result)

CH4 简化神经网络模型的更多相关文章

  1. 深度学习之PyTorch实战(2)——神经网络模型搭建和参数优化

    上一篇博客先搭建了基础环境,并熟悉了基础知识,本节基于此,再进行深一步的学习. 接下来看看如何基于PyTorch深度学习框架用简单快捷的方式搭建出复杂的神经网络模型,同时让模型参数的优化方法趋于高效. ...

  2. bp神经网络模型推导与c语言实现(转载)

    转载出处:http://www.cnblogs.com/jzhlin/archive/2012/07/28/bp.html BP 神经网络中的 BP 为 Back  Propagation 的简写,最 ...

  3. zz神经网络模型量化方法简介

    神经网络模型量化方法简介 https://chenrudan.github.io/blog/2018/10/02/networkquantization.html 2018-10-02 本文主要梳理了 ...

  4. Tensorflow 对上一节神经网络模型的优化

    本节涉及的知识点: 1.在程序中查看变量的取值 2.张量 3.用张量重新组织输入数据 4.简化的神经网络模型 5.标量.多维数组 6.在TensorFlow中查看和设定张量的形态 7.用softmax ...

  5. BP神经网络模型与学习算法

    一,什么是BP "BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最 ...

  6. 建模算法(六)——神经网络模型

    (一)神经网络简介 主要是利用计算机的计算能力,对大量的样本进行拟合,最终得到一个我们想要的结果,结果通过0-1编码,这样就OK啦 (二)人工神经网络模型 一.基本单元的三个基本要素 1.一组连接(输 ...

  7. BP神经网络模型及算法推导

    一,什么是BP "BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最 ...

  8. 基于pytorch的CNN、LSTM神经网络模型调参小结

    (Demo) 这是最近两个月来的一个小总结,实现的demo已经上传github,里面包含了CNN.LSTM.BiLSTM.GRU以及CNN与LSTM.BiLSTM的结合还有多层多通道CNN.LSTM. ...

  9. 手写数字识别 ----卷积神经网络模型官方案例注释(基于Tensorflow,Python)

    # 手写数字识别 ----卷积神经网络模型 import os import tensorflow as tf #部分注释来源于 # http://www.cnblogs.com/rgvb178/p/ ...

  10. 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec

    人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...

随机推荐

  1. Seata源码—7.Seata TCC模式的事务处理

    大纲 1.Seata TCC分布式事务案例配置 2.Seata TCC案例服务提供者启动分析 3.@TwoPhaseBusinessAction注解扫描源码 4.Seata TCC案例分布式事务入口分 ...

  2. L3-2、引导 AI 推理思考 —— 从条件判断到链式推理

    一.什么是引导式推理(Self-Reasoning Prompt)? 引导式推理是一种提示工程技术,通过特定的提示结构引导AI模型进行逐步推理,使其能够像人类一样"思考"问题,而非 ...

  3. 20250528 - Usual 攻击事件: 价差兑换与请君入瓮

    背景信息 项目背景 VaultRouter 合约有用特权身份,可以通过 Usd0PP 合约将 USD0++ 以 1:1 的比例兑换成 USD0,随后通过 UniV3 将 USD0 swap 成 sUS ...

  4. ImportError: lxml.html.clean module is now a separate project lxml_html_clean

    导包报错 from lxml_html_clean import Cleaner 解决报错:"ImportError: lxml.html.clean module is now a sep ...

  5. pytorch入门 - 微调huggingface大模型

    在自然语言处理(NLP)领域,预训练语言模型如BERT已经成为主流.HuggingFace提供的Transformers库让我们能够方便地使用这些强大的模型. 本文将详细介绍如何使用PyTorch微调 ...

  6. ChatMoney智能知识库让你轻松工作!

    本文由 ChatMoney团队出品 为了增强企业内部知识的传递和共享效率,最近花了两周时间测试Chatmoney知识库 +企微客服助手模式,测试效果让我很惊喜! 对话引用知识库内容,Chatmoney ...

  7. 【渗透测试】不怎么水的洞之IP伪造

    漏洞原理 有些应用程序有记录用户IP的功能或者限制IP白名单的功能,如果应用程序从请求头字段获取用户IP,可能会被攻击者伪造,来达到欺骗服务器的目的. 案例一 发现操作日志页面有个记录用户IP功能 插 ...

  8. CAE和CAD的区别

    CAE又被叫做"计算机辅助工程",而CAD则是"计算机辅助设计".虽然CAE和CAD是两种不同的技术,但它们却有着一定联系.在如今这个遍布科技与狠活的社会里,C ...

  9. centos7搭建postgresql-14

    环境:centos7  + pg 14 1:在postgresql官网下载页面,根据提示下载 https://www.postgresql.org/download/linux/redhat/ 2 连 ...

  10. CF650A 题解

    Problem 原题链接 Meaning 求曼哈顿距离和欧氏距离相等的坐标组数量. Solution 这道题用枚举复杂度较高,我们考虑探究当两点的曼哈顿距离与欧氏距离相等时,它们横纵坐标的关系. 如下 ...