本文使用的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}))