tensorflow入门(1)

tensorflow入门(1)

关于 TensorFlow

TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操做,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你能够在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可普遍用于其余计算领域。node

关于数据流图(Data Flow Graph)

数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点” 通常用来表示施加的数学操做,但也能够表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”能够输运“size可动态调整”的多维数据数组,即“张量”(tensor)。张量从图中流过的直观图像是这个工具取名为“Tensorflow”的缘由。一旦输入端的全部张量准备好,节点将被分配到各类计算设备完成异步并行地执行运算。python

windows下安装TensorFlow

python35 -m pip install --upgrade tensorflow

经过import tensorflow来查看是否安装成功,若是没有报错,则安装成功,不然安装失败。git

可是真正运行的时候,会出现这样一个问题,github

The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.

不知道为何会这样,暂时没有找到更好的解决办法,只好经过如下方式把它屏蔽掉。windows

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

例子:生成三维数据, 而后用平面拟合它

import tensorflow as tf
import numpy as np

# 使用 NumPy 生成假数据(phony data), 总共 100 个点.
x_data = np.float32(np.random.rand(2, 100))     # 随机输入,横坐标
y_data = np.dot([0.100, 0.200], x_data) + 0.300 # 纵坐标

# 构造一个线性模型
b = tf.Variable(tf.zeros([1])) # 变量
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b   # 矩阵乘法

# 最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5) # 使用梯度降低法
train = optimizer.minimize(loss)

# 初始化变量
# init = tf.initialize_all_variables()   # 旧式初始化变量方法
init = tf.global_variables_initializer() # 新式初始化变量方法

# 启动图 (graph)
sess = tf.Session()
sess.run(init)

# 拟合平面
for step in range(0, 201):
    sess.run(train)
    if step % 20 == 0:
        print("次数:" + str(step) + " W=" + str(sess.run(W)) + " b=" + str(sess.run(b)))

程序运行结果:数组

次数:0 W=[[ 0.55211174 -0.32715654]] b=[ 0.62308812]
次数:20 W=[[ 0.16676502  0.045885  ]] b=[ 0.33775851]
次数:40 W=[[ 0.11121924  0.16110057]] b=[ 0.31255469]
次数:60 W=[[ 0.10111912  0.18986556]] b=[ 0.30423936]
次数:80 W=[[ 0.09974308  0.19725847]] b=[ 0.3014473]
次数:100 W=[[ 0.09976034  0.19922698]] b=[ 0.30049789]
次数:120 W=[[ 0.09988155  0.19977264]] b=[ 0.30017218]
次数:140 W=[[ 0.09995059  0.19993046]] b=[ 0.30005974]
次数:160 W=[[ 0.09998091  0.19997799]] b=[ 0.30002078]
次数:180 W=[[ 0.09999289  0.19999282]] b=[ 0.30000725]
次数:200 W=[[ 0.09999744  0.19999765]] b=[ 0.30000252]
[Finished in 1.7s]

tensorflow中的Session, 加减乘除, 类型转换

Session

import tensorflow as tf
# 并无获得想要的结果
a = tf.add(3, 5)
print(a)

# Session写法一
sess = tf.Session()
print(sess.run(a))
sess.close()
# Session写法二
with tf.Session() as sess:
    print(sess.run(a))

程序输出结果:bash

Tensor("Add:0", shape=(), dtype=int32)
8
8

tensorflow的每一个session是相互独立的:服务器

W = tf.Variable(10)
sess1 = tf.Session()
sess2 = tf.Session()
sess1.run(W.initializer)
sess2.run(W.initializer)
print(sess1.run(W.assign_add(10))) # >> 20
print(sess2.run(W.assign_sub(2))) # >> 8
print(sess1.run(W.assign_add(100))) # >> 120
print(sess2.run(W.assign_sub(50))) # >> -42
sess1.close()
sess2.close()

加减乘除以及类型转换

上面是一个加法的示例,下面看看加减乘除的示例:网络

a = tf.add(5, 2)  # 加法:7
b = tf.subtract(10, 4) # 减法:6
c = tf.multiply(2, 5)  # 乘法:10
d = tf.div(10, 5) # 除法:2
e = tf.subtract(tf.cast(tf.constant(2.0), tf.int32), tf.constant(1))   # 类型转换:1

常数类型(Constant types)

经过如下方式创建常数session

tf.constant(value, dtype=None, shape=None, name='Const', verify_shape=False)

创建一维向量和矩阵,而后将它们乘起来:

>>> a = tf.constant([2, 2], name='a')
>>> b = tf.constant([[0, 1], [2, 3]], name='b')
>>> x = tf.multiply(a, b, name='dot_production')
>>> with tf.Session() as sess:
        print(sess.run(x))
[[0, 2]
    [4, 6]]

特殊常量的建立:
tensorflow的不少操做和numpy很像。

tf.zeros(shape, dtype=tf.float32, name=None)
tf.zeros_like(input_tensor, dtype=None, name=None, optimize=True)
tf.ones(shape, dtype=tf.float32, name=None)
tf.ones_like(input_tensor, dtype=None, name=None, optimize=True)
tf.fill(dims, value, name=None)

示例:

>>> sess = tf.Session()
>>> print(sess.run(tf.zeros(3)))
[ 0.  0.  0.]
>>> print(sess.run(tf.ones([2,3])))
[[ 1.  1.  1.]
 [ 1.  1.  1.]]

建立序列:

tf.linspace(start, stop, num, name=None)
tf.range(start, limit=None, delta=1, dtype=None, name='range')

以上示例:

>>> tf.linspace(10.0, 13.0, 4)
[10.0, 11.0, 12.0, 13.0]
>>> tf.range(3, limit=18, delta=3)
[3, 6, 9, 12, 15]

注意这里的序列不能迭代:

for i in tf.range(4): # TypeError

产生随机数:

tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None,
name=None)
tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None,
name=None)
tf.random_shuffle(value, seed=None, name=None)
tf.random_crop(value, size, seed=None, name=None)
tf.multinomial(logits, num_samples, seed=None, name=None)
tf.random_gamma(shape, alpha, beta=None, dtype=tf.float32, seed=None, name=None)

tensorflow和numpy的数据类型能够通用,好比:

>>> import numpy as np
>>> tf.ones([2, 2], np.float32)
[[1.0, 1.0], [1.0, 1.0]]

变量(Variable)

在计算图的定义当中,若是常量过多,会使得加载计算图变得很是慢,同时常量的值不可改变,因此须要引入变量。

a = tf.Variable(2, name='scalar')
b = tf.Variable([2, 3], name='vector')
c = tf.Variable([[0, 1], [2, 3]], name='matrix')
d = tf.Variable(tf.zeros([784, 10]), name='weight')

变量的几个操做:

x = tf.Variable()
x.initializer # 初始化
x.eval() # 读取里面的值
x.assign() # 分配值给这个变量

变量初始化

在使用变量以前必须对其进行初始化,初始化能够看做是一种变量的分配值操做。最简单的初始化方式是一次性初始化全部的变量

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)

也能够对某一部分变量进行初始化:

init_ab = tf.variable_initializer([a, b], name='init_ab')
with tf.Session() as sess:
    sess.run(init_ab)

或者是对某一个变量进行初始化:

w = tf.Variable(tf.zeros([784, 10]))
with tf.Session() as sess:
    sess.run(w.initializer)

打印变量

打印变量值的两种方法:

w = tf.Variable(tf.truncated_normal([10, 10], name='normal'))
with tf.Session() as sess:
    sess.run(w.initializer)
    print(w.eval()) # 方法一
    print(sess.run(w)) # 方法二

给变量分配值

import tensorflow as tf

# 没有run assign
w = tf.Variable(10)
w.assign(100)
with tf.Session() as sess:
    sess.run(w.initializer)
    print(w.eval())

# run assign
w = tf.Variable(10)
wa = w.assign(100)
with tf.Session() as sess:
    sess.run(w.initializer)
    print(w.eval())
    print(sess.run(wa))

以上代码有三个print,程序运行结果以下:

10
10
100
[Finished in 1.5s]

参考

http://www.tensorfly.cn/
https://sherlockliao.github.io/2017/08/21/cs20si2/