tensorflow2.0学习(神经网络的创建)

单层神经网络的创建

  1. 张量方式实现
import tensorflow as tf
x = tf.random.normal([2, 784])
w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))
b1 = tf.Variable(tf.zeros([256]))
o1 = x @ w1 + b1
print(o1.shape)
o1 = tf.nn.relu(o1)  # 激活
print(o1.shape)
  1. 层方式实现
import tensorflow as tf
from tensorflow.keras import layers
x = tf.random.normal([4, 784, 784])
fc = layers.Dense(512, activation=tf.nn.relu) 3 只用确定输出形状和激活函数
h1 = fc(x)  # 通过fc类完成一次全连接层的计算
w1 = fc.kernel  # 获取Dense类的权值矩阵
print(w1)
b1 = fc.bias
print(b1)  # 获取Dense类的偏置向量
# 在优化参数时,需要获得网络的所有待优化的参数张量列表,可以通过类的trainable_variables来返回参数列表
trainableVariables = fc.trainable_variables
print(trainableVariables)
# 获得所有不参与梯度优化的参数列表
nonTrainableVariables = fc.non_trainable_variables
print(nonTrainableVariables)
# 获取所有参数列表
variables = fc.variables
print(variables)

对于全连接层,内部所有参数都参与了梯度优化,所以variables=trainableVariables。
利用网络层类对象进行前向计算时,只需要调用类的__call__方法即可,即写成 fc(x) 方式,它会自动调用类的__call__方法,在__call__方法中自动调用 call 方法,全连接层类 在 call 方法中实现了𝜎(𝑋@𝑊 + 𝒃)的运算逻辑,最后返回全连接层的输出张量。

多层神经网络的创建

在这里插入图片描述

  1. 张量方式实现:
import tensorflow as tf
"""首先定义各层的权重和偏置"""
# 隐藏层1张量
w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))
b1 = tf.Variable(tf.zeros([256]))
# 隐藏层2张量
w2 = tf.Variable(tf.random.truncated_normal([256, 128], stddev=0.1))
b2 = tf.Variable(tf.zeros([128]))
# 隐藏层3层张量
w3 = tf.Variable(tf.random.truncated_normal([128, 64], stddev=0.1))
b3 = tf.Variable(tf.zeros([64]))
# 输出层张量
w4 = tf.Variable(tf.random.truncated_normal([128, 64], stddev=0.1))
b4 = tf.Variable(tf.zeros([64]))
# 计算时只需要按照层的顺序,将上一层的输出送入当前层的输入即可,重复至最后一层
with tf.GradientTape() as tape:  # 梯度记录器
    # x: [b, 784]
    # 隐藏层1前向计算, [b, 784] => [b, 256]
    h1 = x @ w1 + tf.broadcast_to(b1, [x.shape[0], 256])  # 直接加b1也可
    h1 = tf.nn.relu(h1)
    # 隐藏层2前向计算,[b, 256] => [b, 128]
    h2 = h1 @ w2 + b2
    h2 = tf.nn.relu(h2)
    # 隐藏层3前向计算, [b, 128] => [b, 64]
    h3 = h2 @ w3 + b3
    h3 = tf.nn.relu(h3)
    # 输出层前向计算, [b, 64] => [b, 10]
    h4 = h3 @ w4 + b4


在使用 TensorFlow 自动求导功能计算梯度时,需要将前向计算过程放置在 tf.GradientTape()环境中,从而利用 GradientTape 对象的 gradient()方法自动求解参数的梯度,并利用 optimizers 对象更新参数。

  1. 层方式实现:
import tensorflow as tf
from tensorflow.keras import layers
fc1 = layers.Dense(256, activation=tf.nn.relu)
fc2 = layers.Dense(128, activation=tf.nn.relu)
fc3 = layers.Dense(64, activation=tf.nn.relu)
fc4 = layers.Dense(10, activation=tf.nn.relu)
# 在前向计算时,依序通过各个网络层即可:
x = tf.random.normal([4, 784])
h1 = fc1(x)
h2 = fc2(h1)
h3 = fc2(h2)
h4 = fc2(h3)

对于这种数据依次向前传播的网络,也可以通过 Sequential 容器封装成一个网络大类对 象,调用大类的前向计算函数即可完成所有层的前向计算:

import tensorflow as tf
from tensorflow.keras import layers
model = layers.Sequential([
	layers.Dense(256, activation=tf.nn.relu),
	layers.Dense(128, activation=tf.nn.relu),
	layers.Dense(64, activation=tf.nn.relu),
	layers.Dense(10, activation=None)
])
# 前向运算只需要调用一次网络大类对象即可所有层的顺序计算
out = model(x)  # 前向计算得到输出

优化目标:

我们把神经网络从输入到输出的计算过程叫做前向传播(Forward propagation)。神经网络的前向传播过程,也是数据张量(Tensor)从第一层流动(Flow)至输出层的过程:从输入数据开始,途径每个隐藏层,直至得到输出并计算误差,这也是 TensorFlow 框架名字意义所在。 前向传播的最后一步就是完成误差的计算 :

ℒ = 𝑔(𝑓𝜃(𝒙),𝒚)

其中𝑓𝜃(∙)代表了利用𝜃参数化的神经网络模型,𝑔(∙)称之为误差函数,用来描述当前网络的预测值𝑓𝜃(𝒙)与真实标签𝒚之间的差距度量,比如常用的均方差误差函数,ℒ称为网络的误差 (Error,或损失 Loss),一般为标量。我们希望通过在训练集𝔻𝑡𝑟𝑎𝑖𝑛上面学习到一组参数𝜃使 得误差的误差ℒ最小:

𝜃∗ = 𝑎𝑟𝑔𝑚𝑖𝑛 𝑔(𝑓𝜃(𝒙),𝒚), 𝑥 ∈ 𝔻𝑡𝑟𝑎𝑖𝑛

上述的𝑎𝑟𝑔𝑚𝑖𝑛 优化问题一般采用误差反向传播算法求解网络参数𝜃的梯度信息,并利用梯度下降算法迭代更新:

𝜃′ = θ − η ∗ ∇𝜃ℒ

利用误差反向传播算法进行反向计算的过程也叫反向传播(Backward propagation)。

从另一个角度来理解神经网络,它完成的是特征的维度变换的功能,
比如 4 层的 MNIST 手写数字图片识别的全连接网络,
它依次完成了784 → 256 → 128 → 64 → 10的特 征降维过程。
原始的特征通常具有较高的维度,包含了很多底层特征及无用信息,
通过神经网络的层层特征变换,将较高的维度降维到较低的维度,
此时的特征一般包含了与任务 强相关的高层特征信息,
通过对这些特征进行简单的逻辑判定即可完成特定的任务,如图 片的分类。

计算全连接层的网络参数数量

网络的参数量是衡量网络规模的重要指标。那么怎么计算全连接层的参数量呢?
考虑 权值矩阵W,偏置 b,输入特征长度为𝑑𝑖𝑛,输出特征长度为𝑑𝑜𝑢𝑡的网络层,其参数量为 𝑑𝑖𝑛 ∗ 𝑑𝑜𝑢𝑡,再加上偏置 b 的参数,总参数量为:
𝑑𝑖𝑛 ∗ 𝑑𝑜𝑢𝑡 + 𝑑𝑜𝑢𝑡
对于多层的全连接神经网络,比如784 → 256 → 128 → 64 → 10,总参数量计算表达式: 256 ∗ 784 + 256 + 128 ∗ 256 + 128 + 64 ∗ 128 + 64 + 10 ∗ 64 + 10 = 242762 约 242K 个参数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值