目录
2. tf.argmax(input, dimension, name=None)
5.tf.equal + tf.argmax + tf.cast + fr.reduce_mean = Accuracy
6. tf.random_normal(shape,mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)
对于Tensorflow,有一些函数在 在实际应用场景中经常会用到,计算Accuracy是每个研究都会用到的衡量工具,那么,如何在Tensorflow中计算常见问题的Accuracy呢?实际上几行代码就可以搞定。但是有几个函数需要先了解一下。
1.tf.equal(x,y,name=None)
概述:
Returns the truth value of (x == y) element-wise.# 按元素返回(x == y)的真值。
注意这里的按照元素返回,意思就是逐个元素对比并返回True or False
变量介绍:
x: 一个张量(Tensor),可以选择如下类型:`bfloat16`, `half`, `float32`, `float64`, `uint8`, `int8`, `int16`, `int32`, `int64`, `complex64`, `quint8`, `qint8`, `qint32`, `string`, `bool`, `complex128`.
y: 一个张量(Tensor),必须和X的类型一致。
name: 这个操作的名字,可忽略。
返回值:一个布尔类型的张量。(A 'Tensor' of type 'bool')
举例
import tensorflow as tf
a = [[5,1,0],[4,2,7]]
b = [[5,6,0],[8,2,1]]
with tf.Session() as sess:
print(sess.run(tf.equal(a,b)))
输出
[[ True False True]
[False True False]]
2. tf.argmax(input, dimension, name=None)
概述:返回input中最大元素对应的下标
变量介绍:
input:一个张量(Tensor)就是要访问的元素
dimension:0或者1;0代表按行对比张量中的元素;1代表按列对比张量中的元素
name:这个操作的名字,可忽略
返回值:A Tensor of type int64。(注意哦由于这里返回的是元素的下标,也就是位置,因此是int64类型的,如果后面要用这个数据,则需要进行转换,转换函数用tf.cast())
举例:
import tensorflow as tf
a = tf.constant([1.,2.,3.,0.,9.,])
b = tf.constant([[1,2,3],[3,2,1],[4,5,6],[6,5,4]])
with tf.Session() as sess:
print(sess.run(tf.argmax(a, 0)))
with tf.Session() as sess:
print(sess.run(tf.argmax(b, 0)))
with tf.Session() as sess:
print(sess.run(tf.argmax(b, 1)))
输出:
4
[3 2 2]
[2 0 2 0]
3. tf.cast(x,dtype,name=None)
概述:将输入x转化成类型dtype
变量介绍:
x:一个张量(Tensor)
dtype:数据类型
name:操作名称
候选的数据类型(针对x和dtype):
Args:
x: A `Tensor` or `SparseTensor` or `IndexedSlices` of numeric type. It could
be `uint8`, `uint16`, `uint32`, `uint64`, `int8`, `int16`, `int32`,
`int64`, `float16`, `float32`, `float64`, `complex64`, `complex128`,
`bfloat16`.
dtype: The destination type. The list of supported dtypes is the same as
`x`.
name: A name for the operation (optional).
举例:
import tensorflow as tf
t1 = tf.Variable([1, 2, 3, 4, 5])
t2 = tf.cast(t1, dtype=tf.float32)
print ('t1: {}'.format(t1))
print ('t2: {}'.format(t2))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(t2)
print (t2.eval())
输出:
t1: <tf.Variable 'Variable:0' shape=(5,) dtype=int32_ref>
t2: Tensor("Cast:0", shape=(5,), dtype=float32)
[1. 2. 3. 4. 5.]
4. tf.reduce_mean(input_tensor,axis=None,keepdims=None,name=None,reduction_indices=None,keep_dims=None)
概述:tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。
变量介绍:
input_tensor: 输入的待降维的tensor;
axis: 指定的轴,如果不指定,则计算所有元素的均值;
keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
name: 操作的名称;
reduction_indices:在以前版本中用来指定轴,已弃用;
举例:
import tensorflow as tf
x = [[1, 2, 3],
[1, 2, 3]]
xx = tf.cast(x, tf.float32)
mean_all_F = tf.reduce_mean(xx, keep_dims=False)
mean_0_F = tf.reduce_mean(xx, axis=0, keep_dims=False)
mean_1_F = tf.reduce_mean(xx, axis=1, keep_dims=False)
mean_all_T = tf.reduce_mean(xx, keep_dims=True)
mean_0_T = tf.reduce_mean(xx, axis=0, keep_dims=True)
mean_1_T = tf.reduce_mean(xx, axis=1, keep_dims=True)
with tf.Session() as sess:
m_a_F, m_0_F, m_1_F = sess.run([mean_all_F, mean_0_F, mean_1_F])
m_a_T, m_0_T, m_1_T = sess.run([mean_all_T, mean_0_T, mean_1_T])
print(' when keep_dims is False:')
print(m_a_F)
print(m_0_F)
print(m_1_F)
print('when keep_dims is True:')
print(m_a_T)
print(m_0_T)
print(m_1_T)
输出:
when keep_dims is False:
2.0 # m_a_F
[1. 2. 3.] # m_0_F
[2. 2.] # m_1_F
when keep_dims is True:
[[2.]] # m_a_T
[[1. 2. 3.]] # m_0_T
[[2.] [2.]] # m_1_T
5.tf.equal + tf.argmax + tf.cast + fr.reduce_mean = Accuracy
没错,有了上述几个函数,我们就可以很容易地对比实际值和预测值之间的关系,并计算模型的准确度。
例如,定义计算准确度的函数:
import tensorflow as tf
# 以分类问题为例,神经网络的输出结果就是y_pre,
# 分类问题往往用输出神经元的编号作为类别,因此 tf.argmax() 函数会经常被用到
y_pre = [[4],[5],[8]] # 预测值
y_act = [[4],[6],[8]] # 实际值
correct_prediction = tf.equal(y1,y2)
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
with tf.Session() as sess:
print(sess.run(correct_prediction))
print(sess.run(tf.cast(correct_prediction,tf.float32)))
print(sess.run(accuracy))
输出:
[[ True]
[False]
[ True]]
[[1.]
[0.]
[1.]]
0.6666667 # 分类准确率是66.67%
为了进一步理解如何计算accuracy,给出一个利用LSTM进行手写识别的计算accuracy的函数实例。
def compute_accuracy(v_xs,v_ys):
# prediction 函数计算网络的输出值
global prediction
y_pre = sess.run(prediction,feed_dict={xs:v_xs})
# 计算预测值和输出值是否一致,一致为True不一致为False
correct_prediction = tf.equal(tf.argmax(y_pre,1),tf.argmax(v_ys,1))
# 将True 和 False 转化成 1. 和0.的形式并计算平均值,换句话说就是计算1的百分比
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
# run 一下这个accuracy获得结果
result = sess.run(accuracy,feed_dict={xs:v_xs,ys:v_ys})
return result
对于prediction函数,往往会利用softmax等函数进行计算,也是可以直接调用tf中的方法来实现,这一点会在后面的实例中进一步介绍。
6. tf.random_normal(shape,mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)
概述:tf.random_normal()从服从指定的正态分布的序列中随机取出指定个数的值。
(正态分布:若随机变量X服从一个数学期望为μ、方差为σ^2的正态分布,记为N(μ,σ^2)。其概率密度函数为正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。(来源:百度百科))
变量介绍:
shape: 输出张量的形状,必选
mean: 正态分布的均值,默认为0
stddev: 正态分布的标准差,默认为1.0
dtype: 输出的类型,默认为tf.float32
seed: 随机数种子,是一个整数,当设置之后,每次生成的随机数都一样
name: 操作的名称
举例:
import tensorflow as tf
# make a [2,3] shape tensor with
# if you set a seed=1 which means that you will get the same results every time
x1 = tf.Variable(tf.random_normal([2,3],seed=1,dtype=tf.float32))
# init = tf.initialize_all_variables() # for old verson Tensorflow
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(x1)
print(sess.run(x1))
输出:
<tf.Variable 'Variable:0' shape=(2, 3) dtype=float32_ref>
[[-0.8113182 1.4845988 0.06532937]
[-2.4427042 0.0992484 0.5912243 ]]