用tensorflow构建神经网络学习简单函数
目标是学习\(y=2x+3\)
建立一个5层的神经网络,用平方误差作为损失函数。
代码如下:
import tensorflow as tf
import numpy as np
import time
x_size=200000
dim=2
x_data=np.random.random([x_size,dim]).astype('float32')
y_data=2*x_data+3
x_test=np.random.random([10,dim]).astype('float32')
y_test=2*x_test+3
train_x=tf.placeholder(tf.float32,shape=[None,dim])
train_y=tf.placeholder(tf.float32,shape=[None,dim])
weight1=tf.Variable(tf.truncated_normal([dim,40],stddev=0.1))
b1=tf.Variable(tf.zeros([40])+0.1)
h1=tf.nn.relu(tf.matmul(train_x,weight1)+b1)
weight2=tf.Variable(tf.truncated_normal([40,40],stddev=0.1))
b2=tf.Variable(tf.zeros([40])+0.1)
h2=tf.nn.relu(tf.matmul(h1,weight2)+b2)
weight3=tf.Variable(tf.truncated_normal([40,40],stddev=0.1))
b3=tf.Variable(tf.zeros([40])+0.1)
h3=tf.nn.relu(tf.matmul(h2,weight3)+b3)
weight4=tf.Variable(tf.truncated_normal([40,40],stddev=0.1))
b4=tf.Variable(tf.zeros([40])+0.1)
h4=tf.nn.relu(tf.matmul(h3,weight4)+b4)
weight5=tf.Variable(tf.truncated_normal([40,dim],stddev=0.1))
b5=tf.Variable(tf.zeros([dim])+0.1)
y_output=tf.nn.relu(tf.matmul(h4,weight5)+b5)
loss=tf.reduce_mean(tf.square(train_y-y_output))
optimizer=tf.train.GradientDescentOptimizer(0.5)
train_step=optimizer.minimize(loss)
t1=time.time()
sess=tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(2000):
feed_train={
train_x:x_data,
train_y:y_data
}
if i%100==0:
print('loss:',sess.run(loss,feed_dict=feed_train),end=', ')
sess.run(train_step,feed_dict=feed_train)
print()
t2=time.time()
print('Total Time:',t2-t1)
print('test')
for i in range(10):
feed_test={train_x:x_test[i:i+1],train_y:y_test[i:i+1]}
print('y: ',sess.run(train_y,feed_dict=feed_test))
print('y_output:',sess.run(y_output,feed_dict=feed_test))
print('loss:',sess.run(loss,feed_dict=feed_test))
sess.close()
结果:
loss: 15.4106, loss: 0.232037, loss: 0.211914, loss: 0.198133, loss: 0.0544874, loss: 0.0280089, loss: 0.0211618, loss: 0.0173591, loss: 0.0109964, loss: 0.00902615, loss: 0.00815686, loss: 0.00941989, loss: 0.00619169, loss: 0.00529554, loss: 0.00506653, loss: 0.00660528, loss: 0.00382864, loss: 0.00412649, loss: 0.00610038, loss: 0.00354737,
Total Time: 88.89598035812378
test
y: [[ 4.46494102 4.53034449]]
y_output: [[ 4.48269606 4.44468594]]
loss: 0.00382631
y: [[ 3.21122026 4.36406898]]
y_output: [[ 3.22117805 4.2706871 ]]
loss: 0.00440967
y: [[ 3.58840036 4.41665506]]
y_output: [[ 3.59200501 4.3375597 ]]
loss: 0.00313453
y: [[ 3.49797821 4.21883869]]
y_output: [[ 3.51356149 4.14429617]]
loss: 0.00289971
y: [[ 3.75655651 4.35610151]]
y_output: [[ 3.76163697 4.26597834]]
loss: 0.004074
y: [[ 4.52173853 4.32090807]]
y_output: [[ 4.53192806 4.2343545 ]]
loss: 0.00379767
y: [[ 4.19067335 4.8417387 ]]
y_output: [[ 4.20001888 4.73385048]]
loss: 0.0058636
y: [[ 4.58287668 3.89965653]]
y_output: [[ 4.59979439 3.84099913]]
loss: 0.00186345
y: [[ 4.25389147 3.75640154]]
y_output: [[ 4.23791742 3.69044876]]
loss: 0.00230247
y: [[ 3.40870714 4.49888897]]
y_output: [[ 3.41926885 4.42829704]]
loss: 0.00254738
可以看出在训练集上loss不断减小,最后下降到0.00354737,而在测试集上loss也在0.003左右。
由于参数是随机设置的,有时候可能陷入局部最优中,多运行几次可以减少陷入局部最优的概率。
将优化算法换成:
optimizer=tf.train.AdamOptimizer()
后的结果:
loss: 15.6427, loss: 0.197051, loss: 0.174776, loss: 0.164641, loss: 0.15766, loss: 0.131154, loss: 0.0029341, loss: 0.000404288, loss: 0.000178629, loss: 9.63827e-05, loss: 5.74653e-05, loss: 3.65505e-05, loss: 2.44332e-05, loss: 1.69916e-05, loss: 1.22397e-05, loss: 9.06447e-06, loss: 6.86902e-06, loss: 5.31113e-06, loss: 4.16228e-06, loss: 3.30907e-06,
Total Time: 89.90041589736938
test
y: [[ 4.46494102 4.53034449]]
y_output: [[ 4.46485758 4.53046322]]
loss: 1.05304e-08
y: [[ 3.21122026 4.36406898]]
y_output: [[ 3.21072125 4.36450434]]
loss: 2.19271e-07
y: [[ 3.58840036 4.41665506]]
y_output: [[ 3.58802533 4.41699553]]
loss: 1.28282e-07
y: [[ 3.49797821 4.21883869]]
y_output: [[ 3.49763799 4.2191186 ]]
loss: 9.70489e-08
y: [[ 3.75655651 4.35610151]]
y_output: [[ 3.75626636 4.35636234]]
loss: 7.61112e-08
y: [[ 4.52173853 4.32090807]]
y_output: [[ 4.52174997 4.32091379]]
loss: 8.18545e-11
y: [[ 4.19067335 4.8417387 ]]
y_output: [[ 4.19037819 4.84208441]]
loss: 1.03317e-07
y: [[ 4.58287668 3.89965653]]
y_output: [[ 4.58305788 3.89945245]]
loss: 3.7242e-08
y: [[ 4.25389147 3.75640154]]
y_output: [[ 4.25399828 3.75623488]]
loss: 1.95912e-08
y: [[ 3.40870714 4.49888897]]
y_output: [[ 3.40823555 4.49932337]]
loss: 2.05551e-07
使用RMSPropOptimizer,最小loss:0.33
使用FtrlOptimizer,最小loss:0.17
使用MomentumOptimizer(learning_rate=0.1,momentum=0.6),loss:4.47119e-06, 但是不是很稳定。
用tensorflow构建神经网络学习简单函数的更多相关文章
- 使用 Visual Studio 2015 + Python3.6 + tensorflow 构建神经网络时报错:'utf-8' codec can't decode byte 0xcc in position 78: invalid continuation byte
使用 Visual Studio 2015 + Python3.6 + tensorflow 构建神经网络时报错:'utf-8' codec can't decode byte 0xcc in pos ...
- 在R中使用Keras和TensorFlow构建深度学习模型
一.以TensorFlow为后端的Keras框架安装 #首先在ubuntu16.04中运行以下代码 sudo apt-get install libcurl4-openssl-dev libssl-d ...
- Tensorflow递归神经网络学习练习
import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #载入数据集mnist = inpu ...
- 【零基础】使用Tensorflow实现神经网络
一.序言 前面已经逐步从单神经元慢慢“爬”到了神经网络并把常见的优化都逐个解析了,再往前走就是一些实际应用问题,所以在开始实际应用之前还得把“框架”翻出来,因为后面要做的工作需要我们将精力集中在业务而 ...
- kaggle赛题Digit Recognizer:利用TensorFlow搭建神经网络(附上K邻近算法模型预测)
一.前言 kaggle上有传统的手写数字识别mnist的赛题,通过分类算法,将图片数据进行识别.mnist数据集里面,包含了42000张手写数字0到9的图片,每张图片为28*28=784的像素,所以整 ...
- TensorFlow构建卷积神经网络/模型保存与加载/正则化
TensorFlow 官方文档:https://www.tensorflow.org/api_guides/python/math_ops # Arithmetic Operators import ...
- 深度学习之TensorFlow构建神经网络层
深度学习之TensorFlow构建神经网络层 基本法 深度神经网络是一个多层次的网络模型,包含了:输入层,隐藏层和输出层,其中隐藏层是最重要也是深度最多的,通过TensorFlow,python代码可 ...
- tensorflow中使用mnist数据集训练全连接神经网络-学习笔记
tensorflow中使用mnist数据集训练全连接神经网络 ——学习曹健老师“人工智能实践:tensorflow笔记”的学习笔记, 感谢曹老师 前期准备:mnist数据集下载,并存入data目录: ...
- Tensorflow BatchNormalization详解:2_使用tf.layers高级函数来构建神经网络
Batch Normalization: 使用tf.layers高级函数来构建神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴恩达deeplearningai课程 课程笔 ...
随机推荐
- 1070 结绳 (25 分)C语言
给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下图所示套接在一起.这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连.每次串连后,原来两段绳子的长度 ...
- 1043 输出PATest (20 分)C语言
给定一个长度不超过 10^4的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest- 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已经输 ...
- C语言联合体(union)的使用方法及其本质-union
转载自:https://blog.csdn.net/si_zhou_qun_84342712/article/details/53187106 1.联合体union的基本特性——和struct的同与不 ...
- Swift之代码混淆的调研实施小记
背景: 最近做APP备案,需要对项目做一系列对优化改进,其中就包括了代码混淆,顾名思义,混淆是为了代码安全,是为了增加逆向破解的难度与复杂度. 目前市面上,免费和付费都有,一些公司对APP加固已经做成 ...
- git stash使用
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/daguanjia11/article/ ...
- Linux磁盘管理之LVM逻辑卷快照
一.快照的工作原理 所谓快照就是将当时的系统数据记录下来,在未来若有数据变动,则会将变更前的数据放入快照区进行保存.我们可理解为快照就是给系统拍了一张照片,记录当时系统在拍快照的状态.只不过现实生活中 ...
- 解决elment 动态多选框组(el-checkbox-group)无法设置默认值问题
<el-checkbox-group v-model="form.showProperty"> <el-checkbox v-for="(item,id ...
- IO流之处理流用法总结
处理流之一:缓冲流1.为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区. 2.缓冲流要“套接”在相应 ...
- NOIP2004普及组第3题 FBI树
/* 1106: NOIP2004普及组第3题 FBI树 时间限制: 1 Sec 内存限制: 128 MB 提交: 10 解决: 9 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 我 ...
- Nginx的踩坑实录
1.昨天在为一个新项目配置地址转发,搞了很久都没生效,日志也没有问题,但就是没到转发的目标机器上. nginx.conf 配置如下: location /prism{ proxy_pass http: ...