tensorflow的知识点一

1、tf.truncated_normal与tf.random_normal

tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
 
 
  • 1

截断的正态分布中输出随机值。 
生成的值服从具有指定平均值和标准偏差的正态分布,如果生成的值大于平均值2个标准偏差的值则丢弃重新选择。

在正态分布的曲线中,横轴区间(μ-σ,μ+σ)内的面积为68.268949%。 
横轴区间(μ-2σ,μ+2σ)内的面积为95.449974%。 
横轴区间(μ-3σ,μ+3σ)内的面积为99.730020%。 
X落在(μ-3σ,μ+3σ)以外的概率小于千分之三,在实际问题中常认为相应的事件是不会发生的,基本上可以把区间(μ-3σ,μ+3σ)看作是随机变量X实际可能的取值区间,这称之为正态分布的“3σ”原则。 
在tf.truncated_normal中如果x的取值在区间(μ-2σ,μ+2σ)之外则重新进行选择。这样保证了生成的值都在均值附近。

参数:

  • shape: 一维的张量,也是输出的张量。
  • mean: 正态分布的均值。
  • stddev: 正态分布的标准差。
  • dtype: 输出的类型。
  • seed: 一个整数,当设置之后,每次生成的随机数都一样。
  • name: 操作的名字。
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
 
 
  • 1

从正态分布中输出随机值。 
参数:

  • shape: 一维的张量,也是输出的张量。
  • mean: 正态分布的均值。
  • stddev: 正态分布的标准差。
  • dtype: 输出的类型。
  • seed: 一个整数,当设置之后,每次生成的随机数都一样。
  • name: 操作的名字。

代码

a = tf.Variable(tf.random_normal([2,2],seed=1))
b = tf.Variable(tf.truncated_normal([2,2],seed=2))
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(a))
    print(sess.run(b))

输出:
[[-0.81131822  1.48459876]
 [ 0.06532937 -2.44270396]]
[[-0.85811085 -0.19662298]
 [ 0.13895047 -1.22127688]]
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

指定seed之后,a的值不变,b的值也不变,值得是重复生成随机数时其随机数没有改变。

2、placeholder函数

tensorflow中又一保存数据的利器,placeholder(type,strucuct…)它的第一个参数是你要保存的数据的数据类型,大多数是tensorflow中的float32数据类型,后面的参数就是要保存数据的结构,比如要保存一个1×2的矩阵,则struct=[1 2]。它在使用的时候和前面的variable不同的是在session运行阶段,需要给placeholder提供数据,利用feed_dict的字典结构给placeholdr变量“喂数据”,具体使用如下:

# -*- coding: utf-8 -*-
"""
Created on Mon Apr  3 11:20:22 2017

@author: zhangshaoxing
"""
import tensorflow as tf
a=tf.placeholder(tf.float32)
b=tf.placeholder(tf.float32)
c=tf.add(a,b)

with tf.Session() as sess:
    print(sess.run(c,feed_dict={a:10,b:30}))  #把10赋给a,30赋给b

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

运行结果:

40.0

3、tf.nn.softmax_cross_entropy_with_logits的用法

在计算loss的时候,最常见的一句话就是tf.nn.softmax_cross_entropy_with_logits,那么它到底是怎么做的呢?

首先明确一点,loss是代价值,也就是我们要最小化的值

tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)

除去name参数用以指定该操作的name,与方法有关的一共两个参数

第一个参数logits:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batchsize,num_classes],单样本的话,大小就是num_classes

第二个参数labels:实际的标签,大小同上


具体的执行流程大概分为两步:

第一步是先对网络最后一层的输出做一个softmax,这一步通常是求取输出属于某一类的概率,对于单样本而言,输出就是一个num_classes大小的向量([Y1,Y2,Y3...]其中Y1,Y2,Y3...分别代表了是属于该类的概率)

softmax的公式是:

至于为什么是用的这个公式?这里不介绍了,涉及到比较多的理论证明


第二步是softmax的输出向量[Y1,Y2,Y3...]和样本的实际标签做一个交叉熵,公式如下:


其中指代实际的标签中第i个的值(用mnist数据举例,如果是3,那么标签是[0,0,0,1,0,0,0,0,0,0],除了第4个值为1,其他全为0)

就是softmax的输出向量[Y1,Y2,Y3...]中,第i个元素的值

显而易见,预测越准确,结果的值越小(别忘了前面还有负号),最后求一个平均,得到我们想要的loss

注意!!!这个函数的返回值并不是一个数,而是一个向量,如果要求交叉熵,我们要再做一步tf.reduce_sum操作,就是对向量里面所有元素求和,最后才得到,如果求loss,则要做一步tf.reduce_mean操作,对向量求均值!


理论讲完了,上代码

[python]  view plain  copy
  1. import tensorflow as tf  
  2.   
  3. #our NN's output  
  4. logits=tf.constant([[1.0,2.0,3.0],[1.0,2.0,3.0],[1.0,2.0,3.0]])  
  5. #step1:do softmax  
  6. y=tf.nn.softmax(logits)  
  7. #true label  
  8. y_=tf.constant([[0.0,0.0,1.0],[0.0,0.0,1.0],[0.0,0.0,1.0]])  
  9. #step2:do cross_entropy  
  10. cross_entropy = -tf.reduce_sum(y_*tf.log(y))  
  11. #do cross_entropy just one step  
  12. cross_entropy2=tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(logits, y_))#dont forget tf.reduce_sum()!!  
  13.   
  14. with tf.Session() as sess:  
  15.     softmax=sess.run(y)  
  16.     c_e = sess.run(cross_entropy)  
  17.     c_e2 = sess.run(cross_entropy2)  
  18.     print("step1:softmax result=")  
  19.     print(softmax)  
  20.     print("step2:cross_entropy result=")  
  21.     print(c_e)  
  22.     print("Function(softmax_cross_entropy_with_logits) result=")  
  23.     print(c_e2)  

输出结果是:

[python]  view plain  copy
  1. step1:softmax result=  
  2. [[ 0.09003057  0.24472848  0.66524094]  
  3.  [ 0.09003057  0.24472848  0.66524094]  
  4.  [ 0.09003057  0.24472848  0.66524094]]  
  5. step2:cross_entropy result=  
  6. 1.22282  
  7. Function(softmax_cross_entropy_with_logits) result=  
  8. 1.2228  
最后大家可以试试e^1/(e^1+e^2+e^3)是不是0.09003057,发现确实一样!!这也证明了 我们的输出是符合公式逻辑的


4、tf.argmax函数

   

tf.argmax(input, axis=None, name=None, dimension=None)

此函数是对矩阵按行或列计算最大值

参数
  • input:输入Tensor
  • axis:0表示按列,1表示按行
  • name:名称
  • dimension:和axis功能一样,默认axis取值优先。新加的字段
返回:Tensor  一般是行或列的最大值下标向量

例:
[java] view plain  copy
 print ?
  1. import tensorflow as tf  
  2.   
  3.   
  4. a=tf.get_variable(name='a',  
  5.                   shape=[3,4],  
  6.                   dtype=tf.float32,  
  7.                   initializer=tf.random_uniform_initializer(minval=-1,maxval=1))  
  8. b=tf.argmax(input=a,axis=0)  
  9. c=tf.argmax(input=a,dimension=1)   #此处用dimesion或用axis是一样的  
  10. sess = tf.InteractiveSession()  
  11. sess.run(tf.initialize_all_variables())  
  12. print(sess.run(a))  
  13. #[[ 0.04261756 -0.34297419 -0.87816691 -0.15430689]  
  14. # [ 0.18663144  0.86972666 -0.06103253  0.38307118]  
  15. # [ 0.84588599 -0.45432305 -0.39736366  0.38526249]]  
  16. print(sess.run(b))  
  17. #[2 1 1 2]  
  18. print(sess.run(c))  
  19. #[0 1 0]  

4、range()函数的用法

详细记录python的range()函数用法

使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节。这里记录一下range(),复习下list的slide,最后分析一个好玩儿的冒泡程序。

这里记录一下:

>>> range ( 1 , 5 ) #代表从1到5(不包含5)
[ 1 , 2 , 3 , 4 ]
>>> range ( 1 , 5 , 2 ) #代表从1到5,间隔2(不包含5)
[ 1 , 3 ]
>>> range ( 5 ) #代表从0到5(不包含5)
[ 0 , 1 , 2 , 3 , 4 ]
4、tf.constant创建常量tensor

tf.constant(value,dtype=None,shape=None,name=’Const’) 
创建一个常量tensor,按照给出value来赋值,可以用shape来指定其形状。value可以是一个数,也可以是一个list。 
如果是一个数,那么这个常亮中所有值的按该数来赋值。 
如果是list,那么len(value)一定要小于等于shape展开后的长度。赋值时,先将value中的值逐个存入。不够的部分,则全部存入value的最后一个值。

a = tf.constant(2,shape=[2])
b = tf.constant(2,shape=[2,2]) c = tf.constant([1,2,3],shape=[6]) d = tf.constant([1,2,3],shape=[3,2]) sess = tf.InteractiveSession() print(sess.run(a)) #[2 2] print(sess.run(b)) #[[2 2] # [2 2]] print(sess.run(c)) #[1 2 3 3 3 3] print(sess.run(d)) #[[1 2] # [3 3] # [3 3]]







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值