Tensorflow基础

Numpy基础

数组基础

在学习tensorflow之前我们先要了解一些numpy的使用方法,因为在tensorflow使用中初期的数据一般都是由numpy来处理的。
首先我们要知道numpy主要是用来进行高维数组运算的,其实我们使用python的内置list列表数据类型,也可以自己完成这些操作,但缺点也特别的明显,一个就是编码比较复杂,完成一个简单的功能需要编写较多的代码,而用numpy可能就是一句代码;另一方面就是执行速度慢,当数据量多的时候就更明显了,而numpy底层由c语言实现,因此运算速度较快;

接下来理解一下numpy中的数据结构,首先是单个数据,比如常数什么的,紧接着多个同类型数据可以构成一维数组;
二维数组和我们平常的理解一样,可以形象化为一个面,相当于是多个一维数组,比如[[1,2,3],[4,5,6]],就相当于是两个一维数组,当然有一种特殊情况是该二维数组只有一个一维数组,即[[1,2,3]];
对于三维数组的理解也是这样,同样是比二维数组多了一个维度,我们可以想象是由多个面组成的一个体,在具体索引的时候相当于先选哪个面,在这个面中选择哪一行和哪一列;对于shape(2,3,4)的理解可以是由2个3行4列的二维数组。
再往高维里扩展同样是类似的思路,在这里就不再一 一赘述,有一个小技巧就是看数组是几维的,就看开头有几个[即可,比如[[3,4,5],[6,7,8]]就是二维数组;
在numpy中,使用array函数来创建数组,比如下面的例子:

接着理解一下有关轴的概念,一维数组有一个轴,二维数组有两个轴,三维数组有三个轴,依次类推;轴的值是从0开始,逐一增加,对于哪个轴指向的是哪个方向,可以这样来理解,比如对于二维数组,有两个轴,分别是0和1,0轴其实就相当于沿行的方向向下指,1轴就是沿列的方向向右指,也就是按着索引的顺序来分的。
另外还有一个需要注意的点是二维数组和矩阵的形式很相像,在numpy中,二维数组和矩阵是通用的,虽然创建矩阵有自己单独的方法,但是一般还是建议直接用二维数组的形式;

数组之间的运算

首先就是四则运算,分别为np.add(),np.subtract(),np.multiply(),np.divide();他们可以用+,-,*,/运算符来代替,这几个运算都是对应元素间的运算,因此需要两个数组形状相同;
其次就是矩阵运算,numpy提供了np.dot()函数来进行矩阵之间的运算;
numpy还提供了功能强大的广播功能,具体的规则如下所示:
让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
输出数组的形状是输入数组形状的各个维度上的最大值。
如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。

pandas基础

pandas常常和Numpy结合起来使用,下面件简单说一下pandas中的一些操作;

pandas中的数据结构

pandas中主要有两种数据结构,一种是series,另一种是dataframe;
series是一种一维数组,和numpy中的一维数组以及python内置数据类型list很相像,不同之处在series是带有索引值的,这里的索引值可以由我们自己指定,省略的时候会为我们自动生成,这里就又有点字典的意思了。
dataframe是另一种数据结构,其实就类似与表格,既有行索引又有列索引,dataframe的每一列又都是一个series。

常用操作

我们常常会用pandas去读取csv等表格文件,主要使用pandas为我们提供的函数来操作;
data=pd.read_csv(文件路径);这样我们就获得了一个dataframe类型的数据;
我们可以按列去取其中的数据,比如其中有一列的索引(属性名)name,那么我们可以使用data['name']的方式来获取这一列的数据,加入还有另一列的索引为age,我们想同时获取这两列的数据,可以使用data[['name','age']]的方式;
我们可以将其转换成numpy中的多维数组的形式,array中既可以接受series型也可以接受dataframe,按照自己的需要截取数据然后转换即可。

Tensorflow基础

张量

tensorflow中的tensor指的就是张量的意思,在tensorflow中的运算使用的也都是张量这种数据类型,因此如果我们使用的是numpy数组,我们需要将numpy数组转换为张量再继续进行操作;
对于张量我们可以这样来理解,张量tensor就是对numpy数组再进行了一次封装,以便更适应tensorflow中的运算。
tensorflow中提供了constant函数来创建张量,我们可以看看下面这个例子:

import tensorflow as tf
import numpy as np
a=np.array([[1,2],[3,4]]
b=tf.constant(a)
print(a)
print(b)

运算结果如下:

[[1 2]
 [2 4]]
tf.Tensor(
[[1 2]
 [2 4]], shape=(2, 2), dtype=int32)

单独输出b这个数据,会显示<tf.Tensor: shape=(2, 2), dtype=int32, numpy=array([[1, 2],[2, 4]])>,这就是张量类型,我们可以看到其中有一个numpy属性,我们使用b.numpy()函数即可将这个数组取出来,因此我们在使用的时候一般是先将高维数组numpy转换成tensor张量,最后计算结束之后,可以使用numpy()函数来取运算结果来进行输出;

张量运算

首先是基本的数学四则运算,大致的运算方法和上面的numpy模块一样,只需要将np改为tf即可,同样可以用运算符来代替运算;
tf.pow是求幂运算,tf.square()是计算平方,tf.sqrt()是计算平方根,tf.greater()是比较大小的,逐元素比较返回布尔列表;
tensorflow中实现矩阵乘法的函数是tf.matmul()

常用函数

tf.reduce_sum(tensor,axis),求和运算,指定axis的时候是按axis操作,省略的时候是求全局;
tf.reduce_mean(tensor,axis)求平均值运算,规则如上;
tf.reduce_max(tensor,axis)求最大值运算,规则如上;
tf.reduce_min(tensor,axis)求最小值运算,规则如上;
tf.argmax(tensor,axis)求最大值对应的索引值;

Variable对象

Variable对象是对Tensor对象的进一步封装,可以在模型训练过程中自动记录梯度信息,由算法自动优化,可以被训练的变量,常常在涉及到求导的运算中使用;
创建方法是tf.Variable(initial_value,dtype);
可训练变量的赋值方法是对象名.assign(),还可以用assign_add()或assign_sub()实现自增和自减操作;
自动求导使用方法如下所示:

with tf.GradientTape() as tape:
      定义函数
      进行相关操作
grad=tape.gradient(函数,自变量)#这里的自变量可以使用列表实现对多个变量的求导,同时也需要多个变量来接运算结果;
posted @ 2020-10-06 18:44  万物小白  阅读(257)  评论(0编辑  收藏  举报