1个TensorFlow样例,终于明白如何实现前向传播过程?

神经网络的结构,就是不同神经元间的连接结构

–图示了一个三层全连接神经网络。

神经元结构的输出,是所有输入的加权、加上偏置项,再经过一个激活(传递)函数得到。

全连接神经网络

全连接神经网络,就是相邻两层之间,任意两个节点之间都有连接。

–这也是其与后面介绍的卷积层、LSTM结构的区分。

–除了输入层,所有节点都代表了一个神经元的结构。

计算神经网络的前向传播结果,要三部分信息。

–第一个部分是神经网络的输入,这个输入就是从实体中提取的特征向量。

–第二个部分为神经网络的连接结构。神经网络是由神经元构成的,神经网络的结构,给出不同神经元之间输入、输出的连接关系。

–第三部分是每个神经元中的参数。

示例分析

图中,a11节点有两个输入,分别是x1和x2的输出,而a11的输出是节点Y的输入。

–用w来表示神经元中的权重,b表示偏置项。

–w的上标表明了神经网络的层数,如w(1)表示第一层节点的参数,而w(2)表示第二层节点的参数。

–w的下标表明了连接节点编号,比如w 1,2 (1)表示连接x1和a12节点的边上的权重。

给定神经网络的输入、神经网络的结构,以及边上权重,就可以通过前向传播算法,来计算出神经网络的输出

下面公式给出了在ReLU激活函数下,前图神经网络前向传播的过程。此处假设x1=0.7, x2=0.9

–a11=f(W1,1(1)x1+W2,1(1)x2+b1(1))

–=f(0.7×0.2+0.9×0.3+(-0.5)) =f(-0.09)=0

–a12=f(W1,2(1)x1+W2,2(1)x2+b2(1))

–=f(0.7×0.1+0.9×(-0.5)+0.1)=f(-0.28)=0

–a13=f(W1,3(1)x1+W2,3(1)x2+b3(1))

–=f(0.7×0.4+0.9×0.2+(-0.1))=f(0.36)=0.36

–Y=f(W1,1(2)a11+W1,2(2)a12+W1,3(2)a13+b1(2))

–=f(0.054+0.028+(-0.072)+0.1)=f(0.11)=0.11

在虚拟机中运行相应的chap3中的前向神经网络例子,查看相关的图计算。

在TensorFlow中,可以通过矩阵乘法的方法,实现神经网络的前向传播过程。

–a = tf.nn.relu(tf.matmul(x, w1)+b1)

–y = tf.nn.relu(tf.matmul(a, w2)+b2)

在上面的代码中并没有定义w1、w2、b1、b2,

–TensorFlow可以通过变量(tf.Variable),来保存和更新神经网络中的参数。

比如通过下面语句可以定义w1:

–weights = tf.Variable(tf.random_normal([2, 3], stddev=2))

–这段代码调用了TensorFlow变量的声明函数tf.Variable。在变量声明函数中,给出了初始化这个变量的方法。

TensorFlow中变量的初始值,可以设置成随机数、常数或者是通过其他变量的初始值,计算得到

样例中,tf.random_normal([2, 3], stddev=2)会产生一个2×3的矩阵,矩阵中的元素是均值为0,标准差为2的随机数。

–注:标准差,也称为标准偏差

tf.random_normal函数,可以通过参数mean,来指定平均值,在没有指定时默认为0。

–通过满足正态分布的随机数,来初始化神经网络中的参数,是一个常用的方法。

下面的样例,介绍了如何通过变量,实现神经网络的参数,并实现前向传播的过程。

import tensorflowas tf

# 声明变量。

w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))

b1 = tf.Variable(tf.constant(0.0, shape=[3]))

w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))

b2 = tf.Variable(tf.constant(0.0, shape=[1]))

# 暂时将输入的特征向量定义为一个常量。这里x是一个1*2的矩阵。

x = tf.constant([[0.7, 0.9]])

# 实现神经网络的前向传播过程,并计算神经网络的输出。

a = tf.nn.relu(tf.matmul(x, w1)+b1)

y = tf.nn.relu(tf.matmul(a, w2)+b2)

sess= tf.Session()

# 运行变量初始化过程。

init_op= tf.global_variables_initializer()

sess.run(init_op)

# 输出[[3.95757794]]

print(sess.run(y))

sess.close()

时间: 2024-10-27 08:08:20

1个TensorFlow样例,终于明白如何实现前向传播过程?的相关文章

Tensorflow样例代码分析cifar10

git地址:https://github.com/tensorflow/models.git"""Routine for decoding the CIFAR-10 binary file format.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import os

TensorFlow样例一

假设原函数为 f(x) = 5x^2 + 3,为了估计出这个函数,定义参数未知的函数g(x, w) = w0 x^2 + w1 x + w2,现要找出适合的w使g(x, w) ≈ f(x).将这个问题转化为求解参数w使得损失函数L(w) = ∑ (f(x) - g(x, w))^2最小,求解过程使用了随机梯度下降(Stochastic Gradient Descent).求解问题的代码如下: 1 import numpy as np 2 import tensorflow as tf 3 4 #

socket编程——一个简单的样例

从一个简单的使用TCP样例開始socket编程,其基本过程例如以下: server                                                  client +++++++                                          ++++++++ 创建socket                                          创建socket +++++++                            

最简单的基于FFmpeg的移动端样例附件:Android 自带播放器

===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:Android HelloWorld 最简单的基于FFmpeg的移动端样例:Android 视频解码器 最简单的基于FFmpeg的移动端样例:Android 视频解码器-单个库版 最简单的基于FFmpeg的移动端样例:Android 推流器 最简单的基于FFmpeg的移动端样例:Android 视频转

8/2 multi4 E找规律+模拟,空间开小了然后一直WA。。。J爆搜check不严谨WA。。。multi3 G凸包判共线写错数组名???样例太好过.想哭jpg。

multi4 Problem E. Matrix from Arrays 题意:构造一个数组,求子矩阵前缀和. 思路:打表找规律,"发现"L为奇数时循环节为L,为偶数时循环节为2L,求相应循环节的二维前缀和然后加加减减计算一下就好. 虚伪地证明一下循环节:L为奇数时对于第x行/列开始的位置有(x  +  x+L-1)*L/2   ->     (2x+L-1)/2(为整数)*L,因此扫过L行/列也就扫过了L整数倍"(2x+L-1)/2"倍的A[0]~A[L],

吴裕雄 python 神经网络——TensorFlow TFRecord样例程序

import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 定义函数转化变量类型. def _int64_feature(value): return tf.train.Feature(int64_list=tf.train.Int64List(value=[value])) def _bytes_feature(value): return tf.

关于peersim样例配置文件的超详细解读(新手勿喷)

相信很多兄弟一开始接触peersim,对配置文件还是有点不适应,我看了好久的样例的配置文件,一层层去找对应的文件的方法,终于好像悟懂了一点,记下来以后回顾. 贴上代码,一点点分析. 首先要说下所谓的配置文件,其实就是一个txt文件,语法也是非常简单,类似java里的给类里的变量赋值,这也正对应了配置文件的作用,配置文件,当然就是为实验的参数进行配置用的,所以配置文件的主要功能就是配置各类参数,定义一些协议类.控制类.初始化类以及一些常数. 1 # PEERSIM EXAMPLE 1 #配置文件中

java多线程样例

这里我们做一个完整的样例来说明线程产生的方式不同而生成的线程的差别: package debug; import java.io.*;import java.lang.Thread; class MyThread extends Thread{ public int x = 0; public void run(){ System.out.println(++x); }} class R implements Runnable{ private int x = 0; public void ru

将 Android* x86 NDK 用于 Eclipse* 并移植 NDK 演示样例应用

目标 面向 Eclipse (ADT) 的 Android 插件如今支持基于 NDK 的应用开发. 其可自己主动生成项目和构件文件以及代码存根,并可集成到整个 Android 应用开发中(构建原生库.将库拷贝到项目内的对应 JNI 目录.将应用打包以及生成带有 NDK 代码的终于 APK). 本文将讨论怎样配置 Eclipse 以利用该功能.并示范移植 NDK 应用的演示样例. 配置 Eclipse ADT 插件以配合 NDK 使用 必须先配置 Eclipse ADT 插件指向 NDK 安装路径