(一)MNIST入门的一些小结

    老师说后面的主要工具是TensorFlow,尽管之前看完了吴恩达老师的《机器学习》《深度学习》,由于当时忙着做毕业设计,以及网易云课堂上并没有课后题目,因此动手的工作一直闲置了下来,正好趁着暑假来学校的机会,好好学一下Python和TensorFlow。
    主要参考教程为TensorFlow中文社区提供的完整教程,先在此感谢一番,然后进入正题记录一下学习时不太明白的地方。因为import tensorflow as tf,所以 后面直接使用tf代替TensorFlow。

1.cross_entropy = -tf.reduce_sum(y_*tf.log(y))中的tf.reduce_sum()函数
    这个问题主要参考主要参考知乎Tensorflow 的reduce_sum()函数到底是什么意思,谁能解释下?,首先看一下tf.reduce_sum()的官方api:

reduce_sum(
    input_tensor,
    axis=None,
    keep_dims=False,
    name=None,
    reduction_indices=None
)

        input_tensor:需要处理的数据,必须是数字类型。
        axis:参与运算的维度。
        keep_dims:是否保留原始数据的维度。 
        reduction_indices:为了跟旧版本的兼容,现在已经不使用了。 

官方的例子:

# 'x' is [[1, 1, 1]
#         [1, 1, 1]]
tf.reduce_sum(x) ==> 6
tf.reduce_sum(x, 0) ==> [2, 2, 2]
tf.reduce_sum(x, 1) ==> [3, 3]
tf.reduce_sum(x, 1, keep_dims=True) ==> [[3], [3]]
tf.reduce_sum(x, [0, 1]) ==> 6

        可以看到,最关键的就是对于输入数据中维度的处理,这里的维度指的是数组维度。看了知乎中很多例子,觉得id为杨镒铭的答主给的答案我最容易接受,其举了一个三维数组(张量):

[[(1,2,3,4) (5,6,7,8) (9,10,11,12)]
  [(13,14,15,16) (17,18,19,20) (21,22,23,24)]
]

对其使用tf.reduce_sum(),并使axis分别为0,1,2,其结果分别为

#axis=0
[[14, 16, 18, 20],
 [22, 24, 26, 28],
 [30, 32, 34, 36]
]
#axis=1
[[15, 18, 21, 24],
 [51, 54, 57, 60]
]
#axis=2
[[10, 26, 42],
 [58, 74, 90]]

可以看到,结果分别为3×4、2×4、2×3的数组,而原数组的规模为2×3×4,正好对应着在2、1、0维上进行降维处理

2.class tf.Session

        主要参考官方文档class tf.Session,根据官方文档的解释,tf.Session类,实际上是用来运行tensorflow操作的一个容器(在MNIST进阶中增加了这样一句说明:“Tensorflow依赖于一个高效的C++后端来进行计算。与后端的这个连接叫做session。一般而言,使用TensorFlow程序的流程是先创建一个图,然后在session中启动它。”),容器具有一定的资源(包括变量、队列和阅读器,阅读器看了下文档还不太明白,大致意思可能就是用来打印每一步运行的结果),操作放在容器中运行,当资源不再使用时则释放Session所占用的资源,具体用法如下:

#初始化所有变量,根据MNIST进阶的说明,每一个变量在使用前都必须在Session中进行初始化,如果全初始化0,则可以用该语句一次性初始化完成
init = tf.global_variables_initializer()
#新建一个tf.Session对象
sess = tf.Session()
#运行初始化操作
sess.run(init)

#在下面的例子中尽管已经定义了变量a和b,以及计算c的值,但需要放到sess.run()中才真正完成了计算c的过程
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
#显示输出为30.0
sess.run(c)
#关闭了sess之后其所拥有的资源即被释放,sess就无法使用了
sess.close()

更多的用法请参考官方文档


3.tf.argmax

        在查找资料的过程中,有博主说tensorflow使用numpy实现argmax,因此可以近似认为tf.argmax等同于np.argmax。无论是否如此,明白如何怎样使用即可。官方文档如下:


其说明就是返回张量在给定维度上的最大值所在的索引,其具体例子如下

array = [[1,2,3],[2,3,4],[5,4,3]]
sess.run(tf.argmax(array,0))
sess.run(tf.argmax(array,1))

其运行结果分别为[2,2,0]和[2,2,1],因为当dimension为0的时候返回的是每个一维数组中最大元素的索引,而当dimension为1的时候返回的是二维数组中每一列最大值所在的索引。示意图如下:

猜你喜欢

转载自blog.csdn.net/Micusd/article/details/80932138
今日推荐