2018 08 06 建造我們的第乙個神經網路

2021-08-22 15:21:17 字數 3767 閱讀 8627

在 tensorflow 裡定義乙個新增層的函式可以很容易的新增神經層,為之後的新增省下不少時間。神經層裡常見的引數通常有weights、biases和激勵函式。

定義新增神經層的函式def add_layer(),它有四個引數:輸入值、輸入的大小、輸出的大小和激勵函式,我們設定預設的激勵函式是none。

def add_layer(inputs, in_size, out_size, activation_function=none):
接下來是weights和biases。

因為在生成初始引數時,隨機變數(normal distribution)會比全部為0要好很多,所以我們這裡的weights為乙個in_size行, out_size列的隨機變數矩陣。

weights = tf.variable(tf.random_normal([in_size, out_size]))
在機器學習中,biases的推薦值不為0,所以我們這裡是在0向量的基礎上又加了0.1。

biases = tf.variable(tf.zeros([1, out_size]) + 0.1)
下面,我們定義xw_plus_b, 即神經網路未啟用的值。其中,tf.matmul()是矩陣的乘法。

xw_plus_b= tf.matmul(inputs, weights) + biases
當activation_function——激勵函式為none時,輸出就是當前的**值——xw_plus_b,不為none時,就把wx_plus_b傳到activation_function()函式中得到輸出。

if activation_function is none:

outputs = xw_plus_b

else:

outputs = activation_function(xw_plus_b)

return outputs

匯入資料

這裡的x_data和y_data並不是嚴格的一元二次函式的關係,因為我們多加了乙個noise,這樣看起來會更像真實情況。

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

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

y_data = np.square(x_data) - 0.5 + noise

利用佔位符定義我們所需的神經網路的輸入。 tf.placeholder()就是代表佔位符,這裡的none代表無論輸入有多少都可以,因為輸入只有乙個特徵,所以這裡是1。

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

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

接下來就可以開始定義神經層了。 通常神經層都包括輸入層、隱藏層和輸出層。這裡的輸入層只有乙個屬性, 所以我們就只有乙個輸入;隱藏層我們可以自己假設,這裡我們假設隱藏層有10個神經元; 輸出層和輸入層的結構是一樣的,所以我們的輸出層也是只有一層。 所以,我們構建的是——輸入層1個、隱藏層10個、輸出層1個的神經網路。

利用之前的add_layer()函式定義隱藏層,這裡使用 tensorflow 自帶的激勵函式tf.nn.relu。

l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
接著,定義輸出層。此時的輸入就是隱藏層的輸出——l1,輸入有10個神經元(隱藏層的輸出層),輸出有1個神經元。

prediction = add_layer(l1, 10, 1, activation_function=none)
計算**值prediction和真實值的誤差,對二者差的平方取平均。

loss = tf.reduce_mean(tf.square(ys - prediction),

reduction_indices=[1])

接下來,是很關鍵的一步,如何讓機器學習提公升它的準確率。tf.train.gradientdescentoptimizer()中的值通常都小於1,這裡取的是0.1,代表以0.1的效率來最小化誤差loss。

train_step = tf.train.gradientdescentoptimizer(0.1).minimize(loss)
定義session,並用 session 來執行初始化步驟。 (注意:在tensorflow中,只有session.run()才會執行我們定義的運算。)

init = tf.global_variables_initializer()

sess = tf.session()

sess.run(init)

for i in range(1000):

# training

sess.run(train_step, feed_dict=)

if i % 50 == 0:

# to see the step improvement

print(sess.run(loss, feed_dict=))

構建圖形,用散點圖描述真實資料之間的關係。 (注意:這裡是直接在前面的基礎上寫的**,需要from matplot import pyplot as plt,plt.ion()表示開啟互動模式,用於連續顯示。)

# plot the real data

fig = plt.figure()

ax = fig.add_subplot(1,1,1)

ax.scatter(x_data, y_data)

plt.ion() #本次執行請注釋,全域性執行不要注釋

plt.show()

接下來,我們來顯示**資料。每隔50次訓練重新整理一次圖形,用紅色、寬度為5的線來顯示我們的**資料和輸入之間的關係,並暫停0.1s。

for i in range(1000):

# training

sess.run(train_step, feed_dict=)

if i % 50 == 0:

# to visualize the result and improvement

try:

ax.lines.remove(lines[0])

except exception:

pass

prediction_value = sess.run(prediction, feed_dict=)

# plot the prediction

lines = ax.plot(x_data, prediction_value, 'r-', lw=5)

plt.pause(0.1)

tensorflow 中的優化器會有很多不同的種類。最基本, 也是最常用的一種就是gradientdescentoptimizer。一般比較常用的是momentumoptimizer和adamoptimizer。另外,alpha go使用的優化器是rmspropoptimizer。

建造第乙個神經網路

importtensorflowastf defadd layer inputs,in size,out size,activation function none 他有四個引數 輸入值,輸入的大小,輸出的大小,激勵函式 此處設定為none weights tf.variable tf.random...

springboot實戰 我們的第一款開源軟體

在資訊 時代,如何避免持續性資訊過剩,使自己變得專注而不是被紛繁的資訊所累?每天會看到各種各樣的新聞,各種新潮的技術層出不窮,如何篩選出自己所關心的?各位看官會想,我們是來看開源軟體的,你給我扯什麼資訊幹嘛,別著急,聽我慢慢道來。當瀏覽器收藏夾收藏的 或者文章在一百份以內的時候收藏和查詢問題都不是特...

CSDN給我們培訓的第一課

昨天又見到了csdn的老師,好開心啊。這次不僅劉老師來了,而且還給我們帶來了一位資歷幽深幽默風趣的老師 李偉老師。聽著劉老師對 的介紹,並且聽了他給我們講的第一課,我的確看出來 真是乙個幽默風趣的人,並且他有他自己的教學風格,他特別喜歡調侃,用這種方式來使課堂的氣氛永遠是那麼活躍不沉悶,我覺得這正是...