mnist数据集
- 手写数字的数据集。
- 60000行训练数据集,10000行测试数据集
- 下载地址:http://yann.lecun.com/exdb/mnist/index.html
- mnist数据集是形状为[60000,784]的张量,60000张图片,每个图片有784个像素点,这些个像素点可以分为如图的矩阵。
图中是5041的图
- 标签格式
如图是5041的标签
神经网络构建
- 输入层784(28*28),输出层10
- 即是分成10类。
- 这是简单的结构,如果加上中间层效果会好一点。
sofmax
e=2.718
所以e的一次方等于2.718。exp(1)=2.718。
也就是说输出为1,就是x1=1
- 输出结果为[1,5,3]是什么意思?
意思为:标签为0的得分为1,标签为1的得分为5,标签为3的得分为3
输出写全了是[1 5 3 0 0 0 0 0 0 0 ]与十个输出神经元相对应或者说与标签相对应。 - 通常用在分类的最后一层,将结果转化为概率
3-1 非线性回归的例子
各种函数的解释,tanh函数
-
列是神经元的个数
- 输入x,是一个数,所以输入神经元只有一个,列为1
- 中间层10个神经元,列为10
- 中间层为什么是10个???
- 多少应该都可以吧 ,但是要改变W、b的形状来让最后结果变成一列
- 中间层为什么是10个???
- 输出y,也是一个数,所以输出神经元也只有一个,列为1
-
行是输入的数据的数量。
-
权值初始随机数,偏移初始值0
-
计算公式为L1=x * W1+b1,prediction=L1 * W2+b2
-
prediction是预测的y值
import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt# 造数据# 200行一列# 使用numpy生成200个随机点x_data=np.linspace(-0.5,0.5,200)#这个是200列一行的数组,在-0.5到+0.5之间返回200个数字,均匀间隔x_data=x_data[:,np.newaxis]#变成了200行一列,np.newaxis=1这样看,实际上打出来是none。#np.newaxis的作用就是在这一位置增加一个一维,这一位置指的是np.newaxis所在的位置,比较抽象,需要配合例子理解。此种就是第二维noise=np.random.normal(0,0.02,x_data.shape)y_data=np.square(x_data)+noise# 定义两个placeholder#输入输出一个神经元,所以一列,中间层十个神经元,所以10列x=tf.placeholder(tf.float32,[None,1])#不定行,确定列只有一列y=tf.placeholder(tf.float32,[None,1])#简单神经网络#定义个中间层,中间层10个神经元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)。每一行单独与biases_L1相加。Wx_plus_b_L1=tf.matmul(x,Weights_L1)+biases_L1L1=tf.nn.tanh(Wx_plus_b_L1)#中间层的输出#定义神经网络输出层,只有一个神经元,但是是一个10个数字的数组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)依然每行单独相加。因为一行是一个数据。Wx_plus_b_L2=tf.matmul(L1,Weights_L2)+biases_L2prediction=tf.nn.tanh(Wx_plus_b_L2)# 二次代价函数loss=tf.reduce_mean(tf.square(y-prediction))#使用梯度下降法训练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)#获得预测值prediction_value=sess.run(prediction,feed_dict={x:x_data})#画图plt.figure()plt.scatter(x_data,y_data)#散点图plt.plot(x_data,prediction_value,'r-',lw=5)#实线plt.show()
查看数据实际值的方法
L11,pre=sess.run([L1,prediction], feed_dict={x: x_data, y: y_data})
print(L11.shape)
print(pre.shape)
PS
- tf.multiply()两个矩阵中对应元素各自相乘
- tf.matmul()将矩阵a乘以矩阵b,生成a * b。
要求a的行数与b的列数相同。a为x * z的矩阵,b为z * y的矩阵。结果为x*y的矩阵 - b的形状依据每个批次的形状而定,在中间层时,每个批次未必是一行n列,也可能变换成多行多列,此时b随之改变。b1(1,10),b2(1,1)
3-2 mnist数据集分类-简单版本
- one-hot:把标签转化为只有0,1的形式,某一位是1则为某个
- 把数据集放到这个位置,也可以直接网络下载
常见数据说明
- batch_size:批次大小,这里是一次性向神经网络里输入多少张图片。一个批次里有多少张图片。
- n_batch:有时是num_batches。将全部的图片分为多少批次。
- epoch:迭代次数,整体循环的次数,训练多少次。
- 一次输入的矩阵:(batch_size,输入层神经元数目)
- 输入层神经元数目:输入矩阵的列数,一个输入序列的长度,这里是一个图片的像素点数784。
- 实际图片是28*28的矩阵,这里直接用序列表示,就是784的一维数组
- 输入层神经元数目:输入矩阵的列数,一个输入序列的长度,这里是一个图片的像素点数784。
- 一次输出的矩阵:(batch_size,输出层神经元数目)
- 输出层神经元数目:输出矩阵的列数,一个输出序列的长度,这里是图片的标签的序列的长度10.
用到的函数
- tf.equal 比较两个参数的大小是否一样。
- tf.argmax(y,1)y中取值最大的在哪个位置。index。第二个参数是维度,axis=1即代表在第二维度,列上最大
- tf.cast(correct_prediction,tf.float32)改变格式
- tf.reduce_mean求个平均值得到准确率
最终代码
import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data#载入数据集--这个是通过网络下载的,也可直接下载放到当前目录下mnist=input_data.read_data_sets("MNIST_data",one_hot=True)print(mnist)# 每个批次的大小batch_size=100#一次性向神经网络中输入100张图片,以矩阵形式放入#计算一共有多少个批次,也叫epoch,mnist.train.num_examples是总共的图片数,n_batch=mnist.train.num_examples // batch_size# 两个placeholderx=tf.placeholder(tf.float32,[None,784])#None会随着输入的数据而变,因为每个批次是100,所以这里会变成100。每个图片的是784个像素点,是长为784的序列y=tf.placeholder(tf.float32,[None,10])# 创建一个简单的神经网络,直接784投影到10上W=tf.Variable(tf.zeros([784,10]))b=tf.Variable(tf.zeros(10))#b的形状依据每个批次的形状而定,在中间层时,每个批次未必是一行n列,也可能变换成多行多列,此时b随之改变。prediction=tf.nn.softmax(tf.matmul(x,W)+b)#(形状(100,10)# 二次代价函数loss=tf.reduce_mean(tf.square(y-prediction))train_step=tf.train.GradientDescentOptimizer(0.20).minimize(loss)# 初始化init=tf.global_variables_initializer()# 比较两个参数的大小是否一样:tf.equal# tf.argmax(y,1)y中取值最大的在哪个位置。index。第二个参数是维度,axis=1即代表在第二维度,列上最大# 整体结果是个bool形列表correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))# 求准确率# tf.cast(correct_prediction,tf.float32)改变格式# tf.reduce_mean求个平均值得到准确率accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))with tf.Session() as sess:sess.run(init)for epoch in range(21):#每次迭代都要对所有数据处理一次for batch in range(n_batch):#每个批次的输入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}))