五分鐘搞定Tensorflow

五分鐘搞定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隨著訓練減少的過程

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_嗶哩嗶哩?

www.bilibili.com圖標

Youtube 鏈接

推薦閱讀:

機器學習入門基礎——邏輯回歸
看得見的資訊理論-為什麼用交叉熵作為邏輯回歸的代價函數
kaggle屠龍技--模型融合的學習小結

TAG:TensorFlow | 機器學習 |