用Tensorflow搭建第一个神经网络
生活随笔
收集整理的這篇文章主要介紹了
用Tensorflow搭建第一个神经网络
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簡(jiǎn)述
https://blog.csdn.net/a19990412/article/details/82913189
根據(jù)上面鏈接中的前兩個(gè)學(xué)習(xí)教程學(xué)習(xí)
其中Mofan大神的例子非常好,學(xué)到了很多
https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/3-2-create-NN/
搭建這個(gè)神經(jīng)網(wǎng)絡(luò)
其實(shí)是從一個(gè)層到10層再到10層的這樣的一個(gè)神經(jīng)網(wǎng)絡(luò)。(畫(huà)圖丑。。。求諒解。。就別私戳了)
解析
- 初始的輸入的矩陣為:[[1],300個(gè),[-1]] 大致這樣的
- 在增加一層的那個(gè)函數(shù)中,最為經(jīng)典的地方是,偏置(biases)的第一個(gè)維度必須選為1。看下面推理。
- 第一部分:
- 輸入為:(300*1)的矩陣,之后,經(jīng)過(guò)了第一個(gè)層,就是(300 * 1)* (1*10) + (1, 10)。這顯然是合理的,每一層的數(shù)據(jù),到神經(jīng)網(wǎng)絡(luò)中的中間層的每一個(gè)節(jié)點(diǎn)上,然后每個(gè)節(jié)點(diǎn)上都加一個(gè)偏置biases。
就是在每個(gè)上都同時(shí)加,通過(guò)下面的例子就可以看出來(lái)。
>>> import numpy as np >>> a = np.random.normal(0, 1, (2, 4)) >>> a array([[-0.60675395, -0.06779251, 1.50473051, -0.82511157],[ 1.14550373, 0.372316 , 0.45110457, -0.41554109]]) >>> b = np.random.normal(0, 1, (1, 4)) >>> b array([[ 0.48946834, -0.70514578, 2.12102107, -0.25960606]]) >>> a + b array([[-0.11728561, -0.77293828, 3.62575157, -1.08471763],[ 1.63497208, -0.33282978, 2.57212564, -0.67514715]]) >>>- 第二部分:
- 輸出的內(nèi)容為上面的輸出:(300*10)的矩陣。
- 進(jìn)行的計(jì)算為:(300 * 10) * (10 * 1) + (1, 1) 后面的那個(gè)為偏置,每個(gè)都加上了這樣的一個(gè)偏置。
經(jīng)過(guò)上面的推理,我們就可以理解了為什么中間添加新的一層的時(shí)候,需要將biases的第一次參數(shù)為1
- 發(fā)現(xiàn)寫(xiě)tensorflow就想當(dāng)于寫(xiě)數(shù)學(xué)公式一樣,怪不得TensorFlow在研究數(shù)學(xué)的老師那邊那么容易上手 hhh
代碼
import tensorflow as tf import numpy as np# TensorFlow嫌棄了我這臺(tái)電腦的CPU(我這就避免了警報(bào)) # ================== import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # ==================# 創(chuàng)建一些等距離的數(shù)據(jù)(數(shù)據(jù)量為300),同時(shí)用np.newaxis進(jìn)行擴(kuò)展一個(gè)維度 x_data = np.linspace(-1, 1, 300, dtype=np.float32)[:, np.newaxis] # 創(chuàng)建同等規(guī)模的噪音(這里采用的是均值為0,標(biāo)準(zhǔn)差為0.05的,保持shape和類型一致) noise = np.random.normal(0, 0.05, x_data.shape).astype(np.float32) # 原數(shù)據(jù)label(y = x^2 - 0.5) 之后添加一點(diǎn)點(diǎn)噪聲(讓人感覺(jué)更像現(xiàn)實(shí)中獲取的數(shù)據(jù)一樣) y_data = np.square(x_data) - 0.5 + noise# 創(chuàng)建一個(gè)添加層數(shù)的函數(shù),使得實(shí)現(xiàn)變得簡(jiǎn)單 # inputs是輸出的東西,in_size表示的是該層的輸入層維度,out_size表示的是該層的輸出層維度,activation_function就是一個(gè) def add_layer(inputs, in_size, out_size, activation_function=None):# 創(chuàng)建系數(shù)矩陣,矩陣規(guī)模為 [in_size * out_size]Weights = tf.Variable(tf.random_normal([in_size, out_size]))# 創(chuàng)建一個(gè)biases矩陣,這里考慮到biases用0不是那么好,所以,一開(kāi)始設(shè)置的時(shí)候加個(gè)0.1biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)# 構(gòu)建方程Wx_plus_b = tf.matmul(inputs, Weights) + biasesif activation_function == None:output = Wx_plus_belse:output = activation_function(Wx_plus_b)return outputxs = 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) # 在300個(gè)求一個(gè)平方和的均值,設(shè)置了切片的index為1,原因是最后的矩陣規(guī)模為300*1,大致類似:[[1],300個(gè),[2]] loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),reduction_indices=[1])) # 梯度下降訓(xùn)練 train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 變量初始化 init = tf.global_variables_initializer() # 啟動(dòng)會(huì)話 with tf.Session() as sess:sess.run(init)for i in range(1000):# trainingsess.run(train_step, feed_dict={xs: x_data, ys: y_data})if i % 50 == 0:# to see the step improvementprint(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))附上有圖形演示的代碼
由于不同起始數(shù)據(jù),畫(huà)出幾個(gè)不同的結(jié)果。下面列舉其中的兩個(gè)
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt # TensorFlow嫌棄了我這臺(tái)電腦的CPU(我這就避免了警報(bào)) # ================== import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # ==================# 創(chuàng)建一些等距離的數(shù)據(jù)(數(shù)據(jù)量為300),同時(shí)用np.newaxis進(jìn)行擴(kuò)展一個(gè)維度 x_data = np.linspace(-1, 1, 300, dtype=np.float32)[:, np.newaxis] # 創(chuàng)建同等規(guī)模的噪音(這里采用的是均值為0,標(biāo)準(zhǔn)差為0.05的,保持shape和類型一致) noise = np.random.normal(0, 0.05, x_data.shape).astype(np.float32) # 原數(shù)據(jù)label(y = x^2 - 0.5) 之后添加一點(diǎn)點(diǎn)噪聲(讓人感覺(jué)更像現(xiàn)實(shí)中獲取的數(shù)據(jù)一樣) y_data = np.square(x_data) - 0.5 + noise# 創(chuàng)建一個(gè)添加層數(shù)的函數(shù),使得實(shí)現(xiàn)變得簡(jiǎn)單 # inputs是輸出的東西,in_size表示的是該層的輸入層維度,out_size表示的是該層的輸出層維度,activation_function就是一個(gè) def add_layer(inputs, in_size, out_size, activation_function=None):# 創(chuàng)建系數(shù)矩陣,矩陣規(guī)模為 [in_size * out_size]Weights = tf.Variable(tf.random_normal([in_size, out_size]))# 創(chuàng)建一個(gè)biases矩陣,這里考慮到biases用0不是那么好,所以,一開(kāi)始設(shè)置的時(shí)候加個(gè)0.1biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)# 構(gòu)建方程Wx_plus_b = tf.matmul(inputs, Weights) + biasesif activation_function == None:output = Wx_plus_belse:output = activation_function(Wx_plus_b)return outputxs = 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) # 在300個(gè)求一個(gè)平方和的均值,設(shè)置了切片的index為1,原因是最后的矩陣規(guī)模為300*1,大致類似:[[1],300個(gè),[2]] loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),reduction_indices=[1])) # 梯度下降訓(xùn)練 train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 變量初始化 init = tf.global_variables_initializer() # 啟動(dòng)會(huì)話 with tf.Session() as sess:sess.run(init)fig = plt.figure()# 創(chuàng)建兩個(gè)子圖ax_begin = fig.add_subplot(2, 1, 1)ax_end = fig.add_subplot(2, 1, 2)ax_begin.scatter(x_data, y_data)ax_end.scatter(x_data, y_data)# 起始版prediction_value = sess.run(prediction, feed_dict={xs: x_data})# plot the predictionax_begin.plot(x_data, prediction_value, 'r-', lw=5)ax_begin.set_title("Begin")plt.tight_layout()for i in range(1000):# trainingsess.run(train_step, feed_dict={xs: x_data, ys: y_data})if i % 50 == 0:# to see the step improvementprint(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))# 經(jīng)過(guò)迭代后的版本prediction_value = sess.run(prediction, feed_dict={xs: x_data})# plot the predictionax_end.plot(x_data, prediction_value, 'r-', lw=5)ax_end.set_title("End")plt.show()總結(jié)
以上是生活随笔為你收集整理的用Tensorflow搭建第一个神经网络的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用TensorFlow训练第一个模型
- 下一篇: R语言安装包