青岛专业做网站优化,网站再就业培训班,山东网站营销推广费用,企业网站开发课程的能力应用学习参考#xff1a; 
动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning 
①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面#xff08;学习参考#x…学习参考 
动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning 
①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)以达到集多方教程的精华于一文的目的。 ③非常推荐上面学习参考的前两个教程在网上是开源免费的写的很棒不管是开始学还是复习巩固都很不错的。 
深度学习回顾专栏内容来源多个书籍笔记、在线笔记、以及自己的感想、想法佛系更新。争取内容全面而不失重点。完结时间到了也会一直更新下去已写完的笔记文章会不定时一直修订修改(删、改、增)以达到集多方教程的精华于一文的目的。所有文章涉及的教程都会写在开头、一起学习一起进步。 
一、多层感知机 
1.隐藏层 
仿射变换 它是一种带有偏置项的线性变换。 
1线性模型可能出错 
线性意味着单调假设 任何特征的增大都会导致模型输出的增大如果对应的权重为正 或者导致模型输出的减小如果对应的权重为负。 
例如如果试图预测一个人是否会偿还贷款。 可以认为在其他条件不变的情况下 收入较高的申请人比收入较低的申请人更有可能偿还贷款。 但是虽然收入与还款概率存在单调性但它们不是线性相关的。 收入从0增加到5万可能比从100万增加到105万带来更大的还款可能性。 处理这一问题的一种方法是对数据进行预处理 使线性变得更合理如使用收入的对数作为特征。 
可以很容易找出违反单调性的例子。 例如想要根据体温预测死亡率。 对体温高于37摄氏度的人来说温度越高风险越大。 然而对体温低于37摄氏度的人来说温度越高风险就越低。 在这种情况下也可以通过一些巧妙的预处理来解决问题。在这种情况下也可以通过一些巧妙的预处理来解决问题。 例如可以使用与37摄氏度的距离作为特征。 
但是如何对猫和狗的图像进行分类呢 增加位置 (13,17) 处像素的强度是否总是增加或降低图像描绘狗的似然 对线性模型的依赖对应于一个隐含的假设 即区分猫和狗的唯一要求是评估单个像素的强度。 在一个倒置图像后依然保留类别的世界里这种方法注定会失败。与前面的例子相比这里的线性很荒谬 而且难以通过简单的预处理来解决这个问题。 
对于深度神经网络使用观测数据来联合学习隐藏层表示和应用于该表示的线性预测器。 
2网络中加入隐藏层 
可以通过在网络中加入一个或多个隐藏层来克服线性模型的限制 使其能处理更普遍的函数关系类型。 要做到这一点最简单的方法是将许多全连接层堆叠在一起。 每一层都输出到上面的层直到生成最后的输出。 
可以把前 −1 层看作表示把最后一层看作线性预测器。 这种架构通常称为多层感知机multilayer perceptron通常缩写为MLP。  这个多层感知机有4个输入3个输出其隐藏层包含5个隐藏单元。 输入层不涉及任何计算因此使用此网络产生输出只需要实现隐藏层和输出层的计算。 因此这个多层感知机中的层数为2。 注意这两个层都是全连接的。 每个输入都会影响隐藏层中的每个神经元 而隐藏层中的每个神经元又会影响输出层中的每个神经元。具有全连接层的多层感知机的参数开销可能会高得令人望而却步。 即使在不改变输入或输出大小的情况下 可能在参数节约和模型有效性之间进行权衡 。 
3 从线性到非线性 
在深度学习中从线性模型到非线性模型的转变通常是通过引入非线性激活函数来实现的。这种非线性转换对于神经网络的表达能力至关重要使其能够学习和表示更加复杂的模式和关系。 
在数学或代码中也被称为隐藏层变量hidden-layer variable 或隐藏变量hidden variable。 因为隐藏层和输出层都是全连接的 所以有隐藏层权重(1) 和隐藏层偏置(1)以及输出层权重(2)和输出层偏置(2)。 形式上按如下方式计算单隐藏层多层感知机的输出   对于任意权重值 我们只需合并隐藏层便可产生具有参数 (1)(2) 和 (1)(2)(2)的等价单层模型  在仿射变换之后对每个隐藏单元应用非线性的激活函数activation function  。 激活函数的输出例如 (⋅) 被称为活性值activations。 一般来说有了激活函数就不可能再将多层感知机退化成线性模型  
4通用近视定理 
多层感知机可以通过隐藏神经元捕捉到输入之间复杂的相互作用 这些神经元依赖于每个输入的值。 在一对输入上进行基本逻辑操作多层感知机是通用近似器。 即使是网络只有一个隐藏层给定足够的神经元和正确的权重 可以对任意函数建模尽管实际中学习该函数是很困难的。虽然一个单隐层网络能学习任何函数 但并不意味着应该尝试使用单隐藏层网络来解决所有问题。 事实上通过使用更深而不是更广的网络可以更容易地逼近许多函数。 
2.激活函数 
激活函数activation function通过计算加权和并加上偏置来确定神经元是否应该被激活 它们将输入信号转换为输出的可微运算。 大多数激活函数都是非线性的。 
激活函数的主要作用包括 
引入非线性激活函数的非线性特性使神经网络能够学习非线性关系从而提高网络的表达能力。解决梯度消失问题使用非线性激活函数可以避免梯度在反向传播过程中消失或爆炸有助于更稳定地训练深层神经网络。增加模型的表达能力通过引入不同形式的非线性变换激活函数使神经网络能够逼近任意复杂的函数。稀疏激活某些激活函数如ReLU能够使神经元在训练过程中变得稀疏从而提高网络的泛化能力。 
%matplotlib inline
import tensorflow as tf
from d2l import tensorflow as d2l1 ReLU激活函数 
最受欢迎的激活函数是修正线性单元Rectified linear unitReLU 因为它实现简单同时在各种预测任务中表现良好。 ReLU提供了一种非常简单的非线性变换。 给定元素  ReLU函数被定义为该元素与 0 的最大值  ReLU函数通过将相应的活性值设为0仅保留正元素并丢弃所有负元素。 为了直观感受一下可以画出函数的曲线图。 正如从图中所看到激活函数是分段线性的。 
x  tf.Variable(tf.range(-8.0, 8.0, 0.1), dtypetf.float32)
y  tf.nn.relu(x)
d2l.plot(x.numpy(), y.numpy(), x, relu(x), figsize(5, 2.5))当输入为负时ReLU函数的导数为0而当输入为正时ReLU函数的导数为1。 注意当输入值精确等于0时ReLU函数不可导。 在此时默认使用左侧的导数即当输入为0时导数为0。 可以忽略这种情况因为输入可能永远都不会是0。 
# 可视化其导数
with tf.GradientTape() as t:y  tf.nn.relu(x)
d2l.plot(x.numpy(), t.gradient(y, x).numpy(), x, grad of relu,figsize(5, 2.5))使用ReLU的原因是它求导表现得特别好要么让参数消失要么让参数通过。 这使得优化表现得更好并且ReLU减轻了困扰以往神经网络的梯度消失问题。 
2pReLU激活函数 
ReLU函数有许多变体包括参数化ReLUParameterized ReLUpReLU 函数。 该变体为ReLU添加了一个线性项因此即使参数是负的某些信息仍然可以通过  
3sigmoid激活函数 
对于一个定义域在 ℝ中的输入 sigmoid函数将输入变换为区间(0, 1) 上的输出。 因此sigmoid通常称为挤压函数squashing function 它将范围-inf, inf中的任意输入压缩到区间0, 1中的某个值。当输入接近0时sigmoid函数接近线性变换。  
y  tf.nn.sigmoid(x)
d2l.plot(x.numpy(), y.numpy(), x, sigmoid(x), figsize(5, 2.5))sigmoid函数的导数为下面的公式当输入为0时sigmoid函数的导数达到最大值0.25 而输入在任一方向上越远离0点时导数越接近0。  
with tf.GradientTape() as t:y  tf.nn.sigmoid(x)
d2l.plot(x.numpy(), t.gradient(y, x).numpy(), x, grad of sigmoid,figsize(5, 2.5))4tanh激活函数 
与sigmoid函数类似 tanh(双曲正切)函数也能将其输入压缩转换到区间(-1, 1) 上。tanh函数的公式如下  当输入在0附近时tanh函数接近线性变换。 函数的形状类似于sigmoid函数 不同的是tanh函数关于坐标系原点中心对称。 
y  tf.nn.tanh(x)
d2l.plot(x.numpy(), y.numpy(), x, tanh(x), figsize(5, 2.5))tanh函数的导数如下 当输入接近0时tanh函数的导数接近最大值1。 与在sigmoid函数图像中看到的类似 输入在任一方向上越远离0点导数越接近0。  
with tf.GradientTape() as t:y  tf.nn.tanh(x)
d2l.plot(x.numpy(), t.gradient(y, x).numpy(), x, grad of tanh,figsize(5, 2.5))二、从0实现多层感知机MLP 
1.加载Fashion-MNIST图像分类数据集 
import tensorflow as tf
from d2l import tensorflow as d2lbatch_size  256
train_iter, test_iter  d2l.load_data_fashion_mnist(batch_size)# 一个批次有256个样本,一个样本由一个X和对应的Y组成
print(len(next(iter(train_iter))[1]))
next(iter(train_iter))2.初始化模型参数 
Fashion-MNIST中的每个图像由 28×28784 个灰度像素值组成。 所有图像共分为10个类别。 忽略像素之间的空间结构 可以将每个图像视为具有784个输入特征 和10个类的简单分类数据集。 
实现一个具有单隐藏层的多层感知机 它包含256个隐藏单元。可以将这两个变量都视为超参数。 通常选择2的若干次幂作为层的宽度。 因为内存在硬件中的分配和寻址方式这么做往往可以在计算上更高效。 用几个张量来表示参数。 注意对于每一层都要记录一个权重矩阵和一个偏置向量。 跟以前一样要为损失关于这些参数的梯度分配内存。 
num_inputs, num_outputs, num_hiddens  784, 10, 256W1  tf.Variable(tf.random.normal(shape(num_inputs, num_hiddens), mean0, stddev0.01))
b1  tf.Variable(tf.zeros(num_hiddens))
W2  tf.Variable(tf.random.normal(shape(num_hiddens, num_outputs), mean0, stddev0.01))
b2  tf.Variable(tf.zeros(num_outputs))params  [W1, b1, W2, b2]3.激活函数 
实现ReLU激活函数。 
def relu(X):return tf.math.maximum(X, 0)4.实现MLP模型 
使用reshape将每个二维图像转换为一个长度为num_inputs的向量。 
def net(X):X  tf.reshape(X, (-1, num_inputs))H  relu(tf.matmul(X, W1)  b1)return tf.matmul(H, W2)  b25.损失函数 
def loss(y_hat, y):return tf.losses.sparse_categorical_crossentropy(y, y_hat, from_logitsTrue)也可以用下面这个一样的 
def cross_entropy(y_hat, y):return -tf.math.log(tf.boolean_mask(y_hat, tf.one_hot(y, depthy_hat.shape[-1]))) 
6.训练模型 
多层感知机的训练过程与softmax回归的训练过程完全相同。 可以直接调用d2l包的train_ch3函数。 
num_epochs, lr  10, 0.1
updater  d2l.Updater([W1, W2, b1, b2], lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)7.评估 
对学习到的模型进行简单评估 
d2l.predict_ch3(net, test_iter)三、简洁实现多层感知机MLP 
1.tf2.x简洁实现MLP模型 
添加了2个全连接层之前只添加了1个全连接层。 第一层是[隐藏层]它(包含256个隐藏单元并使用了ReLU激活函数)。 第二层是输出层。 
训练过程的实现与实现softmax回归时完全相同 这种模块化设计使能够将与模型架构有关的内容独立出来。 
import tensorflow as tf
from d2l import tensorflow as d2ltrain_iter, test_iter  d2l.load_data_fashion_mnist(batch_size)net  tf.keras.models.Sequential([tf.keras.layers.Flatten(),tf.keras.layers.Dense(256, activationrelu),tf.keras.layers.Dense(10)])batch_size, lr, num_epochs  256, 0.1, 10
loss  tf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue)
trainer  tf.keras.optimizers.SGD(learning_ratelr)d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)d2l.predict_ch3(net, test_iter)