1. 程式人生 > >用tensorflow建造一個簡單的神經網路

用tensorflow建造一個簡單的神經網路

定義一個新增層神經層函式

我們知道一個神經網路可能包含很多個隱藏層,所以如果我們定義一個新增層函式,在後面如果需要增加神經層就只需要呼叫我們定義的新增層函式就可以了。神經層裡常見的引數通常有:weights,biases和激勵函式
首先匯入tensorflow模組和numpy,然後定義新增神經層函式def add_layer(),這裡有四個引數,輸入值,輸入值的大小,輸出值的大小,激勵函式,這裡可以設定激勵函式預設為None。

import tensorflow as tf

def add_layer(inputs, in_size, out_size, activation_function=None)
:

接下來我們開始定義weights和biases,這兩個都需要我們生成初始引數,而後經過訓練來調整引數。這裡的weights定義為一個in_size行,out_size列的隨機變數(normal distribution)矩陣。

Weights = tf.Variable(tf.random_uniform([in_size, out_size]))

在機器學習中,biases的推薦值不為0,所以我們在0向量的基礎上加0.1

biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)

接下來我們定義神經網路未啟用的值,定義為Wx_plus_b

Wx_plus_b = tf.matmul(input, Weights) + biases

當激勵函式為預設值None時,此時為liner function,所以直接輸出Wx_plus_b。當激勵函式存在時,需要將Wx_plus_b傳入的激勵函式中然後輸出並且返回輸出結果。

    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)
    return outputs

這樣我們的新增層函式就定義好了。

要對神經網路進行訓練就一定要有輸入的資料集,現在我們來定義輸入資料,這裡一個值域為-1到+1期間的300個數據,為300*1的形式,

x_data = np.linspace(-1, 1, 300)[:, np.newaxis]

然後定義一個與x_data形式一樣的噪音點,使得我們進行訓練的資料更像是真實的資料

noise = np.random.normal(0, 0.05, x_data.shape)

定義y_data,假設為x_data的平方減去噪音點

noise = np.random.normal(0, 0.05, x_data.shape)

定義placeholder, 引數中none表示輸入多少個樣本都可以,x_data的屬性為1,所以輸出也為1

xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])

我們定義一個最簡單的神經網路,一個輸入層,一個隱藏層和一個輸出層,隱藏層
我們假設只給10個神經元,輸入層是有多少個屬性就有多少個神經元,我們的x_data只有一個屬性,所以只有一個神經元,輸出層與輸入層是一樣的,輸入層有多少個神經元輸出層就有多少個。這裡激勵函式用的是卷積神經網路中最常用的relu。

l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)

輸出層接受到的data是l1輸出的,inputsize為隱藏層的size,輸出層的size是1

prediction = add_layer(l1, 10, 1, activation_function=None)

計算預測值與真實值的差異。

loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
                                    reduction_indices=[1]))

接下來就可以訓練我們的資料了,使神經網路從我們的樣本點通過誤差來學習。這裡的優化函式使用GD去減小誤差,學習率假設為0.1,通常學習率都為小於1的數

train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

對所有的變數初始化

init = tf.global_variables_initializer()

定義session

sess = tf.Session()
sess.run(init)

最後讓我們的神經網路訓練1000次,每隔50次打印出來loss

for i in range(1000):
    sess.run(train_step, feed_dict={xs:x_data, ys:y_data})
    if i % 50 == 0:
        print(sess.run(loss, feed_dict={xs: x_data, ys:y_data}))

這樣一個簡單的神經網路就完成了。
這裡寫圖片描述
這裡是我們的執行結果,從結果中可以看出開始loss很大,經過訓練loss逐漸減小,到最後loss只有0.0013567087已經很接近真實值了。