首先tensorflow的设计思想就是先把需要用的变量已张量的形式保存,

实际上并没有实质的数值填充。

然后设计网络架构,也仅仅是架构而已,

只能说明数据关系和层与层之间的关系。

真正的数据输入是在主程序入口处,一般如下所示:

看到没,划线部分即为输入!

很多人喜欢用debug调试程序,以获得数据流向,但是对于这些网络确实失败的,因为你啥也看不到。

那么tensorflow就引入了tensorboard这个显示页面,可以让你清晰的观察数据之间的关系,以及数据特点,举个例子如下:

拟合x与y的关系,网络代码如下:

 import tensorflow as tf
import numpy as np #构造输入数据(我们用神经网络拟合x_data和y_data之间的关系)
x_data = np.linspace(-1,1,300)[:, np.newaxis] #-1到1等分300份形成的二维矩阵
noise = np.random.normal(0,0.05, x_data.shape) #噪音,形状同x_data在0-0.05符合正态分布的小数
y_data = np.square(x_data)-0.5+noise #x_data平方,减0.05,再加噪音值 #输入层(1个神经元)
xs = tf.placeholder(tf.float32, [None, 1]) #占位符,None表示n*1维矩阵,其中n不确定
ys = tf.placeholder(tf.float32, [None, 1]) #占位符,None表示n*1维矩阵,其中n不确定 #隐层(10个神经元)
W1 = tf.Variable(tf.random_normal([1,10])) #权重,1*10的矩阵,并用符合正态分布的随机数填充
b1 = tf.Variable(tf.zeros([1,10])+0.1) #偏置,1*10的矩阵,使用0.1填充
Wx_plus_b1 = tf.matmul(xs,W1) + b1 #矩阵xs和W1相乘,然后加上偏置
output1 = tf.nn.relu(Wx_plus_b1) #激活函数使用tf.nn.relu #输出层(1个神经元)
W2 = tf.Variable(tf.random_normal([10,1]))
b2 = tf.Variable(tf.zeros([1,1])+0.1)
Wx_plus_b2 = tf.matmul(output1,W2) + b2
output2 = Wx_plus_b2 #损失
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-output2),reduction_indices=[1])) #在第一维上,偏差平方后求和,再求平均值,来计算损失
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 使用梯度下降法,设置步长0.1,来最小化损失 #初始化
init = tf.global_variables_initializer() #初始化所有变量
sess = tf.Session()
sess.run(init) #变量初始化 #训练
for i in range(1000): #训练1000次
_,loss_value = sess.run([train_step,loss],feed_dict={xs:x_data,ys:y_data}) #进行梯度下降运算,并计算每一步的损失
if(i%50==0):
print(loss_value) # 每50步输出一次损失
 

加入tensorboard后的代码如下:

 import tensorflow as tf
import numpy as np
max_steps=1000
learning_rate=0.001 #学习率
dropout=0.9 #保留的数据
log_dir='./logs/xyhuashuguanxi' sess=tf.InteractiveSession() #构造输入数据(我们用神经网络拟合x_data和y_data之间的关系)
x_data = np.linspace(-1,1,300)[:, np.newaxis] #-1到1等分300份形成的二维矩阵
noise = np.random.normal(0,0.05, x_data.shape) #噪音,形状同x_data在0-0.05符合正态分布的小数
y_data = np.square(x_data)-0.5+noise #x_data平方,减0.05,再加噪音值 with tf.name_scope('input'):#with块中名字才是最重要的一个块
#输入层(1个神经元)
x = tf.placeholder(tf.float32, [None, 1]) #占位符,None表示n*1维矩阵,其中n不确定
y = tf.placeholder(tf.float32, [None, 1]) #占位符,None表示n*1维矩阵,其中n不确定 #定义神经网络的初始化方法
def weight_varible():
# initial=tf.truncated_normal(shape,stddev=0.1) #截断正态分布 这里可以用he_initinelize
initial =tf.Variable(tf.random_normal([1, 10])) # 权重,1*10的矩阵,并用符合正态分布的随机数填充
return tf.Variable(initial) #创建一个变量 def bias_variable(): #截距
# initial = tf.constant(0.1,shape=shape)
initial= tf.Variable(tf.zeros([1, 10]) + 0.1)
return tf.Variable(initial) #以下代码是关于画图的,
# 定义variable变量的数据汇总函数,我们计算出变量的mean、stddev、max、min
#对这些标量数据使用tf.summary.scalar进行记录和汇总,使用tf.summary.histogram直接记录变量var的直方图数据
def variable_summaries(var):
with tf.name_scope('summaries'):
mean=tf.reduce_mean(var)
tf.summary.scalar('mean',mean)
with tf.name_scope('stddev'):
stddev=tf.sqrt(tf.reduce_mean(tf.square(var-mean))) tf.summary.scalar('stddev',stddev)
tf.summary.scalar('max',tf.reduce_max(var))
tf.summary.scalar('min',tf.reduce_min(var))
tf.summary.histogram('histogram',var) # 设计一个MLP多层神经网络来训练数据,在每一层中都对模型数据进行汇总
def nn_layer(input_tensor, layer_name, act=tf.nn.relu):
with tf.name_scope(layer_name):
# 定义一个隐藏层input_dim上一层 output_dim本层输出
with tf.name_scope('weights'):
weights = weight_varible() # shape传进来是上一层输入,
# 本层输出如果是MLP,就是全连接可以知道参数个数
variable_summaries(weights) # 把权重的各个中标(方差+平均值)进行总结
with tf.name_scope('biases'):
biases = bias_variable()
variable_summaries(biases)
with tf.name_scope('Wx_plus_b'):
preactivate = tf.matmul(input_tensor, weights) + biases # 带到激活函数之前的公式
tf.summary.histogram('pre_activations', preactivate)
activations = act(preactivate, name='activations')
# 运用激活函数 函数里面传函数 高阶函数
return activations #隐层(10个神经元)
hidden1=nn_layer(x,'layer1') #建立第一层 隐藏层
# with tf.name_scope('dropout'):
# keep_prob=tf.placeholder(tf.float32)
# tf.summary.scalar('dropout_keep_probability',keep_prob)
# dropped=tf.nn.dropout(hidden1,keep_prob) #应用drop_out函数,保留下来的数据 # W1 = tf.Variable(tf.random_normal([1,10])) #权重,1*10的矩阵,并用符合正态分布的随机数填充
# b1 = tf.Variable(tf.zeros([1,10])+0.1) #偏置,1*10的矩阵,使用0.1填充
# Wx_plus_b1 = tf.matmul(x,W1) + b1 #矩阵xs和W1相乘,然后加上偏置
# output1 = tf.nn.relu(Wx_plus_b1) #激活函数使用tf.nn.relu #然后使用nn_layer定义神经网络输出层,其输入维度为上一层隐含节点数500,输出维度为类别数10,
# 同时激活函数为全等映射identity,暂时不适用softmax
#然后使用nn_layer定义神经网络输出层,其输入维度为上一层隐含节点数500,输出维度为类别数10,
# 同时激活函数为全等映射identity,暂时不适用softmax
# output2 =nn_layer(dropped,'layer2',act=tf.identity)#建立第二层 输出层
#输出层(1个神经元)
W2 = tf.Variable(tf.random_normal([10,1]))
b2 = tf.Variable(tf.zeros([1,1])+0.1)
Wx_plus_b2 = tf.matmul(hidden1,W2) + b2
output2 = Wx_plus_b2 #损失
#使用tf.nn.softmax_cross_entropy_with_logits()对前面的输出层的结果进行softmax处理并计算
# 交叉熵损失cross_entopy,计算平均损失,使用tf.summary.scalar进行统计汇总
with tf.name_scope('cross_entropy'):
# diff=tf.nn.softmax_cross_entropy_with_logits(logits=y,labels=y)
loss = tf.reduce_mean(tf.reduce_sum(tf.square(y - output2), reduction_indices=[1])) # 在第一维上,偏差平方后求和,再求平均值,来计算损失
#输出层给出结果logits=y,每一行的y是有10个数预测10个值,然后利用这10个值做归一化,
# 然后具备一个概率的含义,第二不计算交叉熵
with tf.name_scope('total'):
cross_entropy=tf.reduce_mean(loss)#平均损失
tf.summary.scalar('cross_entorpy',cross_entropy) # loss = tf.reduce_mean(tf.reduce_sum(tf.square(y-output2),reduction_indices=[1])) #在第一维上,偏差平方后求和,再求平均值,来计算损失
#下面使用Adam优化器对损失进行优化,同时统计预测正确的样本数并计算正确率accuracy,汇总
with tf.name_scope('train'):
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss) # 使用梯度下降法,设置步长0.1,来最小化损失 #Adamoptimizer比SGD更好一些,下降速度更快,更容易计算局部最优解,当数据量大的时候不如SGD
#learning_rate虽然是固定的,后面会自适应,根据上一次的结果,所以大数据量的话,不如定义好策略,这样省时间
with tf.name_scope('accuracy'):
with tf.name_scope('correct_predicition'):
correct_predition=tf.equal(tf.argmax(y,1),tf.argmax(output2,1))
#预测值最大的索引和真实值的索引
with tf.name_scope('accuracy'):
accuracy=tf.reduce_mean(tf.cast(correct_predition,tf.float32))
#true 1 false 0 reduce_mean 是一个比例得到的结果
tf.summary.scalar('accuracy',accuracy) #因为我们之前定义了太多的tf.summary汇总操作,注意执行这些操作太
# 麻烦,使用tf.summary.merge_all()直接获取所有汇总操作,以便后面执行
merged=tf.summary.merge_all()
#定义两个tf.summary.FileWirter文件记录器在不同的子目录,分别用来存储训练和测试的日志数据
train_writer=tf.summary.FileWriter(log_dir+'/train',sess.graph)
test_writer=tf.summary.FileWriter(log_dir+'/test')
#同时,将Session计算图sess.graph加入训练过程,这样在TensorBoard的GRAPHS窗口中就能展示
# 整个计算图的可视化效果,最后初始化全部变量
tf.global_variables_initializer().run() #初始化
init = tf.global_variables_initializer() #初始化所有变量
sess = tf.Session()
sess.run(init) #变量初始化 # #定义feed_dict函数,如果是训练,需要设置dropout,如果是测试,keep_prob设置为1
# def feed_dict(train):
# if train:#如果是训练数据的话需要droupout,测试的时候不要Droupout
# xs,ys= mnist.train.next_batch(100) #每一次拿一批次数据去训练
# k=dropout
# else:
# xs,ys=mnist.test.images,mnist.test.labels #真正测试的话全部测试,不是拿一批次的数据了
# k=1.0
# return {x:xs,y_:ys,keep_prob:k} #执行训练、测试、日志记录操作。创建模型的保存器
saver=tf.train.Saver()
#训练
for i in range(max_steps): #训练1000次
# _,loss_value = sess.run([train_step,loss],feed_dict={x:x_data,y:y_data}) #进行梯度下降运算,并计算每一步的损失
if(i%50==0):
summary, loss_value = sess.run([merged, accuracy], feed_dict={x:x_data,y:y_data})
test_writer.add_summary(summary, i) # 然后写出
print('Accuracy at step %s:%s' % (i, loss_value))
print(loss_value) # 每50步输出一次损失 train_writer.close()
test_writer.close()

运行后,打开cmd,进入到logs文件的根目录下(一定要!!!),输入tensorboard --logdir=logs的根目录,等下会输出网址,在你的浏览器打开就可以了:

或者在浏览器中直接输入

 http://localhost:6006 
还是不行的话,可能和你的电脑配置有关。

使用tensorflow设计的网络模型看不到数据流向怎么办的更多相关文章

  1. 设计人员应该看的15个很酷的 iOS 8 设计

    苹果新一代智能手机 iPhone 6 发布已经有一段时间了,一些创意设计师已经开始在设计中采用 iOS 8 设计理念.当然,其中有些是对于未来的展望和大胆的设计.我在这里收集了15个很酷的 iOS 8 ...

  2. 一文看懂大数据的技术生态圈,Hadoop,hive,spark都有了

    一文看懂大数据的技术生态圈,Hadoop,hive,spark都有了 转载: 大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它 ...

  3. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 主管可以看下属的数据

    主管可以看下属的数据,这个是经常用到的一个权限,不管是大公司,还是小公司都需要的功能. 通过以下2个方法,可以任意达到想要的效果了,设置简单灵活,还能递归运算下属,有时候简单好用就是硬道理. #reg ...

  4. TensorFlow TFRecord封装不定长的序列数据(文本)

    TensorFlow TFRecord封装不定长的序列数据(文本) 在实验室环境中,通常数据都是一次性导入内存的,然后使用手工写的数据mini-batch函数来切分数据,但是这样的做法在海量数据下显得 ...

  5. 通过TensorFlow训练神经网络模型

    神经网络模型的训练过程其实质上就是神经网络参数的设置过程 在神经网络优化算法中最常用的方法是反向传播算法,下图是反向传播算法流程图: 从上图可知,反向传播算法实现了一个迭代的过程,在每次迭代的开始,先 ...

  6. 利用Tensorflow实现神经网络模型

    首先看一下神经网络模型,一个比较简单的两层神经. 代码如下: # 定义参数 n_hidden_1 = 256 #第一层神经元 n_hidden_2 = 128 #第二层神经元 n_input = 78 ...

  7. UI设计初学者必看,这款设计神器教你快速入门

    网络时代,网页和手机App已经深入到人们生活的方方面面.这也使得App界面设计越来越受青年求职者们的青睐,并纷纷投入这个行业.但是,作为UI设计初学者,究竟如何才能快速的入门?当今市场上,是否有那么一 ...

  8. 打开黑盒:从 MySQL架构设计出发,看它是如何执行一条 SQL语句的

    1.把MySQL当个黑盒子一样执行SQL语句 我们的系统采用数据库连接池的方式去并发访问数据库,然后数据库自己其实也会维护一个连接池,其中管理了各种系统跟这台数据库服务器建立的所有连接 当我们的系统只 ...

  9. 吴裕雄 PYTHON 神经网络——TENSORFLOW 双隐藏层自编码器设计处理MNIST手写数字数据集并使用TENSORBORD描绘神经网络数据2

    import os import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data os.envi ...

随机推荐

  1. linux下的tomcat开机自启动(亲测),更改静态ip

    开机自启动Tomcat: 1.修改脚本文件rc.local:vim /etc/rc.d/rc.local 这个脚本是使用者自定的开机启动程序,可以在里面添加想在系统启动之后执行的脚本或者脚本执行命令 ...

  2. 十分钟玩转 jQuery、实例大全(参考自博主索宁)

    十分钟玩转 jQuery.实例大全(参考自博主索宁) 一.简介 书写规则 支持链式操作: 在变量前加"$"符号(var $variable = jQuery 对象): 注:此规定并 ...

  3. linux修改系统时间为北京时间(CentOS)

    删除本地时间 rm -rf /etc/localtime 设置时区为上海 ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 利用date查看 ...

  4. [转]vim 快捷键整理

    Linux中vim编辑器的功能非常强大,许多常用快捷键用起来非常方便,这里将我学vim入门时学的一些常用的快捷键分享给大家一下,希望可以帮助你们.  原文地址:http://blog.csdn.net ...

  5. linux 命令——7 mv(转)

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...

  6. 300行ABAP代码实现一个最简单的区块链原型

    不知从什么时候起,区块链在网上一下子就火了. 这里Jerry就不班门弄斧了,网上有太多的区块链介绍文章.我的这篇文章没有任何高大上的术语,就是300行ABAP代码,实现一个最简单的区块链原型. 我个人 ...

  7. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  8. 用TreeView控件遍历磁盘目录

    实现效果: 知识运用: ListView控件中Items集合的Add方法  TteeView控件中Nodes集合的Add方法 实现代码: private void Form1_Load(object ...

  9. CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第八节

    原文链接 第八节:利用CUDA函数库 Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Laboratory)的高级科研人员.他在多个国家级的实验室进 ...

  10. 解决: Intelij IDEA 创建WEB项目时没有Servlet的jar包

    今天创建SpringMVC项目时 用到HttpServletRequest时, 发现项目中根本没有Servlet这个包, 在网上搜了一下,这个问题是因为web项目没有添加服务器导致的. 配置tomec ...