1. 程式人生 > >Tensorflow學習系列(一): tensorflow解決問題的思路

Tensorflow學習系列(一): tensorflow解決問題的思路

如需轉載,請註明出處,歡迎加入深度學習群 255568483

Tensorflow的介紹請各位自行google,就不做多的介紹了。

Tensorflow是一個深度學習框架,他和機器學習一樣,有其固定的解決問題的方式。其訓練過程有固定的模式,一般如下:

1.初始化模型引數

2.輸入訓練資料

3.在訓練資料上驗證模型

4.計算損失

5.調整模型引數

重複第2步操作。

解釋:

1.在第一次執行的時候,初始化模型引數。通常我們使用隨機數來代替,或者全部設定為0

2.對每個資料樣本進行訓練,通常會隨機的打亂樣本資料順序

3.在訓練資料上執行模型,根據當前的模型引數計算每次訓練的輸出。

4.計算模型損失,這個主要是用於表明我們的模型與實際模型的偏差有多大。對於不同的模型有不同的損失函式。

5.調整模型引數,這是在學習過程中發生的。根據損失函式,調整模型的引數,通常使用梯度下降演算法來學習。

訓練過程完成以後,就到了評估階段,我們使用測試的資料來驗證輸出,並評估損失。通常的方法是把資料按訓練/測試 70/30或者80/20來劃分資料。

根據以上思路,整理一個解決問題的基本程式碼框架:

import tensorflow as tf


# 定義訓練模型
def inference(X):
    return ''


# 計算損失函式
def loss(X, Y):
    return ''


# 生成訓練資料,通過返回x,y
def inputs():
    return ''


# 根據損失函式訓練模型
def train(total_loss):
    return ''


# 評估訓練模型
def evaluate(sess, X, Y):
    return ''
# 建立一個saver
saver = tf.train.Saver()
# 使用tensorflow進行訓練
with tf.Session() as sess:
    tf.initialize_all_variables().run()
    X, Y = inputs()
    total_loss = loss(X, Y)
    train_op = train(total_loss)
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)
    training_steps = 1000
    for step in range(training_steps):
        sess.run([train_op])
        if step % 10 == 0:
            print("loss: ", sess.run([total_loss]))
            #儲存模型
            saver.save(sess, 'my-model', global_step=step)

    evaluate(sess, X, Y)

    saver.save(sess, 'my-model', global_step=training_steps)

    coord.request_stop()
    coord.join(threads)
    sess.close()

以上是處理問題的一個基本套路,第一步初始化模型的引數,然後定義一個模型,讀取輸入資料(method inputs),訓練模型(method inference),計算損失函式(method loss),調整模型引數(method train),評估訓練模型(method evaluate),然後在tensorflow中執行。

下面通過一個例子來解釋,我們定義一個函式   y=2x+0.5,根據以上函式隨機生成一個含有500個數據的資料集,使用matplotlib顯示如下:


使用tensorflow來擬合此函式,根據以上的程式碼框架來看擬合的函式曲線,如下:


第1次





經過20次的訓練基本上可以滿足要求,看損失函式如下


完整程式碼如下:

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

number_of_points = 300
x_point = []
y_point = []

a = 2
b = 0.5
#y = 2x + 0.5
for i in range(number_of_points):
    x = np.random.normal(0.0,0.5)
    y = a*x + b +np.random.normal(0.0,0.1)
    x_point.append([x])
    y_point.append([y])

plt.plot(x_point,y_point, 'o', label='Input Data')
plt.legend()
plt.show()

####################################

A = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))

# 定義訓練模型
def inference(x):
    return A * x + b


# 計算損失函式
def loss(x, y):
    y_predicted = inference(x)
    return tf.reduce_sum(tf.squared_difference(y, y_predicted))


# 生成訓練資料,通過返回x,y
def inputs():
    return tf.to_float(x_point), tf.to_float(y_point)


# 根據損失函式訓練模型
def train(total_loss):
    learning_rate = 0.001
    return tf.train.GradientDescentOptimizer(learning_rate).minimize(total_loss)


# 評估訓練模型
# y = 2x + 0.5
def evaluate(sess):
    print('evaluate>>>>>>>>>',sess.run(inference([[0.3]])))
    print('evaluate>>>>>>>>>',sess.run(inference([[0.4]])))

# 建立一個saver
saver = tf.train.Saver()
# 使用tensorflow進行訓練
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    x, y = inputs()
    total_loss = loss(x, y)
    train_op = train(total_loss)
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)
    training_steps = 21
    for step in range(training_steps):
        sess.run([train_op])
        if step % 5 == 0:
            print("loss: ", sess.run([total_loss]))
            #儲存模型
            saver.save(sess, 'model/my-model', global_step=step)
            plt.plot(x_point, y_point, 'o', label='step = {}'.format(step))
            plt.plot(x_point, sess.run(A) * x_point + sess.run(b))
            plt.legend()
            plt.show()

    evaluate(sess)

    saver.save(sess, 'model/my-model', global_step=training_steps)

    coord.request_stop()
    coord.join(threads)
    sess.close()


以上程式碼執行環境為tensorflow1.0,

歡迎加入深度學習群 255568483