那么咱们如何正当的解决数据?
咱们晓得 Q(s,a)中的 state 示意蛇的状态。这个状态包含苹果的地位,蛇的地位,边界的地位,蛇和边界的间隔等等等等。如何示意这么多的内容,并精确的传入神经网络进行计算呢?
咱们应用了一个很重要的数据结构 —–「张量」。
这一次,咱们的主题是:「张量 (Tensor) 是什么,是怎么流动的(Flow)?」
「什么叫张量(tensor)」
首先申明这里咱们指的张量(tensor)是「Tensorflow」里最根本的数据结构. 它是 tensorflow 最重要的概念,顾名思义,flow 是流动的意思,tensorflow 就是 tensor 的流动。「它和物理学中的 tensor 不是同一」个概念。
那张量到底是什么货色呢?简略点说,张量就是多维数组的泛概念。通常一维数组咱们称之为向量,二维数组咱们称之为矩阵,这些都是张量的一种。咱们也会有三维张量、四维张量以及五维张量等等。零维张量就是一个具体的数字。
张量的基本概念
下图是全国某些城市的疫情图,它是一个三维的张量。
从下面图中,能够剖析出张量的基本概念:
「维度」也就是数据轴的个数。如前图数据有 3 个轴,别离指城市,分类,工夫。借用生命科学中的常识,界门纲目科属种即能够示意生物分类的七个维度。
「形态」示意张量沿每个轴的大小(元素个数),也就是 shape。后面图矩阵示例的形态为(3, 5),3D 张量示例的形态为(3, 5, 3)。
「数据类型」这是张量中所蕴含数据的类型,例如,张量的类型能够是 float32、int32、float64 等。很少状况下,会遇到字符(char)张量
下图是张量的平面图形
张量是能够依据理论状况增长或者放大。比方我能够不便的减少一个统计的城市,能够减少统计的分类,能够减少统计的工夫。随着疫情的倒退,咱们减少一个维度统计各个国家的疫情情况。
到这里,兴许会有人将 n 维张量看作树状图,每个维度的元素都会有上面的分支,又有更上面的分支。硬要说,是一种非凡的树状图。因为 shape 的个性,n 维的元素所蕴含的 n - 1 维元素数量是相等的。例如 shape 为(2,2,3)的张量,二维有两个元素,那么他们一维具备的元素数是相等的。这与树状图每个分支能够无规则拓展是不同的。
张量或者存在肯定的缺点,但依然是解决数据的最佳载体之一,尤其是在游戏制作中,多变量存在张量中能够更容易使用库函数进行各种操作。
「张量的表现形式」
在数学外面也有 n 维向量的说法,其实他们都是一维张量,数学中的 N 维向量指的是重量的个数,比方 [1,2] 这个向量的维数为 2,它有 1 和 2 这两个重量;[1,2,3,······,1000]这个向量的维数为 1000。在张量的概念中,他们都是一维张量。
那么,张量的维数和形态怎么看呢?
张量的 shape 自身是一个「元组」,元组元素的「个数」就代表了维度数,而从 tuple[0]开始,示意每一维度(「从高维到低维」)的元素数量。比方(2,3)就示意为一维有 3 个元素,二维两个元素的二维张量。
「tensorflow 中应用张量的劣势」
用 tensorflow 搭建的神经网络,输出层和输入层的值都是张量的模式。因为张量模型能够解决指标集(元素项)为多维的数据,所以在形容理论问题时,相比矩阵模型其更能靠近于理论问题的属性,因而能更好地形容理论问题,** 从而保障神经网络算法是无效的
同时 tensorflow 库具备降维的作用,例如在 www.cungun.comDQN 中,输出的是多维的形容环境的张量,内含许多简单的小数,经解决输入的就是代表了上下左右四个可抉择的动作的数字。
「张量通过 numpy 实现数据的流动」
NumPy 是 Python 中科学计算的根底包。它是一个提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组疾速操作的各种例程,包含数学,游戏,逻辑,形态操作,排序,抉择,I / O 离散傅立叶变换,根本线性代数,根本统计运算,随机模仿等等。
tensor 最大的问题是不能熟能生巧的进行数据的计算,比方:要对 tensor 进行操作,须要先启动一个 Session, 否则,咱们就无奈对一个 tensor 进行简略的赋值或者判断的操作,这种限度对于程序来说是致命的。而数据在流动过程中须要大量的简单的运算。所以,借助于 numpy 弱小的计算能力,tensor 与 numpy 不便的数据转换,它们完满的实现神经网络简单的计算工作。
个别的操作过程是:tensorflow 定义所有的计算过程,即计算流图,并建设神经网络,创立输出 tensor,这时候,示意一个定义计算过程,并不真正进行计算;而后进入下一步,tensor 通过显性或者隐性主动转换成 numpy 执行运算,这时候就是施展 numpy 的计算能力的时候了。
「贪吃蛇程序中张量的应用」
上篇所谈到的搭建神经网络就是张量的使用之一。上面,我来简略介绍一些其余使用。
「创立与调用初始化张量」
self.STATE = self.SNAKE.look(self.FOOD_X, self.FOOD_Y, boundaries))
将食物的地位坐标转化为 numpy 型贮存
应用了 np.hstack 将各元素进行了程度重叠,这些元素次要受蛇头方向和果实刷新地位影响,即果实在蛇头方向的上下左右、左上等等。
「教训的取出(memory)」
states, actions, rewards, next_states, dones = zip(*experiences)
\# 将信息转化成 numpy 格局
states = np.array(states).reshape(self.BATCH_SIZE, state_shape)
actions = np.array(actions, dtype=’int’).reshape(self.BATCH_SIZE)
rewards = np.array(rewards).reshape(self.BATCH_SIZE)
next_states = np.array(next_states).reshape(self.BATCH_SIZE, state_shape)
dones = np.array(dones).reshape(self.BATCH_SIZE)
return states, actions, rewards, next_states,
dones
咱们先用 zip* 将张量拆开(此处的变量即为贪吃蛇原理的外围),再转化成 numpy 模式取出,不便后续用 numpy 进行数据处理。
「降维计算」
从下面图中能够看到,存储的数据往往有 18 项,最终咱们通过 tensorflow 和 numpy 数据处理,将 18 个 float8 数据化成了 action,即用 0,1,2,3 来示意方向。由上图,因为训练批次为 64,所以 action 中有 64 个数,即为过后计算出的蛇的 64 次最佳口头。