神经网络与深度学习——神经网络基础——m个样本的梯度下降

上一节是将梯度下降法应用在只有一个样本的问题中,接下来讨论m个样本

首先复习一下m个样本的相关公式

在这里插入图片描述

可以推算出
在这里插入图片描述
基于上面的公式,我们可以写出下面的代码,这里我们还是认为一个样本只有两个特征值,所以w的个数是2个
在这里插入图片描述
代码解释:首先将参数初始化,遍历m个样本,算出每一个样本的预测值,求出该样本预测值的损失函数并累加。接下来是反向传播过程,求出中间函数的导数,进而求得三个参数的导数并累加。遍历结束之后,将J成本函数和三个参数除以m,就能得出全部样本的成本函数和参数导数。

学习神经网络训练方式,梯度下降方法有个疑问 1、如下图所示训练过程,迭代得话,不应该继续用同一个样本计算权重直到得到loss极值? 2、我的理解就是每个样本都对应一个loss极值,不是吗?但是如果用不同样本去训练,用A训练得到一个最小loss适合样本A,用B训练得到适合样本B的最小loss,那就不适合A了啊? ![图片说明](https://img-ask.csdn.net/upload/201907/16/1563289204_340670.png) 3、如下代码怎么理解,每个训练批次和重复使用样本的意义 其中feed_dict函数意义是什么:如果是30000步,每步喂一个批次8个样本是怎么训练的? ``` import tensorflow as tf import numpy as np BATCH_SIZE=8 seed=23455 ####1 样本和标签的生成 #基于seed产生随机数 rng=np.random.RandomState(seed) #随机数返回32行2列的矩阵,作为输入样本 X=rng.rand(32,2) #设置标签Y,给每行样本进行设置:和<1==>1 Y=[[int(x0+x1<1)] for(x0,x1) in X] print('X:\n',X) print('Y:\n',Y) ####2 定义神经网络输入、参数和输出,定义前向网络 x=tf.placeholder(tf.float32,shape=(None,2)) y_=tf.placeholder(tf.float32,shape=(None,1))#True lable #其中的3是隐藏层的神经元个数,列举:只有一个隐藏层(w1,w2) 有两个隐藏层(w1,w2,w3) #n个隐藏层有n+1个权值矩阵 w1= tf.Variable(tf.random_normal([2,3], stddev=1,seed=1)) w2= tf.Variable(tf.random_normal([3,1], stddev=1,seed=1)) a= tf.matmul(x,w1) y= tf.matmul(a,w2) ####3 定义损失函数及反向传播方法 loss=tf.reduce_mean(tf.square(y-y_))#loss函数:均方误差:差的平方和均值 train_step= tf.train.GradientDescentOptimizer(0.001).minimize(loss)#梯度下降方向传播算法 #train_step= tf.train.MomentumOptimizer(0.001,0.9).minimize(loss) #train_step= tf.train.AdamOptimizer(0.001).minimize(loss) ####4 创建会话 with tf.Session() as sess: init_op = tf.global_variables_initializer() sess.run(init_op) #输出未经训练,随机生成的参数 print('w1:\n', sess.run(w1)) print('w2:\n', sess.run(w2)) print('\n') ####5 训练模型 STEPS= 30000 for i in range(STEPS): start=(i*BATCH_SIZE)%32 end = start+BATCH_SIZE sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]}) if i % 500 == 0: total_loss=sess.run(loss, feed_dict={x: X, y_: Y}) print('After %d training steps, loss on all data is %g'%(i, total_loss)) ####6 输出训练后的参数 print('\n') print('w1:\n', sess.run(w1)) print('w2:\n', sess.run(w2)) ```
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页