tensorflow3 非线性回归、mnist、简单神经网络
生活随笔
收集整理的這篇文章主要介紹了
tensorflow3 非线性回归、mnist、简单神经网络
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
mnist數(shù)據(jù)集
- 手寫數(shù)字的數(shù)據(jù)集。
- 60000行訓(xùn)練數(shù)據(jù)集,10000行測試數(shù)據(jù)集
- 下載地址:http://yann.lecun.com/exdb/mnist/index.html
- mnist數(shù)據(jù)集是形狀為[60000,784]的張量,60000張圖片,每個(gè)圖片有784個(gè)像素點(diǎn),這些個(gè)像素點(diǎn)可以分為如圖的矩陣。
圖中是5041的圖
- 標(biāo)簽格式
如圖是5041的標(biāo)簽
神經(jīng)網(wǎng)絡(luò)構(gòu)建
- 輸入層784(28*28),輸出層10
- 即是分成10類。
- 這是簡單的結(jié)構(gòu),如果加上中間層效果會(huì)好一點(diǎn)。
sofmax
?e=2.718
?所以e的一次方等于2.718。exp(1)=2.718。
?也就是說輸出為1,就是x1=1
- 輸出結(jié)果為[1,5,3]是什么意思?
?意思為:標(biāo)簽為0的得分為1,標(biāo)簽為1的得分為5,標(biāo)簽為3的得分為3
?輸出寫全了是[1 5 3 0 0 0 0 0 0 0 ]與十個(gè)輸出神經(jīng)元相對應(yīng)或者說與標(biāo)簽相對應(yīng)。 - 通常用在分類的最后一層,將結(jié)果轉(zhuǎn)化為概率
3-1 非線性回歸的例子
各種函數(shù)的解釋,tanh函數(shù)
-
列是神經(jīng)元的個(gè)數(shù)
- 輸入x,是一個(gè)數(shù),所以輸入神經(jīng)元只有一個(gè),列為1
- 中間層10個(gè)神經(jīng)元,列為10
- 中間層為什么是10個(gè)???
- 多少應(yīng)該都可以吧 ,但是要改變W、b的形狀來讓最后結(jié)果變成一列
- 中間層為什么是10個(gè)???
- 輸出y,也是一個(gè)數(shù),所以輸出神經(jīng)元也只有一個(gè),列為1
-
行是輸入的數(shù)據(jù)的數(shù)量。
-
權(quán)值初始隨機(jī)數(shù),偏移初始值0
-
計(jì)算公式為L1=x * W1+b1,prediction=L1 * W2+b2
-
prediction是預(yù)測的y值
import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt# 造數(shù)據(jù)# 200行一列# 使用numpy生成200個(gè)隨機(jī)點(diǎn)x_data=np.linspace(-0.5,0.5,200)#這個(gè)是200列一行的數(shù)組,在-0.5到+0.5之間返回200個(gè)數(shù)字,均勻間隔x_data=x_data[:,np.newaxis]#變成了200行一列,np.newaxis=1這樣看,實(shí)際上打出來是none。#np.newaxis的作用就是在這一位置增加一個(gè)一維,這一位置指的是np.newaxis所在的位置,比較抽象,需要配合例子理解。此種就是第二維noise=np.random.normal(0,0.02,x_data.shape)y_data=np.square(x_data)+noise# 定義兩個(gè)placeholder#輸入輸出一個(gè)神經(jīng)元,所以一列,中間層十個(gè)神經(jīng)元,所以10列x=tf.placeholder(tf.float32,[None,1])#不定行,確定列只有一列y=tf.placeholder(tf.float32,[None,1])#簡單神經(jīng)網(wǎng)絡(luò)#定義個(gè)中間層,中間層10個(gè)神經(jīng)元Weights_L1=tf.Variable(tf.random_normal([1,10]))biases_L1=tf.Variable(tf.zeros([1,10]))#200*1的矩陣x,和1*10的矩陣Weights_L1的乘積為(200,10)+(1,10)=(200,10)。每一行單獨(dú)與biases_L1相加。Wx_plus_b_L1=tf.matmul(x,Weights_L1)+biases_L1L1=tf.nn.tanh(Wx_plus_b_L1)#中間層的輸出#定義神經(jīng)網(wǎng)絡(luò)輸出層,只有一個(gè)神經(jīng)元,但是是一個(gè)10個(gè)數(shù)字的數(shù)組Weights_L2=tf.Variable(tf.random_normal([10,1]))biases_L2=tf.Variable(tf.zeros([1,1]))# 矩陣形狀變化(200,10)*(10,1)=(200,1),(200,1)+(1,1)依然每行單獨(dú)相加。因?yàn)橐恍惺且粋€(gè)數(shù)據(jù)。Wx_plus_b_L2=tf.matmul(L1,Weights_L2)+biases_L2prediction=tf.nn.tanh(Wx_plus_b_L2)# 二次代價(jià)函數(shù)loss=tf.reduce_mean(tf.square(y-prediction))#使用梯度下降法訓(xùn)練train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)with tf.Session() as sess:# 變量初始化sess.run(tf.global_variables_initializer())for _ in range(2000):print(sess.run(train_step,feed_dict={x:x_data,y:y_data}))L11,pre=sess.run([L1,prediction], feed_dict={x: x_data, y: y_data})print(L11.shape)print(pre.shape)#獲得預(yù)測值prediction_value=sess.run(prediction,feed_dict={x:x_data})#畫圖plt.figure()plt.scatter(x_data,y_data)#散點(diǎn)圖plt.plot(x_data,prediction_value,'r-',lw=5)#實(shí)線plt.show()
查看數(shù)據(jù)實(shí)際值的方法
L11,pre=sess.run([L1,prediction], feed_dict={x: x_data, y: y_data}) print(L11.shape) print(pre.shape)PS
??要求a的行數(shù)與b的列數(shù)相同。a為x * z的矩陣,b為z * y的矩陣。結(jié)果為x*y的矩陣
3-2 mnist數(shù)據(jù)集分類-簡單版本
- one-hot:把標(biāo)簽轉(zhuǎn)化為只有0,1的形式,某一位是1則為某個(gè)
- 把數(shù)據(jù)集放到這個(gè)位置,也可以直接網(wǎng)絡(luò)下載
常見數(shù)據(jù)說明
- batch_size:批次大小,這里是一次性向神經(jīng)網(wǎng)絡(luò)里輸入多少張圖片。一個(gè)批次里有多少張圖片。
- n_batch:有時(shí)是num_batches。將全部的圖片分為多少批次。
- epoch:迭代次數(shù),整體循環(huán)的次數(shù),訓(xùn)練多少次。
- 一次輸入的矩陣:(batch_size,輸入層神經(jīng)元數(shù)目)
- 輸入層神經(jīng)元數(shù)目:輸入矩陣的列數(shù),一個(gè)輸入序列的長度,這里是一個(gè)圖片的像素點(diǎn)數(shù)784。
- 實(shí)際圖片是28*28的矩陣,這里直接用序列表示,就是784的一維數(shù)組
- 輸入層神經(jīng)元數(shù)目:輸入矩陣的列數(shù),一個(gè)輸入序列的長度,這里是一個(gè)圖片的像素點(diǎn)數(shù)784。
- 一次輸出的矩陣:(batch_size,輸出層神經(jīng)元數(shù)目)
- 輸出層神經(jīng)元數(shù)目:輸出矩陣的列數(shù),一個(gè)輸出序列的長度,這里是圖片的標(biāo)簽的序列的長度10.
用到的函數(shù)
- tf.equal 比較兩個(gè)參數(shù)的大小是否一樣。
- tf.argmax(y,1)y中取值最大的在哪個(gè)位置。index。第二個(gè)參數(shù)是維度,axis=1即代表在第二維度,列上最大
- tf.cast(correct_prediction,tf.float32)改變格式
- tf.reduce_mean求個(gè)平均值得到準(zhǔn)確率
最終代碼
import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data#載入數(shù)據(jù)集--這個(gè)是通過網(wǎng)絡(luò)下載的,也可直接下載放到當(dāng)前目錄下mnist=input_data.read_data_sets("MNIST_data",one_hot=True)print(mnist)# 每個(gè)批次的大小batch_size=100#一次性向神經(jīng)網(wǎng)絡(luò)中輸入100張圖片,以矩陣形式放入#計(jì)算一共有多少個(gè)批次,也叫epoch,mnist.train.num_examples是總共的圖片數(shù),n_batch=mnist.train.num_examples // batch_size# 兩個(gè)placeholderx=tf.placeholder(tf.float32,[None,784])#None會(huì)隨著輸入的數(shù)據(jù)而變,因?yàn)槊總€(gè)批次是100,所以這里會(huì)變成100。每個(gè)圖片的是784個(gè)像素點(diǎn),是長為784的序列y=tf.placeholder(tf.float32,[None,10])# 創(chuàng)建一個(gè)簡單的神經(jīng)網(wǎng)絡(luò),直接784投影到10上W=tf.Variable(tf.zeros([784,10]))b=tf.Variable(tf.zeros(10))#b的形狀依據(jù)每個(gè)批次的形狀而定,在中間層時(shí),每個(gè)批次未必是一行n列,也可能變換成多行多列,此時(shí)b隨之改變。prediction=tf.nn.softmax(tf.matmul(x,W)+b)#(形狀(100,10)# 二次代價(jià)函數(shù)loss=tf.reduce_mean(tf.square(y-prediction))train_step=tf.train.GradientDescentOptimizer(0.20).minimize(loss)# 初始化init=tf.global_variables_initializer()# 比較兩個(gè)參數(shù)的大小是否一樣:tf.equal# tf.argmax(y,1)y中取值最大的在哪個(gè)位置。index。第二個(gè)參數(shù)是維度,axis=1即代表在第二維度,列上最大# 整體結(jié)果是個(gè)bool形列表correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))# 求準(zhǔn)確率# tf.cast(correct_prediction,tf.float32)改變格式# tf.reduce_mean求個(gè)平均值得到準(zhǔn)確率accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))with tf.Session() as sess:sess.run(init)for epoch in range(21):#每次迭代都要對所有數(shù)據(jù)處理一次for batch in range(n_batch):#每個(gè)批次的輸入batch_xs,batch_ys=mnist.train.next_batch(batch_size)sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys})print(sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels}))總結(jié)
以上是生活随笔為你收集整理的tensorflow3 非线性回归、mnist、简单神经网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2 操作系统第一章 操作系统体系结构、中
- 下一篇: 多生产者-多消费者问题