前言
上一篇文章中,小编介绍了TensorFlow(下文简称 tf)中张量、节点、图、会话这4个概念,同时分享了小编对搭建基于tf的DNN模型的通用模式的理解。相信从上一篇文章中,大家能够像小编一样体会到,tf中的常量、变量和占位符的定义及赋值(针对后两者)的使用是最基础最重要的点,因为,如果不把我们熟知的整型、浮点型、数组、列表、numpy.ndarray等数据类型转换为tf中常量、或者变量、或者占位符,那么tf就无法识别你的数据。根据上一篇文章,我们知道tf需要将所要处理的数据以节点为单位灌入到图(graph)中,然后创建并启动一个会话(Session)进行计算。本文将就上述三种基本数据类型的定义与赋值做基本的介绍。
基本数据类型的使用
下面关于tf中常量、变量和占位符3种数据类型的作用与定义的操作,来源于tf的API官方说明文档,网址是:https://tensorflow.google.cn/api_docs/python/,关于tf中各种函数、类及其属性、方法的使用请查看tf的官方文档,打开上述网址,即可看如下图所示的页面:
假设在Python集成开发环境中已使用“importtensorflowastf ”语句导入了tf包,则可按照本文中各幅图所示的操作来体会tf中常量、变量和占位符的用法。
1.常量的使用
根据tf的官方文档,tf中常量需使用如下图所示的constant函数来定义:
tf中常量的特性:一旦定义后,常量的值和维度均不能被改变。
定义时,常用参数说明:
value,必填的参数,作用是指定所要定义的常量的值,这个值可以是一个数、字符或字符串,也可以是一个元组、列表或numpy.ndarray类型的数组。
dtype,可选参数,用以指定value的数据类型。
shape,可选参数,一般用以指定一个张量的形状,当value是一个张量时,由于函数能够自动获取value的形状,故一般不使用这个参数;当value是一个数时,若指定了shape的值,则是定义了一个用value填充的shape指定大小的张量。例如:若指定value = 0,shape = [2,3],则就是定义了一个2行3列,元素全为0的张量。
name,可选参数,为所定义的常量指定一个名称,以使得在tf的图中(尤其时使用了tensorboard后)能够看到这个常量。
常量定义的实例
如下图所示,这里演示了常见的5种常量定义的方式,定义完成后,为了能够查看tf中变量的具体值,使用Python中常规print函数答应是不行的,需要使用tf初始化所有变量,然后启动会话(session)并调用run函数才能够看到具体的值。
上述代码的执行结果如下图所示,可以看到,虽然定义常量时value传入的数据类型时元组、列表,但最终会被tf统一转换为numpy类型,由此课件numpy的基础性与重要性。其中,常量b和c的区别是,前者定义时未指定dtype参数的值,则默认为传入的整型类型,后者则再定义的时候,将传入的整数统一转换位了32位浮点数。
2.变量的使用
(1)变量的定义
根据tf的官方文档,tf中变量的定义需使使用Variable类,也就是需要使用用如下图所示的Variable类中的构造函数(__init__)来定义:
tf中变量的特性:定义后,变量的值和维度都可以改变。
定义时,常用参数的说明:
initial_value,可选参数,作用是指定所要定义的变量的值,这个值可以是一个数、字符或字符串,也可以是一个元组、列表或numpy.ndarray类型的数组。
name,可选参数,为所定义的变量指定一个名称,以使得在tf的图中(尤其时使用了tensorboard后)能够看到这个变量。
validate_shape,可选参数,默认值是True。如果指定位False,则initial_value的形状(大小)可以是未知的,否则,默认情况下,initial_value的形状必须是确定已知的,否则将会提示ValueError的错误。
dtype,可选参数,用以指定initial_value的数据类型。
(2)变量的重新赋值
根据tf的官方文档,tf中变量的重新赋值需使用如下图定义的assign、assign_add、assign_sub三个函数中的一个函数实现,其中,assign函数是将变量原来的值重新赋值位一个新的值,而且如果制定了validate_shape参数的值,则可以改变变量的维度;两外两个函数则是在原来的变量的值的基础上加上或减去一个值,作用类似于i+=1与i-=1。
由上面三幅图可见这三个函数的参数差不多,不同的是assign函数多了一个validate_shape参数,下面对这三个函数的参数的意义做一个简单的说明:
ref,必填参数,作用是指定所要被重新赋值的变量的变量名。
value,必填参数,作用是指定所要赋予变量的值,这个值可以是一个数,也可以是一个元组、列表或numpy.ndarray类型的数组,但不能是字符或字符串。
validate_shape,可选参数,只有assign函数有此参数,作用是通过制定一个形状来更改原变量的维度为新的维度大小。
name,可选参数,为所定义的变量指定一个名称,以使得在tf的图中(尤其时使用了tensorboard后)能够看到这个变量。
(3)变量定义与赋值的实例
如下图所示,首先变量的定义,这里使用了tf的fill函数,这与numpy中的full函数的功能一致,后边使用了tf中试用频率比较高的matmul函数,该函数的作用是计算两个矩阵的乘积。此外,要注意的一个地方是,为了能够得到各个变量具体的值,与上文中使用sess.run不一样的是,这里使用了sess.eval。关于这run和eval的区别,请查看上一篇文章——“基于tf的DNN的搭建模式——张量、节点、图与会话”。
上述代码的执行结果如下图所示,这里要关注的地方是,由于上述代码中使用assign函数时设置了validate_shape为False,因此可以改变其值,默认值是True。
3.占位符的使用
(1)占位符的定义
根据tf的官方文档,tf中占位符需使用如下图所示的placeholder函数来定义:
tf中占位符的特性:定义时根据指定的参数向系统申请一定量的内存,使用时,即模型运行时才传入(feed)数据的数据。
定义时,常用参数的说明:
dtype,必填参数,用以指定占位符中所要容纳的数据的数据类型。
shape,可选参数,用以指定占位符中所要容纳的数据的张量的形状。
name,可选参数,为所定义的占位符指定一个名称,以使得在tf的图中(尤其时使用了tensorboard后)能够看到这个占位符。
(2)占位符的赋值
占位符的赋值比较特别,由于占位符在定义的时候最多只是指定数据类型、数据张量的形状(大小),因此,占位符中存入数据一般是开始运行模型时,在Session.run()、Tensor.eval()或Operation.run()中使用参数"feed_dict"传入,其中,Tensor实际是指一个具体的张量的变量名,Operation则是指一个具体的操作节点的变量名。
(3)占位符定义与赋值的实例
下图中的代码定义了两个占位符。你可能会有疑问:既然要把x_data和y_data的值分别赋值给inputs和outputs这两个占位符,那为什么不直接定义为变量?实际上,这涉及到了基于tf的编程模式,这里只是用一个例子以示范占位符的使用方式。具体的缘由可查看上一篇文章——“基于tf的DNN的搭建模式——张量、节点、图与会话”。
上述代码的执行结果如下图所示:
通过本文,你是否已经明白实际搭建DNN模型时,如何才能把我们熟知的那些数据传入到基于TensorFlow的DNN中进行计算呢?相信本文的归纳,能够解决你基于TensorFlow的深度学习中与神经网络相关的基本问题。更多的内容,请持续关注你本公众号的后期推送喔!
欢迎您加入GIS遥感开发QQ群与同行交流
领取专属 10元无门槛券
私享最新 技术干货