矩阵乘法: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,是不是觉得清爽很多?
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,是不是觉得清爽很多?