五分鐘搞定Tensorflow
來自專欄 Evereast
介紹
谷歌的Tensorflow是現在世界上最流行的機器學習庫,今天我們看一下如何用40行代碼,來實現看圖識字的功能。
現在幾乎所有的谷歌產品都在使用tensorflow,
比如谷歌翻譯
圖片描述,
圖片搜索和推薦系統。
有三種人,使用機器學習
谷歌希望所有的人,都可以使用,相同的工具,來進行更有效率的合作。
Tensorflow 解決的就是這個問題。
Tensorflow的還有很好的擴展性,可以在多CPU,GPU,甚至移動終端上使用
它支持的語言非常多,使用人數最多的應該是,Python
安裝
首先我們需要安裝Tensorflow
推薦的安裝方法是使用conda
先創建一個Tensorflow 的環境, 名字叫tensorflow
conda create -n tensorflow python=3.6.3
然後activate 這個環境
source activate tensorflow
activate 之後用pip install 來安裝tensorflow, 我們可以在指定安裝特別版本的tensorflow,這裡我安裝了Tensorflow 1.4.1
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.4.1-py3-none-any.whl
安裝好之後,我們可以用一段hello world 的代碼,檢驗一下是否安裝成功
import tensorflow as tfs = tf.constant("hello world")with tf.Session() as sess: sess.run(s)
代碼
下面開始寫代碼
首先第一步,要下載數據,我們的訓練數據是大約5萬張圖片,只需要引用input data,
然後再通過read_data_sets 函數把數據下載到指定目錄
from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets( /Users/yifei/Documents/mnist/data, one_hot=True)
接下來,我們來定義訓練的參數
我們使用邏輯回歸這種傳統模型模型
learning_rate = 0.01 # 學習速率batch_size = 128 # 每次訓練數據量n_epochs = 30 # 一共訓練多少次
首先是學習速率 learning rate, 學習速率是每次更新變數多少的值
白色的曲線是斜率,我們的目標是到達底最低點
就像龜兔賽跑一樣,快有時不一定是好事,
學習速率不能太大,容易錯過最佳點
也不能太小,學習速度太慢,
0.01 是一個常用的值
batch_size = 128 # 每次訓練數據量
第二個參數,batch size 是,每一批數據的大小,因為訓練數據非常大,大約有5萬多,所以分批訓練,一批128個,大約429批
n_epochs = 30 # 一共訓練多少次
最後 epoch 是指訓練的次數,一共訓練30次
Tensorflow 程序分為兩部分,構造運算和運行運算
由於我們使用邏輯回歸,所以 y = weight * X + bias
import tensorflow as tfX = tf.placeholder(tf.float32, [batch_size, 784]) Y = tf.placeholder(tf.int32, [batch_size, 10])
先是引用tensorflow,然後定義X為佔位符,placeholder,
因為我們現在只是構建運算圖,所以不提供任何具體的數據,只要佔位就好了
注意X的大小是784,同樣Y也是佔位符,代表每一張圖片表示的數字 (不是預測的數字,是實際的數字)
Y 的大小是10,因為有0到9,10種可能的結果
with tf.name_scope("Wx_b") as scope: w = tf.Variable(tf.random_normal(shape=[784, 10], stddev=0.01), name=weights) b = tf.Variable(tf.zeros([1, 10]), name="bias") logits = tf.matmul(X, w) + b
定義一個scope Wx_b,scope 使得在Tensorboard可視化的時候,每一部分可以看的更清楚
X * weight + bias, 因為是矩陣相乘所以使用matmul (matrix multiply)
with tf.name_scope("loss") as scope: entropy = tf.nn.softmax_cross_entropy_with_logits( logits=logits, labels=Y, name=loss) loss = tf.reduce_mean(entropy) # 計算誤差的平均值 tf.summary.scalar("loss", loss)
定義loss函數,也就是預測值和實際值的誤差,使用cross entropy而不是簡單的對錯,效果更好
用reduce mean計算所有誤差的平均值
with tf.name_scope("train") as scope: optimizer = tf.train.GradientDescentOptimizer( learning_rate).minimize(loss)
最後定義優化函數,我們使用梯度下降的方式來減少誤差
summary = tf.summary.merge_all()
merge all 把所有總結的圖,都放在一起
運行結束後,在總結圖裡面,可以看到loss隨著訓練減少的過程
下面我們來運行剛才定義好的運算
with tf.Session() as sess: # 在 TensorBoard 上可視化 writer = tf.summary.FileWriter(./graphs/logistic_reg, sess.graph) sess.run(tf.global_variables_initializer()) n_batches = int(mnist.train.num_examples/batch_size)
所有tensorflow的程序運行前都要定義一個session, 在session裡面運行
writer = tf.summary.FileWriter(./graphs/logistic_reg, sess.graph)
指定總結圖的位置,訓練結束後tensorboard 可以從這裡讀取
sess.run(tf.global_variables_initializer())
初始化剛才定義的weight bias 兩個變數
n_batches = int(mnist.train.num_examples/batch_size)
訓練數據多少批,大約是429批
下面我門開始正式的訓練
with tf.Session() as sess: # 在 TensorBoard 上可視化 writer = tf.summary.FileWriter(./graphs/logistic_reg, sess.graph) sess.run(tf.global_variables_initializer()) n_batches = int(mnist.train.num_examples/batch_size) for i in range(n_epochs): # 訓練模型 n_epochs 次 total_loss = 0 for j in range(n_batches): X_batch, Y_batch = mnist.train.next_batch(batch_size) _, loss_batch = sess.run([optimizer, loss], feed_dict={X: X_batch, Y:Y_batch}) total_loss += loss_batch summary_str = sess.run(summary, feed_dict={X: X_batch, Y:Y_batch}) writer.add_summary(summary_str, i * n_batches) print(Average loss epoch {0}: {1}.format(i, total_loss/n_batches))
一共訓練30次
for i in range(n_epochs):
初始化每一次的loss
total_loss = 0
每一次,一批一批訓練
for j in range(n_batches):
在運行session的時候,提供這一批數據的具體值,就是剛才定義placeholder 的具體值
X_batch, Y_batch = mnist.train.next_batch(batch_size) _, loss_batch = sess.run([optimizer, loss], feed_dict={X: X_batch, Y:Y_batch})
我們只需要運行優化函數,optimizer, Tensorflow 會自動更新weight 和bias 兩個變數,把它們優化成最佳值
summary_str = sess.run(summary, feed_dict={X: X_batch, Y:Y_batch})
X_batch的維度是 每一批的大小, 128 , 乘以784 個點
Y_batch 的維度是 每一批的大小, 128, 乘以10
最後我們把每一次訓練的平均誤差列印出來,發現誤差隨著訓練在不斷減小
測試一下,發現準確性達到91%
【機器學習】五分鐘搞定Tensorflow_演講?公開課_科技_bilibili_嗶哩嗶哩Youtube 鏈接
推薦閱讀:
※機器學習入門基礎——邏輯回歸
※看得見的資訊理論-為什麼用交叉熵作為邏輯回歸的代價函數
※kaggle屠龍技--模型融合的學習小結
TAG:TensorFlow | 機器學習 |