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/

相關文章
相關標籤/搜索