阅读mnist_softmax.py的一些基础练习。

矩阵乘法:tf.matmul(A, B)或者 A@B
matmul属于tensorflow\python\ops\math_ops.py模块。
它是标准形式的矩阵乘法。
代码:
import tensorflow as tf
import numpy as np
A = tf.Variable([[1., 2.],
                 [3., 4.]])
B = tf.Variable([[5., 6.],
                 [7., 8.]])
C = tf.matmul(A, B)
sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)


print(sess.run(C)) 
# 1*5+2*7=19  1*6+2*8=22
# 3*5+4*7=43  3*6+4*8=50
输出:
[[ 19.  22.]
 [ 43.  50.]]
后面的代码,只写讨论的部分,其它部分不再重复。


print(C)
输出:Tensor("MatMul:0", shape=(2, 2), dtype=float32)
节点类型为 MatMul。


运行matmul文档中的代码。
二维:
a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3])
b = tf.constant([7, 8, 9, 10, 11, 12], shape=[3, 2])
c = tf.matmul(a, b)
输出:[[ 58  64]
[139 154]]
三维(非数学专业的,比如我,基本上就看看热闹了):
a = tf.constant(np.arange(1, 13, dtype=np.int32),shape=[2, 2, 3])
b = tf.constant(np.arange(13, 25, dtype=np.int32),shape=[2, 3, 2]) 
c = tf.matmul(a, b)
print(c)
print(sess.run(c)) 
输出:
Tensor("MatMul_1:0", shape=(2, 2, 2), dtype=int32)
[[[ 94 100]
  [229 244]]


 [[508 532]
  [697 730]]]
符号重载@,python3.5以后支持;
C = A@B #等价于C = tf.matmul(A, B)
输出:
[[ 19.  22.]
 [ 43.  50.]]
@符号在IDE环境中报静态编译问题,但不会影响运行。


矩阵加法:tf.add(A, B)或者 A+B
就是把对应位置上的元素相加:
方法位于tensorflow\python\ops\gen_math_ops.py,即一般数学运算。
a = tf.Variable([1., 2.])
b = tf.Variable([5., 6.])
c = tf.add(a, b)
输出:[ 6.  8.]
c = a + b #等价于c = tf.add(a, b)


reduce_mean: 
1.把矩阵中所有元素相加,求平均,得到一个标量。
x = tf.Variable([[1., 2.,3.],
                 [4., 5.,6.]])
y = tf.reduce_mean(x)
输出:2.5  #(1+2+3+4+5+6)/6=3.5
x = tf.Variable([True, True,False,True,True])
y = tf.reduce_mean(tf.cast(x, tf.float32))
输出:0.8


2.把矩阵上下压扁,相当于在表的底部求一行平均值。
y = tf.reduce_mean(x,0)
输出:[ 2.5  3.5  4.5]  #[(1+4)/2, (2+5)/2, (3+6)/2]
3.把矩阵左右压扁,相当于在表的右侧求一列平均值。
y = tf.reduce_mean(x,1)
输出:[ 2.  5.]


softmax_cross_entropy_with_logits:使用对数的交叉熵的softmax方法。
logits就是神经网络模型中的 W X矩阵。(更准确地讲是wx+b)
参见:http://www.jianshu.com/p/75f7e60dae95
tensorflow提供了多种交叉熵的算法。包括:
|------sigmoid_cross_entropy_with_logits 最早的交叉熵实现,类比多选框
|------softmax_cross_entropy_with_logits 类比单选框
|------sparse_softmax_cross_entropy_with_logits 第二类的简易版本
|------weighted_sigmoid_cross_entropy_with_logits 第一类的增强版本,多个参数
所以本质上只有两类:单选softmax,多选sigmoid.
用法:tf.nn.softmax_cross_entropy_with_logits(观察值, 预测值)。
看代码,其实现会一直追到framework也没有,试着构造一个例子来理解。
http://www.cnblogs.com/welhzh/p/6595032.html
import tensorflow as tf  
  
#our NN's output  
logits=tf.constant([[1.01,2.0,3.0],
                    [1.02,2.0,3.0],
                    [1.02,2.0,3.0],
                    [0.9,2.0,3.1]])  
#step1:do softmax , softmax(x)=exp(xi)/西格玛 (exp(xi))
y=tf.nn.softmax(logits)  
#true label  
y_=tf.constant([[0.0,0.0,1.0],
                [0.0,0.0,1.0],
                [0.0,0.0,1.0],
                [0.0,0.0,1.0]])  
#step2:do cross_entropy  
cross_entropy = -tf.reduce_sum(y_*tf.log(y))  
#do cross_entropy just one step  labels=y_, logits=y
cross_entropy2=tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_))#dont forget tf.reduce_sum()!!  
  
with tf.Session() as sess:  
    softmax=sess.run(y)  
    c_e = sess.run(cross_entropy)  
    c_e2 = sess.run(cross_entropy2)  
    print("step1:softmax result=")  
    print(softmax)  
    print("step2:cross_entropy result=")  
    print(c_e)  
    print("Function(softmax_cross_entropy_with_logits) result=")  
    print(c_e2)  
输出:
step1:softmax result=
[[ 0.09085319  0.24450725  0.66463959]
 [ 0.09168257  0.24428418  0.66403323]
 [ 0.09168257  0.24428418  0.66403323]
 [ 0.07675081  0.23057216  0.69267702]]
step2:cross_entropy result=
1.59455
Function(softmax_cross_entropy_with_logits) result=
1.59455
可以证明,这个softmax_cross_entropy_with_logits也就是按标准softmax的公式和交叉熵的公式做了个计算,没有别的。


argmax(input, axis=None, name=None, dimension=None): 
input:输入Tensoraxis:0表示按列,1表示按行name:
名称dimension:和axis功能一样,默认axis取值优先。新加的字段 
返回:Tensor 一般是行或列的最大值下标向量
1.找出一个矩阵中每行最大的那个数的坐标。
x = tf.Variable([[1., 11.,3.],
                 [9., 8.,6.]])
y = tf.argmax(x, 1)
输出:[1 0] #第一行,11最大,坐标是1;第二行,9最大,坐标是0
2.找出一个矩囝中每列最大的那个数的坐标。
x = tf.Variable([[1., 11.,3.],
                 [9., 8.,6.]])
y = tf.argmax(x, 0)
输出:[1 0 1] #分别对应9,11,6


通过以上练习,再来阅读minst_softmax.py,是不是觉得清爽很多?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值