TensorFlow基礎與實戰

開源工具

TensorFlow:谷歌,C++、Python,Linux、Windows、Mac OS X、Andriod、iOS html

Caffe:加州大學,C++、Python、Matlab,Linux、Windows、Mac OS X 算法

PaddlePaddle:百度編程

 

TensorFlow安裝(Python)後端

pip install tensorflow(cpu版)數組

 

官網:https://www.tensorflow.org/ session

 

推薦圖書: app

《深度學習》https://item.jd.com/14454752659.html 框架

《TensorFlow實戰google深度學習框架》https://item.jd.com/12125572.htmldom

 中文社區 http://www.tensorfly.cn/函數

 

TensorFlow入門

計算模型:計算圖

數據模型:張量(tensor)

運行模型:會話(session)

 

TensorFlow程序的兩個階段

定義計算(在計算圖中)

執行計算(在會話中)

 

Tensor:張量(數據類型)

  類比多維數組(numpy中的ndarray)

  類型:標量、向量、矩陣、數組等

  做用:對計算結果的引用、得到計算結果

 

Flow:流

 

經過計算圖的形式表達計算的編程系統

計算圖(可默認生成):節點/操做(op)

a = tf.constant([1.0,2.0],name='a')

b = tf.constant([2.0,3.0],name='b')

result = a+b

 

注意:此過程只生成計算圖,並不執行計算

 

必須知道:

使用圖(graph)來表示計算任務

在被稱之爲會話(Session)的上下文(context)中執行圖

使用tensor表示數據

經過變量(variable)維護狀態

使用feed和fetch能夠爲任意的操做(operation)賦值或者從其中獲取數據

# -*- coding:utf-8 -*-
import tensorflow as tf

#定義計算
a = tf.constant([1.5, 3.0], dtype=tf.float64) #constant常量構造函數 指定類型dtype=tf.float64
b = tf.constant([0., 1], name = 'b') #構造的常量區別名爲b
res = a + b

#注意TensorFlow裏面數據類型要一致

# print(res, b) 這時返回的是並非咱們想看到的直觀的結果
#Tensor("add:0", shape=(2,), dtype=float32) Tensor("b:0", shape=(2,), dtype=float32)

#執行計算
sess = tf.Session() #構建會話
res,b = sess.run([res, b])#執行
sess.close() #關閉會話

#使用with語句 等價於上面三條語句
# with tf.Session() as sess:
#     sess.run(res)

print(res, b)

案例

任務1:擬合三維平面

經過

  

生成了100個樣本點,如表所示

現假設函數關係未知,請根據這100個樣本數據找出合適的a,b,c

使得

   

 

求解步驟:

利用Numpy生成100個樣本點

構造一個線性模型

最小化方差

初始化變量

啓動圖

擬合平面(開始訓練)

 

TensorFlow計算方法:

爲了在Python中進行高效的數值計算,將一些耗時操做放在Python環境的外部來計算(Numpy);

每個操做切換回Python環境時仍須要不小的開銷,這一開銷主要用來進行數據遷移;

TensorFlow將計算過程徹底運行在Python外部;

Tensorflow依賴於一個高效的C++後端來進行計算,並經過session鏈接。先建立一個圖,而後在session中啓動它。

 

任務1代碼:

# -*- coding:utf-8 -*-

import tensorflow as tf
import numpy as np

#生成100個點 numpy默認生成64位
x_data = np.float32(np.random.rand(2, 100))
y_data = np.float32(np.dot([0.1, 0.2], x_data) + 0.3) #矩陣乘法.dot 實際y值

#定義
w = tf.Variable(tf.zeros([1, 2]))
bias = tf.Variable(tf.zeros([1]))
y = tf.matmul(w, x_data) + bias #構建線性方程 matmul矩陣乘法
#損失函數 (目標函數)
loss = tf.reduce_mean(tf.square(y - y_data))
#優化器
optimizer = tf.train.GradientDescentOptimizer(0.5) #梯度降低法 0.5 學習率
train = optimizer.minimize(loss)

init = tf.global_variables_initializer() #全局變量初始化

#構建會話
sess = tf.Session()
sess.run(init)#變量初始化
for i in range(100):
    w1, b1 = sess.run([w, bias])
    print(w1, b1)
    sess.run(train) #模型訓練
sess.close()

 

任務二:SoftMax函數Mnist手寫數字識別

 

任務2代碼:

# -*- coding:utf-8 -*-
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
#當前項目工做路徑下有數據就直接加載,沒有就下載
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) #獨熱編碼表示類別標籤

w = tf.Variable(tf.zeros([784,10]))
#偏置值
bias = tf.Variable(tf.zeros([10]))

#訓練集
x_data = tf.placeholder(tf.float32, [None, 784])
#標籤
y_data = tf.placeholder(tf.float32, [None, 10])
#激活函數
y = tf.nn.softmax(tf.matmul(x_data, w) + bias)

#計算預測結果與實際的誤差 交叉熵
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_data * tf.log(y), axis=1))

#優化算法
optimizer = tf.train.GradientDescentOptimizer(0.5)

train = optimizer.minimize(cross_entropy)

#初始化變量
init = tf.global_variables_initializer()

#構建會話
with tf.Session() as sess:
    sess.run(init)
    for i in range(1000):
        if i%50 == 0: #每訓練50輪打印一次驗證集樣本的預測精度
            # 判斷模型預測值 與實際值是否相等
            pre = tf.equal(tf.argmax(y, axis=1), tf.argmax(y_data, axis=1))  # 每行最大值
            acc = sess.run(pre, feed_dict={x_data: mnist.validation.images, y_data: mnist.validation.labels})  # 驗證集 作驗證
            print(i + 'acc:' + sum(acc) / len(acc))#打印精度

        #隨機選取100個樣本(包含標籤)
        x_s, y_s = mnist.train.next_batch()
        sess.run(train, feed_dict={x_data:x_s, y_data:y_s})#一次訓練

 任務3:手寫數字識別

本身在A4紙上手寫數字並裁剪編號

  

處理流程:

 

 解決方案:

一、SoftMax

二、BP

三、CNN

 

SoftMax解決方案代碼

數據預處理

import cv2
import re,os
import numpy as np


class ImgTrans:
    def __init__(self,path='./images/trainImages/'):
        self.path = path

    def getimgnames(self):
        filenames = os.listdir(self.path)
        imgnames = []
        for i in filenames:
            if re.findall('^\d_\d+\.png$',i)!=[]:
                imgnames.append(i)
        return imgnames

    def getimgdata(self,shape=(28,28)):
        imgnames = self.getimgnames()
        n = len(imgnames)
        M,N = shape
        data = np.zeros([n,M*N],dtype='float32')
        labels = np.zeros([n],dtype='float32')
        for i in range(n):
            img = cv2.imread(self.path+imgnames[i])
            da_new = cv2.resize(img,shape)
            da_new = da_new[:,:,0]/255
            data[i,:] = np.reshape(da_new,[M*N])
            labels[i] = imgnames[i][0]
        return data,labels


# imgtrans = ImgTrans(path='./images/trainImages/')
# data,labels = imgtrans.getimgdata()
# print(data.shape)

模型構建

# -*- coding:utf-8 -*-
import tensorflow as tf
from imgtrans import ImgTrans

path_tr = './images/trainimages/'
path_te = './images/testimages/'
#訓練集 測試集數據與類標籤
data_tr,labels_tr = ImgTrans(path = path_tr).getimgdata()
data_te,labels_te = ImgTrans(path = path_te).getimgdata()#shape=(64,64)
#類標籤轉化爲獨熱編碼
labels_tr,labels_te = tf.one_hot(labels_tr,10), tf.one_hot(labels_te,10)

w = tf.Variable(tf.zeros([784,10]))
bias = tf.Variable(tf.zeros([10])) #偏置值

y = tf.nn.softmax(tf.matmul(data_tr, w) + bias) #激活函數 預測結果

cross_enttropy = tf.reduce_mean(-tf.reduce_sum(labels_tr*tf.log(y), axis=1)) #交叉熵
optimizer = tf.train.GradientDescentOptimizer(0.08) #梯度降低法優化器
train = optimizer.minimize(cross_enttropy) #利用優化器對交叉熵進行優化

init = tf.global_variables_initializer() #全局變量初始化

#構建會話
with tf.Session() as sess:
    sess.run(init)
    labels_tr,labels_te = sess.run([labels_tr, labels_te])
    for i in range(1000):
        if i%50 == 0: #沒訓練50 輪打印一次訓練集樣本的訓練精度
            pre = tf.equal(tf.argmax(y, axis=1), tf.argmax(labels_tr, axis=1))
            acc = sess.run(pre)
            print(i,'acc:',sum(acc)/len(acc))
        sess.run(train)

    #觀察在測試集上的泛化能力
    y = tf.nn.softmax(tf.matmul(data_te,w) + bias)
    pre_te = tf.equal(tf.argmax(y, axis=1), tf.argmax(labels_te, axis=1))
    acc = sess.run(pre_te)
    print('Test acc:', sum(acc) / len(acc))
相關文章
相關標籤/搜索