TensorFlow簡單入門

TENSORFLOW中文文檔(文檔是Python2.7,某些地方要修改,在博客裏改爲3.7了)

00 Intro

基本概念

TensorFlow 是一個編程系統, 使用圖來表示計算任務。 圖中的節點被稱之爲 op (operation 的縮寫)。 一個 op 獲得 0 個或多個 Tensor, 執行計算, 產生 0 個或多個 Tensor。

TF中重要的類:

  • 使用圖 (graph) 來表示計算任務.
  • 在被稱之爲 會話 (Session) 的上下文 (context) 中執行圖.
  • 使用 tensor 表示數據.
  • 通過 變量 (Variable) 維護狀態.
  • 使用 feed 和 fetch 可以爲任意的操作(arbitrary operation) 賦值或者從其中獲取數據.

構建圖

舉個構建一個默認圖的例子,constant與matmul都是op節點

import tensorflow as tf

# 創建一個常量 op, 產生一個 1x2 矩陣. 這個 op 被作爲一個節點加到默認圖中
# 構造器的返回值代表該常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])

# 創建另外一個常量 op, 產生一個 2x1 矩陣.
matrix2 = tf.constant([[2.],[2.]])

# 創建一個矩陣乘法 matmul op , 把 'matrix1' 和 'matrix2' 作爲輸入.
# 返回值 'product' 代表矩陣乘法的結果.
product = tf.matmul(matrix1, matrix2)

構造完成以後,需要用Session會話來啓動圖,run()的參數傳入的即是我們需要取回的op

with tf.Session() as sess:
    result = sess.run(product)
    print(result)

[[12.]]

變量

# 創建一個變量, 初始化爲標量 0.
state = tf.get_variable("counter", initializer=0)

# 創建一個 op(update), 其作用是使 state 增加 1
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

上面就是圖的構建,assgin()用於賦值給state。

# 啓動圖後, 變量必須先經過`初始化` (init) op 初始化,
# 首先必須增加一個`初始化` op 到圖中.
init_op = tf.initialize_all_variables()

# 啓動圖, 運行 op
with tf.Session() as sess:
  # 運行 'init' op
  sess.run(init_op)
  # 打印 'state' 的初始值
  print(sess.run([state, one]))
  # 運行 op, 更新 'state', 並打印 'state'
  for _ in range(3):
    sess.run(update)
    print(sess.run(state))

且從第十行可以看出,還能多個值同時取出。

[0, 1]
1
2
3

佔位符Feed

這個跟Python的argumentParser很像,他的作用很簡單,將input每一輪feed入佔位符中進行圖運行,這對之後分批訓練很有用。

input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1, input2)

with tf.Session() as sess:
  print(sess.run([output], feed_dict={input1:[1.,2.,3.], input2:[4.,5.,6.]}))

[ 4. 10. 18.]

01 MNIST手寫識別

INTRO_MNIST

如果要下載數據集要在這裏下,數據集的內容有寫,首先先讀取數據集,由於tensorflow爲了入門做了點操作方便了很多在讀MNIST數據上,不過其他的就要自己動手分batch分test/train等等了。

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/mnist-data/", one_hot=True)

然後像之前那樣,需要構建模型,這裏做一個簡單的到不能再簡單的神經網絡:

x = tf.placeholder(tf.float32, [None, 784])
w = tf.get_variable('w', [x.shape[-1], 10])
b = tf.get_variable('b', initializer=0.)
y = tf.nn.softmax(tf.matmul(x, w) + b)

無初始化的參數w與偏差b,深度學習經典激勵函數softmax
在這裏插入圖片描述

y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

y_爲真實label,用真實值與得出值做交叉熵作爲損失函數,並用經典的梯度下降優化以0.01學習率學習…就這麼一個train_op完成了。

# 模型評估
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

用平均數來評測模型…然後就可以直接拿去運行了。

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    for i in range(1000):
        batch_xs, batch_ys = mnist.train.next_batch(100)
        sess.run(train_op, feed_dict={x: batch_xs, y_: batch_ys})
        if i % 100 == 0:
            result = sess.run([cross_entropy, accuracy], 
                     feed_dict={x: mnist.test.images, y_:mnist.test.labels})
            print("batch:",i," loss:",result[0],"accuracy:",result[1])
    
    print("accuracy:",sess.run(accuracy, 
                               feed_dict={x: mnist.test.images, y_:mnist.test.labels}))

batch: 0 loss: 34787.844 accuracy: 0.1037
batch: 100 loss: 3675.5537 accuracy: 0.8891
batch: 200 loss: 3767.2817 accuracy: 0.881
batch: 300 loss: 3358.4658 accuracy: 0.9035
batch: 400 loss: 3790.03 accuracy: 0.8845
batch: 500 loss: 3279.187 accuracy: 0.9035
batch: 600 loss: 3204.0613 accuracy: 0.9058
batch: 700 loss: 3137.3442 accuracy: 0.912
batch: 800 loss: 3353.4536 accuracy: 0.9027
batch: 900 loss: 3239.4736 accuracy: 0.9058
accuracy: 0.9104

自此一個神經網絡已經做完了(其實很像是用了普通的線性迴歸)準確度到91%左右就收斂了,似乎效果並不是特別的好。

CONV_MNIST

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章