那么咱们如何正当的解决数据?

咱们晓得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次最佳口头。