tensorflow实现最基本的神经网络 + 对比GD、SGD、batch-GD的训练方法
参考博客:https://zhuanlan.zhihu.com/p/27853521
该代码默认是梯度下降法,可自行从注释中选择其他训练方法
在异或问题上,由于训练的样本数较少,神经网络简单,训练结果最好的是GD梯度下降法。
# -*- coding:utf-8 -*- # 将tensorflow 引入并命名tf
import tensorflow as tf
# 矩阵操作库numpy,命名为np
import numpy as np '''
生成数据
用python使用tensorflow时,输入到网络中的训练数据需要以np.array的类型
存在。并且要限制dtype为32bit以下。变量后跟着“.astype('float32')”总可以满足要求
'''
# X和Y是4个数据的矩阵,X[i]和Y[i]的值始终对应
X = [[0, 0], [0, 1], [1, 0], [1, 1]]
Y = [[0], [1], [1], [0]]
X = np.array(X).astype('int16')
Y = np.array(Y).astype('int16') '''
定义变量
'''
# 网络结构:2维输入--> 2维隐含层 -->1维输出
# 学习速率(learing rate):0.0001 D_input = 2
D_hidden = 2
D_label = 1
lr = 0.0001
'''
容器
'''
# x为列向量 可变样本数*D_input; y为列向量 1*D_label 用GPU训练需要float32以下精度
x = tf.placeholder(tf.float32, [None, D_input], name=None)
t = tf.placeholder(tf.float32, [None, D_label], name=None) '''
隐含层
'''
# 初始化权重W [D_input ,D_hidden ]
# truncated_normal 正对数函数,返回随机截短的正态分布,默认均值为0,区间为[-2.0,2.0]
W_h1 = tf.Variable(tf.truncated_normal([D_input, D_hidden], stddev=1.0), name="W_h")
# 初始化b D_hidden 一维
b_h1 = tf.Variable(tf.constant(0.1, shape=[D_hidden]), name="b_h")
# 计算Wx+b 可变样本数*D_hidden
pre_act_h1 = tf.matmul(x, W_h1) + b_h1
# 计算a(Wx+b) a代表激活函数,有tf.nn.relu()、tf.nn.tanh()、tf.nn.sigmoid()
act_h1 = tf.nn.relu(pre_act_h1, name=None) '''
输出层
'''
W_o = tf.Variable(tf.truncated_normal([D_hidden, D_label], stddev=1.0), name="W_o")
b_o = tf.Variable(tf.constant(0.1, shape=[D_label]), name="b_o")
pre_act_o = tf.matmul(act_h1, W_o) + b_o
y = tf.nn.relu(pre_act_o, name=None) '''
损失函数和更新方法
'''
loss = tf.reduce_mean((y - t)**2)
train_step = tf.train.AdamOptimizer(lr).minimize(loss)
'''
训练
sess = tf.InteractiveSession()是比较方便的创建方法。也有sess =
tf.Session()方式,但该方式无法使用tensor.eval()快速取值等功能
'''
sess = tf.InteractiveSession()
# 初始化权重
# tf.tables_initializer(name="init_all_tables").run()调试时报错,可能是版本问题
# Add the variable initializer Op.
init = tf.global_variables_initializer()
sess.run(init)
# 训练网络
'''
GD(Gradient Descent):X和Y是4组不同的训练数据。上面将所有数据输入到网络,
算出平均梯度来更新一次网络的方法叫做GD。效率很低,也容易卡在局部极小值,但更新方向稳定
''' T = 100000 # 训练次数
for i in range(T):
sess.run(train_step, feed_dict={x: X, t: Y}) '''
SGD(Gradient Descent):一次只输入一个训练数据到网络,算出梯度来更新一次网络的方法叫做SGD。
效率高,适合大规模学习任务,容易挣脱局部极小值(或鞍点),但更新方向不稳定。代码如下
'''
'''
T = 100000 # 训练几epoch
for i in range(T):
for j in range(X.shape[0]): # X.shape[0]表示样本个数 X.shape[0] 报错 'Placeholder:0', which has shape '(?, 2)
sess.run(train_step, feed_dict={x: [X[j]], t: [Y[j]]})
'''
'''
batch-GD:这是上面两个方法的折中方式。每次计算部分数据的平均梯度来更新权重。
部分数据的数量大小叫做batch_size,对训练效果有影响。一般10个以下的也叫mini-batch-GD。代码如下:
'''
'''
T = 10000 # 训练几epoch
b_idx = 0 # batch计数
b_size = 2 # batch大小
for i in range(T):
while b_idx <= X.shape[0]:
sess.run(train_step, feed_dict={x: X[b_idx:b_idx+b_size], t: Y[b_idx:b_idx+b_size]})
b_idx += b_size # 更新batch计数
''' '''
shuffle:SGD和batch-GD由于只用到了部分数据。若数据都以相同顺序进入网络会使得随后的epoch影响很小。
shuffle是用于打乱数据在矩阵中的排列顺序,提高后续epoch的训练效果。代码如下:
'''
'''
# shuffle
def shufflelists(lists): # 多个序列以相同顺序打乱
ri = np.random.permutation(len(lists[1]))
out = []
for l in lists:
out.append(l[ri])
return out # 训练网络
T = 100000 # 训练几epoch
b_idx = 0 # batch计数
b_size = 2 # batch大小
for i in range(T): # 每次epoch都打乱顺
X, Y = shufflelists([X, Y])
while b_idx <= X.shape[0]:
sess.run(train_step, feed_dict={x: X[b_idx:b_idx + b_size], t: Y[b_idx:b_idx + b_size]})
b_idx += b_size # 更新batch计数
'''
# 预测数据
print(sess.run(y, feed_dict={x: X}))
print(sess.run(act_h1, feed_dict={x: X}))
tensorflow实现最基本的神经网络 + 对比GD、SGD、batch-GD的训练方法的更多相关文章
- 【DeepLearning】优化算法:SGD、GD、mini-batch GD、Moment、RMSprob、Adam
优化算法 1 GD/SGD/mini-batch GD GD:Gradient Descent,就是传统意义上的梯度下降,也叫batch GD. SGD:随机梯度下降.一次只随机选择一个样本进行训练和 ...
- TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络
转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到Issue区讨论 官方教程地址 视频/字幕下载 全 ...
- TensorFlow实现与优化深度神经网络
TensorFlow实现与优化深度神经网络 转载请注明作者:梦里风林Github工程地址:https://github.com/ahangchen/GDLnotes欢迎star,有问题可以到Issue ...
- TensorFlow 深度学习笔记 卷积神经网络
Convolutional Networks 转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到Is ...
- 2 TensorFlow入门笔记之建造神经网络并将结果可视化
------------------------------------ 写在开头:此文参照莫烦python教程(墙裂推荐!!!) ---------------------------------- ...
- 使用TensorFlow v2.0构建卷积神经网络
使用TensorFlow v2.0构建卷积神经网络. 这个例子使用低级方法来更好地理解构建卷积神经网络和训练过程背后的所有机制. CNN 概述 MNIST 数据集概述 此示例使用手写数字的MNIST数 ...
- SGD、GD
GD参考: https://blog.csdn.net/CharlieLincy/article/details/70767791 SGD参考:https://blog.csdn.net/Charli ...
- 【小知识】神经网络中的SGD优化器和MSE损失函数
今天来讲下之前发的一篇极其简单的搭建网络的博客里的一些细节 (前文传送门) 之前的那个文章中,用Pytorch搭建优化器的代码如下: # 设置优化器 optimzer = torch.optim.SG ...
- 一文读懂神经网络训练中的Batch Size,Epoch,Iteration
一文读懂神经网络训练中的Batch Size,Epoch,Iteration 作为在各种神经网络训练时都无法避免的几个名词,本文将全面解析他们的含义和关系. 1. Batch Size 释义:批大小, ...
随机推荐
- shiro进行散列算法操作
shiro最闪亮的四大特征:认证,权限,加密,会话管理 为了提高应用系统的安全性,这里主要关注shiro提供的密码服务模块: 1.加密工具类的熟悉 首先来个结构图,看看shiro提供了哪些加密工具类: ...
- 有了Openvswitch和Docker,终于可以做《TCP/IP详解》的实验了!
所有做过网络编程的程序员,想必都会看<TCP/IP详解>卷一:协议 后来出了第二版,但是由于第一版才是Rechard Stevens的原版,本人还是多次看了第一版. 对这一版印象最深的就是 ...
- service不死之身
为了应用常驻后台,避免被第三方杀掉的方法 1)Service设置成START-STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样 2)通过startForegrou ...
- UVA-12166 天平性质+字符处理
这题思维难度很大,关键是总结这个性质. 1.天平性质:某个秤砣重量为w,高度为h,如果要让这个天平平衡并且以这个秤砣为基准,那么整个天平的总重量为w*(2^h) 2.利用这个性质:题目要求秤砣数量改变 ...
- Spring / Hibernate 应用性能调优
来源:ImportNew - 陈晓舜 对大部分典型的Spring/Hibernate企业应用来说,应用的性能大部分由持久层的性能决定. 这篇文章会重温一下怎么去确认我们的应用是否是”数据库依赖(dat ...
- JVM笔记5-对象的访问定位。
java虚拟机中指定一个栈内存的引用指向了堆内存中的对象.这样说只是笼统的说法.而指向堆内存中的对象就一定是栈引用所需要的那个对象吗?其实并不定. 这就需要知道对象的访问定位方式有两种: 1.使用句柄 ...
- ubuntu常用命令操作
建立文件夹软链接 ln -s 源文件 目标文件 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下 ...
- Git & github 使用指南
Git的安装: 1.下载 Git for windows下载网址:https://git-for-windows.github.io/ 2.安装 选择安装路径: 选择组件:默认 是否修改环境变量 : ...
- linux内核移植X86平台的例子
bootloader支持启动多个Linux 内核安装(X86平台) 1. cparch/x86/boot/bzImage /boot/vmlinuz-$version 2. cp $initrd /b ...
- vxworks下的串口测试程序
VXWORKS串口设置说明: 一般有这么几步: 打开串口 设置串口raw模式,清空输入输出的缓冲区 设置波特率,数据位,停止位,校验方式 便可以开始读和写 打开串口: fd = open(" ...