tensorflow基礎入門
思考一個問題:
如何剛好學習TensorFlow
- 類比為一門開發語言,學會語法,api的調用, 原理性掌握。
語言的要素:
基礎數據類型 運算符 流程 字典 數組
import tensorflow as tf# 常量,指定數據類型
data1 = tf.constant(2,dtype=tf.int32)# 變量,指定變量名
data2 = tf.Variable(10,name='var')print(data1)
print(data2)

并沒有打印出數值,而是描述信息。
TensorFlow中所有的操作都得在會話中被執行。
import tensorflow as tf# 常量,指定數據類型
data1 = tf.constant(2,dtype=tf.int32)# 變量,指定變量名
data2 = tf.Variable(10,name='var')print(data1)
print(data2)'''
sess = tf.Session()
print(sess.run(data1))# 這里可以正確打印出data1init = tf.global_variables_initializer()
sess.run(init)# 但是當我們仍要用這個sess打印data2時會報錯
# 對于變量數值,我們要進行初始化。
print(sess.run(data2))
sess.close()
# 本質 tf = tensor + 計算圖
# tensor 數據
# op
# graphs 數據操作
# session
'''
init = tf.global_variables_initializer()
sess = tf.Session()
with sess:sess.run(init)print(sess.run(data1))print(sess.run(data2))

TensorFlow運算實質

tensorflow 由張量和計算圖兩部分構成。
常量變量都是張量。張量表示的就是數據。
op是operation。 常見的四則運算。賦值,兩個tensor之間的加法。
op + tensor 構成了 graphs
# 本質 tf = tensor + 計算圖
# tensor 數據
# op
# graphs 數據操作
# session
所有的操作都要在session中被run
分析tf代碼:
- 先分析tensor張量有哪些。
- 再分析session中的計算圖有哪些
- 這兩個方面掌握清楚就好理解代碼了
本質是數據 + 計算圖
TensorFlow中所有的變量都必須1初始化之后才能進行。init操作實質仍然是一個計算圖,
要使用session.tun(init)
直接使用完session 我們還需要close掉
- 或者使用with進行關閉
view linenumber 看到行號
常量與變量的四則運算
import tensorflow as tf# 兩個常量
data1 = tf.constant(6)
data2 = tf.constant(2)# 定義一個加法操作
dataAdd = tf.add(data1,data2)
# 定義一個乘法操作
dataMul = tf.multiply(data1,data2)
# 定義一個減法操作
dataSub = tf.subtract(data1,data2)
# 定義一個除法操作
dataDiv = tf.divide(data1,data2)# 使用sess創建。with不需要close
with tf.Session() as sess:print(sess.run(dataAdd))print(sess.run(dataMul))print(sess.run(dataSub))print(sess.run(dataDiv))
print('end!')

import tensorflow as tf
data1 = tf.constant(6)
# data2變量
data2 = tf.Variable(2)
dataAdd = tf.add(data1,data2)# 完成當前的數據拷貝: 把當前dataAdd的結果追加到data2中
dataCopy = tf.assign(data2,dataAdd)# dataAdd ->data2dataMul = tf.multiply(data1,data2)
dataSub = tf.subtract(data1,data2)
dataDiv = tf.divide(data1,data2)
init = tf.global_variables_initializer()
with tf.Session() as sess:sess.run(init)print(sess.run(dataAdd))print(sess.run(dataMul))print(sess.run(dataSub))print(sess.run(dataDiv))# 將6和2相加的結果放到data2中print('sess.run(dataCopy)',sess.run(dataCopy))#8->data2# 除過run方法還可以使用.eval()直接輸出。eval方法相當于下面這句話print('dataCopy.eval()',dataCopy.eval())#8+6->14->data2 = 14# 獲取默認的session,執行run操作print('tf.get_default_session()',tf.get_default_session().run(dataCopy))
print('end!')
運行dataCopy.eval()時,其中的data2已經是8了,然后加上常量6.輸出14
而再次運行時data2已經變成了14.
計算圖運行的兩種方法:
- sess.run
- op.eval()
矩陣基礎
前面的數據我們都是初始化的時候就定義好了,然而有時我們用到的數據是
需要在運算時實時插入的。
placeholder
import tensorflow as tf
data1 = tf.placeholder(tf.float32)
data2 = tf.placeholder(tf.float32)
dataAdd = tf.add(data1,data2)
with tf.Session() as sess:# 使用feed_dict為placeholder回填數據print(sess.run(dataAdd,feed_dict={data1:6,data2:2}))# 1:op dataAdd 2: data (feed_dict = {參數1:6,參數2:2})
print('end!')
矩陣運算
- 類比 數組 M行N列(二維數組)
- 外層[] 內層嵌套[]
- 每個內層中括號表示:[里面 列數據]
- 每個內層[]整體作為一行 行數
# [[6,6]] 一行兩列的矩陣
import tensorflow as tf
# 一行兩列矩陣
data1 = tf.constant([[6,6]])
# 兩行一列矩陣
data2 = tf.constant([[2],[2]])
# 一行兩列
data3 = tf.constant([[3,3]])
# 三行兩列
data4 = tf.constant([[1,2],[3,4],[5,6]])print(data4.shape)# 打印矩陣的維度with tf.Session() as sess:print(sess.run(data4)) # 打印整體print(sess.run(data4[0]))# 打印某一行print(sess.run(data4[:,0]))# M*N的矩陣,第一位是行,第二位是列。# 打印某一列,使用:表示所有行print(sess.run(data4[0,1]))# 1 1 下標從0開始算。但是shape是從1開始算的
矩陣運算2
一種矩陣加法,和兩種矩陣乘法
矩陣在進行加法的時候,必須要保證兩個矩陣的行列相等。
我們兩個(2,3)的矩陣相加,相加之后仍然是一個(2,3)的矩陣


兩個(2,2)的矩陣相加可以得到新矩陣

A+E 是由第一個矩陣中第一行第一列的值,加上第二個矩陣中第一行第一列的值。
以此類推,對應元素的加法
矩陣的乘法

第一個矩陣的列數,必須等于第二個矩陣的行數,矩陣才可以進行相乘。
(m,k) 與 (k,n) 相乘可以乘出一個(m,n)的
左側矩陣的第一行的對應元素乘以右側矩陣的第一列的對應元素,構成新矩陣中(1,1)位置的元素。
這里我們就可以看出為啥要左邊的列,等于右邊的行了,不然左邊這第一行的元素個數(列數) 去右側的矩陣中找不到對應的元素
代碼實現
import tensorflow as tf
data1 = tf.constant([[6,6]])
data2 = tf.constant([[2],[2]])
data3 = tf.constant([[3,3]])
data4 = tf.constant([[1,2],[3,4],[5,6]])# 矩陣相乘
matMul = tf.matmul(data1,data2)# 直接使用簡單乘法,對應元素相乘
matMul2 = tf.multiply(data1,data2)# 矩陣相加
matAdd = tf.add(data1,data3)with tf.Session() as sess:print(sess.run(matMul))# data1 (1,2) 乘以 data2(2,1) 得到結果(1,1)print(sess.run(matAdd))# 1行2列 加 1行2列 還是一行兩列print(sess.run(matMul2))# 1x2 2x1 = 2x2 這里涉及到python的廣播機制# [6,6] 和 [[2].[2]] 都會被補全成一個2x2的矩陣。然后對應元素相乘# 使用print一次打印多個內容print(sess.run([matMul,matAdd]))
特殊矩陣初始化
import tensorflow as tf# 兩行三列零矩陣
mat0 = tf.constant([[0,0,0],[0,0,0]])# 兩行三列零矩陣
mat1 = tf.zeros([2,3])# 三行兩列一矩陣
mat2 = tf.ones([3,2])# 兩行三列填充矩陣(15)
mat3 = tf.fill([2,3],15)
with tf.Session() as sess:print(sess.run(mat0))print('************')print(sess.run(mat1))print('************')print(sess.run(mat2))print('************')print(sess.run(mat3))

一些更為特殊的矩陣
import tensorflow as tf
# 三行一列的矩陣
mat1 = tf.constant([[2],[3],[4]])
# 與mat1具有相同的維度,但mat2內容為0
mat2 = tf.zeros_like(mat1)# 將0-2之間數據分成相等的10份,中間有10個數據,要填11
mat3 = tf.linspace(0.0,2.0,11)# 隨機數矩陣,2行三列,數字為-1到2之間的隨機數
mat4 = tf.random_uniform([2,3],-1,2)with tf.Session() as sess:print(sess.run(mat2))print('************')print(sess.run(mat3))print('************')print(sess.run(mat4))

tf中numpy創建矩陣
類比數據庫的學習CURD增刪改查
# CURD
import numpy as np# 一維數組
data1 = np.array([1,2,3,4,5])
print(data1)
print('***************')# 兩行兩列數組
data2 = np.array([[1,2],[3,4]])
print(data2)
print('***************')# 矩陣的維度
print(data1.shape,data2.shape)
print('***************')# 初始化特殊矩陣 zeros ones
print(np.zeros([2,3]),np.ones([2,2]))
print('***************')# 改查: 修改第二行第一列數據
data2[1,0] = 5
print(data2)
# 查詢第二行第二列數據
print(data2[1,1])
print('***************')# 基本運算:加減乘除# 兩行三列的全一矩陣
data3 = np.ones([2,3])# 簡單乘除加法
print(data3*2) # 對應每個元素乘2
print(data3/3) # 對應元素除以3
print(data3+2) # 所有元素加2
print('***************')# 矩陣 +*# 兩行三列矩陣
data4 = np.array([[1,2,3],[4,5,6]])# 矩陣對應位置元素相加
print(data3+data4)# 矩陣對應位置元素相乘
print(data3*data4)

Matplotlib繪圖模塊
使用numpy準備數據,Matplotlib進行可視化繪圖
import numpy as np
import matplotlib.pyplot as plt
# 設置在瀏覽器內顯示
%matplotlib inline
# x軸坐標
x = np.array([1,2,3,4,5,6,7,8])
# y軸坐標
y = np.array([3,5,7,6,2,6,10,15])# 繪制折線圖,第一個參數x軸坐標,第二個參數y軸坐標。第三個參數顏色
plt.plot(x,y,'r')# 折線 1 x 2 y 3 color
plt.show()
# 第四個參數: 線條寬度
plt.plot(x,y,'g',lw=10)# 4 line w
# 折線 餅狀 柱狀x = np.array([1,2,3,4,5,6,7,8])
y = np.array([13,25,17,36,21,16,10,15])# 柱狀圖: color 是顏色, alpha 透明度
# 每個柱狀圖的占用比例
plt.bar(x,y,0.2,alpha=1,color='b')# 5 color 4 透明度 3 0.9
plt.show()

綜合性demo
神經網絡逼近股票收盤價格
結合TensorFlow實現一個綜合性的例子
實現股票數據日線的繪制,并且用人工神經網絡實現股票收盤價格的擬合

其中紅色表示當天的股票是上漲的
藍色表示股票是下降的。9點半開盤,下午三點收盤。
上漲代表: 收盤大于開盤價格。下跌相反
最低價會低于收盤價或開盤價。
數據加載和圖表的繪制
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline# 準備數據15組數據。(15天)
date = np.linspace(1,15,15)# 每天的收盤價格
endPrice = np.array([2511.90,2538.26,2510.68,2591.66,2732.98,2701.69,2701.29,2678.67,2726.50,2681.50,2739.17,2715.07,2823.58,2864.90,2919.08]
)# 每天的開盤價格
beginPrice = np.array([2438.71,2500.88,2534.95,2512.52,2594.04,2743.26,2697.47,2695.24,2678.23,2722.13,2674.93,2744.13,2717.46,2832.73,2877.40])# 驗證日期
print(date)plt.figure()for i in range(0,15):# 繪制 一個柱狀圖# x是一個一維數組兩個值,對應兩個y收盤開盤。dateOne = np.zeros([2])dateOne[0] = i;dateOne[1] = i;# 開盤價格和收盤價格priceOne = np.zeros([2])priceOne[0] = beginPrice[i]priceOne[1] = endPrice[i]# 繪制每一根柱狀圖,上漲紅色,下降綠色if endPrice[i]>beginPrice[i]:# 日期和開收盤價格plt.plot(dateOne,priceOne,'r',lw=8)else:plt.plot(dateOne,priceOne,'g',lw=8)plt.show()

實現最簡單的人工神經網絡

輸入: 15行一列的矩陣。
隱藏層矩陣 1行10列
輸出層矩陣 15行一列

輸入: 天數 輸出: 每天股價

輸入層與隱藏層進行連接

輸入矩陣A 乘以權重矩陣w1 + 偏置矩陣 構成了B
構成了我們的中間層矩陣。
矩陣B與第三層如何連接
B*w2 + b2 = C
c就是我們的輸出矩陣。
維度的變化


w1維度: 一行十列
b1維度: 一行十列
w2維度: 十行一列
b2維度: 十五行一列


加上b1, 會進行廣播機制。
1*10
的b1會被擴展成15行10列。也就是每一行一樣。
然后矩陣對應每個元素相加。

神經網絡內部如何進行計算和工作?

給參數一些簡單的初始值
計算出一個C值。而我們的真實股價2400 2511
- 第二次循環"梯度下降法" 目的減少111
給出一個新的參數組合。
for循環的終止條件: 訓練多少次之后,或者差異符合我們的要求
循環終止會輸出最后的w1 w2 b1 b2
知道了 這些參數。我們就知道預測新的股價
代碼實現
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
date = np.linspace(1,15,15)
endPrice = np.array([2511.90,2538.26,2510.68,2591.66,2732.98,2701.69,2701.29,2678.67,2726.50,2681.50,2739.17,2715.07,2823.58,2864.90,2919.08]
)
beginPrice = np.array([2438.71,2500.88,2534.95,2512.52,2594.04,2743.26,2697.47,2695.24,2678.23,2722.13,2674.93,2744.13,2717.46,2832.73,2877.40])
print(date)
plt.figure()
for i in range(0,15):# 1 柱狀圖dateOne = np.zeros([2])dateOne[0] = i;dateOne[1] = i;priceOne = np.zeros([2])priceOne[0] = beginPrice[i]priceOne[1] = endPrice[i]if endPrice[i]>beginPrice[i]:plt.plot(dateOne,priceOne,'r',lw=8)else:plt.plot(dateOne,priceOne,'g',lw=8)
# 輸入的日期
dateNormal = np.zeros([15,1])
# 輸出的價格
priceNormal = np.zeros([15,1])# 進行歸一化處理
for i in range(0,15):# 日期最大14dateNormal[i,0] = i/14.0;# 價格不會超出3000priceNormal[i,0] = endPrice[i]/3000.0;# 一個n行一列的占位符
x = tf.placeholder(tf.float32,[None,1])
# 一個n行一列的占位符
y = tf.placeholder(tf.float32,[None,1])# 隱藏層B
# w1是會被修改的。所以定義一個變量。
# 初值隨機,一行十列,0到1之間
w1 = tf.Variable(tf.random_uniform([1,10],0,1))# 偏置矩陣一行十列
b1 = tf.Variable(tf.zeros([1,10]))# wb1也就是隱藏層的輸出值是x乘以w1加上b1
wb1 = tf.matmul(x,w1)+b1
# 激勵函數增加非線性元素。
layer1 = tf.nn.relu(wb1) # 激勵函數# 輸出層
w2 = tf.Variable(tf.random_uniform([10,1],0,1))
b2 = tf.Variable(tf.zeros([15,1]))wb2 = tf.matmul(layer1,w2)+b2
layer2 = tf.nn.relu(wb2) #完成簡單映射# 損失函數(真實值-預測值)的平方。開放出來的結果再進行一個均值
loss = tf.reduce_mean(tf.square(y-layer2))#y 真實 layer2 計算# 梯度下降法,梯度下降法。參數為學習率,目標是最小化loss
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)with tf.Session() as sess:# 初始化所有的全局變量sess.run(tf.global_variables_initializer())# 程序終止: for循環次數for i in range(0,10000):# x,y值填入歸一化之后的x,ysess.run(train_step,feed_dict={x:dateNormal,y:priceNormal})# 進行預測驗證# w1w2 b1b2 A + wb -->layer2 得到新的預測值pred = sess.run(layer2,feed_dict={x:dateNormal})predPrice = np.zeros([15,1])# 還原當前價格。(反歸一化)for i in range(0,15):predPrice[i,0]=(pred*3000)[i,0]plt.plot(date,predPrice,'b',lw=1)
plt.show()
