前向传播和反向传播实战(Tensor)

前面在mnist中使用了三个非线性层来增加模型复杂度,并通过最小化损失函数来更新参数,下面实用最底层的方式即张量进行前向传播(暂不采用层的概念)。

主要注意点如下:

  · 进行梯度运算时,tensorflow只对tf.Variable类型的变量进行记录,而不对tf.Tensor或者其他类型的变量记录

  · 进行梯度更新时,如果采用赋值方法更新即w1=w1+x的形式,那么所得的w1是tf.Tensor类型的变量,所以要采用原地更新的方式即assign_sub函数,或者再次使用tf.Variable包起来(不推荐)

代码如下:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets
import os

os.environ[‘TF_CPP_MIN_LOG_LEVEL‘]=‘2‘

# x:[60k,28,28]
# y:[60k]
(x,y),_=datasets.mnist.load_data()

x = tf.convert_to_tensor(x,dtype=tf.float32)/255.0
y = tf.convert_to_tensor(y,dtype=tf.int32)

print(x.shape,y.shape,x.dtype,y.dtype)
print(tf.reduce_min(x),tf.reduce_max(x))
print(tf.reduce_min(y),tf.reduce_max(y))

train_db=tf.data.Dataset.from_tensor_slices((x,y)).batch(128)
train_iter=iter(train_db)
sample=next(train_iter)
print(‘batch:‘,sample[0].shape,sample[1].shape)

# [b,784]=>[b,256]=>[b,128]=>[b,10]
# w shape[dim_in,dim_out] b shape[dim_out]
w1 = tf.Variable(tf.random.truncated_normal([784,256],stddev=0.1))
b1 = tf.Variable(tf.zeros([256]))

w2 = tf.Variable(tf.random.truncated_normal([256,128],stddev=0.1))
b2 = tf.Variable(tf.zeros([128]))

w3 = tf.Variable(tf.random.truncated_normal([128,10],stddev=0.1))
b3 = tf.Variable(tf.zeros([10]))

# 设置学习率
lr = 0.001
for epoch in range(10): # 对数据集迭代
    for step,(x,y) in enumerate(train_db):
        # x:[128,28,28] y:[128]
        x = tf.reshape(x,[-1,28*28])

        with tf.GradientTape() as tape: # tape只会跟踪tf.Variable
            # x:[b,28*28]
            # [b,784]@[784,256]+[256]=>[b,256]+[256]
            h1 = [email protected] + b1
            h1 = tf.nn.relu(h1) # 去线性化
            h2 = [email protected] + b2
            h2 = tf.nn.relu(h2) # 去线性化
            out = [email protected] + b3

            # 计算损失
            y_onehot = tf.one_hot(y,depth=10)
            # mse = mean(sum(y-out)^2)
            loss = tf.square(y_onehot - out)
            # mean:scalar
            loss = tf.reduce_mean(loss)

        # 计算梯度
        grads = tape.gradient(loss,[w1,b1,w2,b2,w3,b3])
        # w1 = w1 -lr * w1_grad
        w1.assign_sub(lr * grads[0]) # 原地更新
        b1.assign_sub(lr * grads[1])
        w2.assign_sub(lr * grads[2])
        b2.assign_sub(lr * grads[3])
        w3.assign_sub(lr * grads[4])
        b3.assign_sub(lr * grads[5])

        if step % 100 == 0:
            print(‘epoch = ‘,epoch,‘step =‘,step,‘,loss =‘,float(loss))

效果如下:

原文地址:https://www.cnblogs.com/zdm-code/p/12229304.html

时间: 2024-10-23 17:35:29

前向传播和反向传播实战(Tensor)的相关文章

C++从零实现深度神经网络之二——前向传播和反向传播

本文由@星沉阁冰不语出品,转载请注明作者和出处. 文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/53677630 微博:http://weibo.com/xingchenbing  前一篇博客Net类的设计和神经网络的初始化中,大部分还是比较简单的.因为最重要事情就是生成各种矩阵并初始化.神经网络中的重点和核心就是本文的内容--前向和反向传播两大计算过程.每层的前向传播分别包含加权求和(卷积?)的线性运算和激活函数的非线性运

小白学习之pytorch框架(6)-模型选择(K折交叉验证)、欠拟合、过拟合(权重衰减法(=L2范数正则化)、丢弃法)、正向传播、反向传播

下面要说的基本都是<动手学深度学习>这本花书上的内容,图也采用的书上的 首先说的是训练误差(模型在训练数据集上表现出的误差)和泛化误差(模型在任意一个测试数据集样本上表现出的误差的期望) 模型选择 验证数据集(validation data set),又叫验证集(validation set),指用于模型选择的在train set和test set之外预留的一小部分数据集 若训练数据不够时,预留验证集也是一种luxury.常采用的方法为K折交叉验证.原理为:把train set分割成k个不重合

机器学习(ML)八之正向传播、反向传播和计算图,及数值稳定性和模型初始化

正向传播 正向传播的计算图 通常绘制计算图来可视化运算符和变量在计算中的依赖关系.下图绘制了本节中样例模型正向传播的计算图,其中左下角是输入,右上角是输出.可以看到,图中箭头方向大多是向右和向上,其中方框代表变量,圆圈代表运算符,箭头表示从输入到输出之间的依赖关系. 反向传播 训练深度学习模型 在训练深度学习模型时,正向传播和反向传播之间相互依赖.一方面,正向传播的计算可能依赖于模型参数的当前值,而这些模型参数是在反向传播的梯度计算后通过优化算法迭代的而这些当前值是优化算法最近一次根据反向传播算

caffe中的前向传播和反向传播

caffe中的网络结构是一层连着一层的,在相邻的两层中,可以认为前一层的输出就是后一层的输入,可以等效成如下的模型 可以认为输出top中的每个元素都是输出bottom中所有元素的函数.如果两个神经元之间没有连接,可以认为相应的权重为0.其实上图的模型只适用于全连接层,其他的如卷积层.池化层,x与y之间很多是没有连接的,可以认为很多权重都是0,而池化层中有可能部分x与y之间是相等的,可以认为权重是1. 下面用以上的模型来说明反向传播的过程.在下图中,我用虚线将y与损失Loss之间连接了起来,表示L

前项传播和反向传播

前向传播 如图所示,这里讲得已经很清楚了,前向传播的思想比较简单.  举个例子,假设上一层结点i,j,k,-等一些结点与本层的结点w有连接,那么结点w的值怎么算呢?就是通过上一层的i,j,k等结点以及对应的连接权值进行加权和运算,最终结果再加上一个偏置项(图中为了简单省略了),最后在通过一个非线性函数(即激活函数),如ReLu,sigmoid等函数,最后得到的结果就是本层结点w的输出. 最终不断的通过这种方法一层层的运算,得到输出层结果. 对于前向传播来说,不管维度多高,其过程都可以用如下公式表

神经网络正向传播与反向传播公式

原文地址:https://www.cnblogs.com/coshaho/p/8455324.html

什么是反向传播

作者:韩小雨 类别:①反向传播算法  ②反向传播模型 反向传播算法(英:Backpropagation algorithm,简称:BP算法) 算法简介:是一种监督学习算法,常被用来训练多层感知机. 于1974年,Paul Werbos[1]首次给出了如何训练一般网络的学习算法,而人工神经网络只是其中的特例.不巧的,在当时整个人工神经网络社群中却无人知晓Paul所提出的学习算法.直到80年代中期,BP算法才重新被David Rumelhart.Geoffrey Hinton及Ronald Will

《神经网络和深度学习》系列文章十六:反向传播算法代码

出处: Michael Nielsen的<Neural Network and Deep Learning>,点击末尾“阅读原文”即可查看英文原文. 本节译者:哈工大SCIR硕士生 李盛秋 声明:如需转载请联系[email protected],未经授权不得转载. 使用神经网络识别手写数字 反向传播算法是如何工作的 热身:一个基于矩阵的快速计算神经网络输出的方法 关于损失函数的两个假设 Hadamard积 反向传播背后的四个基本等式 四个基本等式的证明(选读) 反向传播算法 反向传播算法代码

神经网络之反向传播算法实现

1 神经网络模型 以下面神经网络模型为例,说明神经网络中正向传播和反向传播过程及代码实现 1.1 正向传播 (1)输入层神经元\(i_1,i_2\),输入层到隐藏层处理过程 \[HiddenNeth_1 = w_1i_1+w_2i_2 + b_1\] \[HiddenNeth_2 = w_3i_1+w_4i_2 + b_1\] \[h_1 = sigmoid(HiddenNeth_1)\] \[h_2 = sigmoid(HiddenNeth_2)\] (2)隐藏层:神经元\(h_1,h_2\)