使用Tensorflow實(shí)現(xiàn)第一個(gè)神經(jīng)網(wǎng)絡(luò)吧!

本文使用的tensorlow版本:1.4
tensorlow安裝:pip install tensorflow

1、神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)

今天我們要使用tensorflow實(shí)現(xiàn)一個(gè)簡單的神經(jīng)網(wǎng)絡(luò),用神經(jīng)網(wǎng)絡(luò)來預(yù)測 y = x^2 - 0.5,
網(wǎng)絡(luò)的結(jié)構(gòu)很簡單,輸入層和輸出層都只有一個(gè)神經(jīng)元,而隱藏層有10個(gè)神經(jīng)元。

2、實(shí)現(xiàn)步驟詳解

定義網(wǎng)絡(luò)結(jié)構(gòu)
首先我們使用一個(gè)函數(shù)來定義網(wǎng)絡(luò)的一層,輸入的參數(shù)是該層輸入,輸入數(shù)據(jù)的大小,輸出數(shù)據(jù)的大小,以及使用的激活函數(shù),激活函數(shù)在默認(rèn)情況下是None,即不適用激活函數(shù):

def add_layer(inputs,in_size,out_size,activation_function=None):
    Weights = tf.Variable(tf.random_normal([in_size,out_size]))
    biases = tf.Variable(tf.zeros([1,out_size])+0.1)
    Wx_plus_b = tf.add(tf.matmul(inputs,Weights),biases)
    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)
    return outputs

生成訓(xùn)練數(shù)據(jù)
這里,我們生成300*1的x,然后增加一點(diǎn)噪聲noise,通過y = x^2 - 0.5+noise來生成y :

x_data = np.linspace(-1,1,300)[:,np.newaxis]
noise = np.random.normal(0,0.05,x_data.shape).astype(np.float32)
y_data = np.square(x_data) - 0.5 + noise

構(gòu)建網(wǎng)絡(luò)
這里,我們定義輸入層-隱藏層-輸出層的三層神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),其中輸入層和輸出層僅有一個(gè)神經(jīng)元,而隱藏層有10個(gè)神經(jīng)元。同時(shí),我們定義我們的損失是平方損失函數(shù),通過梯度下降法來最小化我們的損失。

#None表示給多少個(gè)sample都可以
xs = tf.placeholder(tf.float32,[None,1])
ys = tf.placeholder(tf.float32,[None,1])

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

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

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

在計(jì)算平方損失的時(shí)候,我們先使用tf.reduce_sum來計(jì)算了每一個(gè)樣本點(diǎn)的損失,注意這里的參數(shù) reduction_indices=[1],這表明我們是在第1維上運(yùn)算,這跟numpy或者DataFrame的運(yùn)算類似,具體1的含義看下圖:

定義Session并訓(xùn)練
在定義好我們的神經(jīng)網(wǎng)絡(luò)之后,我們就可以使用Session來進(jìn)行訓(xùn)練啦,這里千萬不要忘記要對變量進(jìn)行初始化喲!

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    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}))

3、完整代碼

實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的完整代碼如下:

import tensorflow as tf
import numpy as np


def add_layer(inputs,in_size,out_size,activation_function=None):
    Weights = tf.Variable(tf.random_normal([in_size,out_size]))
    biases = tf.Variable(tf.zeros([1,out_size])+0.1)
    Wx_plus_b = tf.add(tf.matmul(inputs,Weights),biases)
    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)
    return outputs


x_data = np.linspace(-1,1,300)[:,np.newaxis]
noise = np.random.normal(0,0.05,x_data.shape).astype(np.float32)
y_data = np.square(x_data) - 0.5 + noise

#None表示給多少個(gè)sample都可以
xs = tf.placeholder(tf.float32,[None,1])
ys = tf.placeholder(tf.float32,[None,1])

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

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

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

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    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}))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 遇見一個(gè)你愿意為之改變的ta,那么ta本身是一個(gè)偉大的存在,也是你的幸運(yùn)之所在。
    Miss醬閱讀 103評論 0 1
  • 春節(jié)回老家,見了久違的母親。母親依然年輕美麗,笑容溫暖而謙和。 也許是新年的緣故,母親穿了一件新衣,仍然是她喜歡的...
    紫陌輕煙閱讀 250評論 1 2
  • 紛紛揚(yáng)揚(yáng)的一場大雪灑落京城,大雪過后,留下的白茫茫的一片,便是上蒼賜予人們的禮物,看雪賞雪確實(shí)詩情畫意,但是,掃雪...
    釋然andy閱讀 417評論 0 0
  • ①:先搞清兩者的關(guān)系,NSOpertaionQueue是基于GCD的OC封裝. ②:GCD僅僅支持先入先出隊(duì)列,而...
    tdwydan1閱讀 282評論 2 3

友情鏈接更多精彩內(nèi)容