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/函數
計算模型:計算圖
數據模型:張量(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()
# -*- 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})#一次訓練
本身在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))