新的一年我又配了一个新的机器学习环境,这次是在Win10下,去年是Ubuntu下,想来想去还是Windows做开发好使。另外充了256块钱的Gitchat会员,希望今年能多学一点AI相关的。

配置开发环境CUDA8.0+CUDNN+Python3.5.2+Pycharm

Tensorflow下文简称TF


0.认识Tensorflow,并输出Hello TF与数字

 

首先,我们在这里要利用TF自带的constant函数,用于建立一个常量节点,可用的包含所有数据格式

 

TF的一般架构,是比较传统的,和这种差不多,以从左到右的方式来进行计算和推演

 

 

Tensorflow架构下,节点(Node)是在图(Graph)内的

 

如果要执行节点获取结果,需要先进行评估,利用Session函数,评估后才能得到我们的结果

 

所以,如果要输出,我们需要先建立常量节点,建立会话,然后输出值,大致如下所示

import tensorflow as tf
import numpy as np
node1=tf.constant("hello")
node2=tf.constant(200)
sess = tf.Session()
print(sess.run([node2,node1]))

如果TF安装配置正确可以得到结果

[200, b'hello']

 

1.用Tensorflow完成矩阵加法数学运算

首先,我们需要定义两个常量,常量在tensorflow中是constant函数来定义的,这里需要注意的是,常量必须是相同的类型,例如float,如果在dtype中没有声明,tensorflow将会以最可能类型的来初始化值

a=tf.constant([1,2],name="a",dtype=tf.float32)
b=tf.constant([2,3.0],name="b",dtype=tf.float32)

计算结果为两者相加

result = a+b

建立会话得到计算结果并且打印输出

print(tf.Session().run(result))

这样就可以得到结果

[3. 5.]

 

2.用Tensorflow完成难一点的数学运算

 

在了解了一般的运算后,我们可以开始进行简单的图与节点的构建,并且塞入张量(tensor)

我想做一个

C=A+B

D=A*C

E=D+2

像这样的操作,并且最终输出D

代码如下,我先需要导入tensorflow并且设立常量,常量的设置使用constant函数


import tensorflow as tf
import numpy as np
const = tf.constant(2.0 ,name='const')

 

然后配置变量,tensorflow中,变量使用Variable函数来设置


a = tf.Variable(2.0, name='b') #a=2
b = tf.Variable(1.0, name='c') #b=1

 加入节点与算法

c = tf.add(a,b,name='c') #c=a+b
d = tf.multiply(a,c,name='d') #d=a*c
e = tf.add(d,const,name='e') #e=d+2

然后就可以初始化全局变量,并按照计算图来执行,在这里只要执行初始化全局变量以及最后的e节点即可获得最终的结果

init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init_op)
    a_out = sess.run(e)
    print("Variable a is {}".format(a_out))

 

此时,我们的整个网络是这样的

最终结果,e=8

Variable a is 8.0

全部代码如下:

#count out E=A*(A+B)+2
import tensorflow as tf
import numpy as np
const = tf.constant(2.0 ,name='const')
a = tf.Variable(2.0, name='b') #a=2
b = tf.Variable(1.0, name='c') #b=1
c = tf.add(a,b,name='c') #c=a+b
d = tf.multiply(a,c,name='d') #d=a*c
e = tf.add(d,const,name='e') #e=d+2

init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init_op)
    a_out = sess.run(e)
    print("Variable a is {}".format(a_out))

 

3.如何使用tensorflow占位符输入数字

在前面,我们的变量和常量都是事先赋值好的,那么,如果说要仅仅是定义一个变量但不给它赋值,在后面运算的时候才赋值的话,就需要使用到占位符placeholder

这里演示使用placeholder来计算y=a*x的操作,先设置x和a,其中a是一个变量,有着初始值,而x是已经定义了维度(Shape)的一个占位符,没有初始值

a = tf.Variable(4.4,dtype=tf.float32) #设置一个32位浮点变量
x = tf.placeholder(tf.float32,shape=(1,2),name="input")  #初始化占位符

再之后则是定义y是a和x相乘的结果

y = tf.multiply(x,a,name="mul")  #调用tf的乘法函数使得x和a相乘

这样,就完成了值和算法的编写,随后就是初始化和运行,输出结果。贴上全部的代码:

import tensorflow as tf

a = tf.Variable(4.4,dtype=tf.float32) #设置一个32位浮点变量
x = tf.placeholder(tf.float32,shape=(1,2),name="input")  #初始化占位符

y = tf.multiply(x,a,name="mul")  #调用tf的乘法函数使得x和a相乘
sess = tf.Session() #建立会话
init_op = tf.global_variables_initializer()  #初始化全局变量
sess.run(init_op) #执行初始化全局变量的函数

print(sess.run(y,feed_dict={x:[[1.0,2.0]]})) #获取y的结果,需要先给之前占位符变量赋值

执行后,就是计算【1.0,2.0】矩阵和4.4相乘得到的结果

[[4.4 8.8]]

 

 

4.如何使用tensorflow占位符输入数组

 

这里使用2号例子进行修改,将原先赋值变量b变为设置32位float型占位符,目的是使得b有不同的值,输出不同的结果,在下面的代码中,None是指数值不确定,1则表示是1维,如果我要输入图片,例如一张图是100像素,那这里就修改为100.

b = tf.placeholder(tf.float32, [None, 1], name='b')

结合numpy来赋值,主要是修改sess.run运行的部分,从而实现给变量b赋予不同的值,我们使用numpy来产生一列数值

 a_out = sess.run(e,feed_dict={b: np.arange(0,12)[:,np.newaxis]})

np.arange产生0开始的12个数,也就是0-11,而[:,np.newaxis]则将这一数组分布为一列,运算的结果是

[[ 6.]
 [ 8.]
 [10.]
 [12.]
 [14.]
 [16.]
 [18.]
 [20.]
 [22.]
 [24.]
 [26.]
 [28.]]

 

经过占位符修改的代码如下

#count out E=A*(A+B)+2
import tensorflow as tf
import numpy as np
const = tf.constant(2.0 ,name='const')
a = tf.Variable(2.0, name='a') #a=2
b = tf.placeholder(tf.float32,[None,1], name='b') #set placeholder
c = tf.add(a,b,name='c') #c=a+b
d = tf.multiply(a,c,name='d') #d=a*c
e = tf.add(d,const,name='e') #e=d+2

init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init_op)
    a_out = sess.run(e,feed_dict={b: np.arange(0,12)[:,np.newaxis]})
    print("Variable a is {}".format(a_out))

 

 

 

 

 

 

 

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐