1 网络结构
1.1 输入结构
Input = [1000,784];
如果将一张28*28的图像展开成一行向量,它就是[1,784]
如果有1000张28*28的图像展开成一行向量,它就是[1000,784]
1.2 第一层网络结构
它由两部分组成,第一部分是评价网络,另外一部分是偏置值
评价网络是一个[Row,Col]的矩阵,而偏置值,则是[1,Col],每一行都偏置
这里我们令Row = 784,Col = 10
W = [784,10];
Bias = [1,10];
1.3 预测值
Prediction = Input*W +Bias = [1000,10];
我们通常会使用概率去描述这个问题,所以:
,其结果依旧是[1000,10]
需要注意的是,这个结果是一个什么样的额意思呢?
是这样的:
他描述的是这1000张对应的预测结果,每一张的结果都是[1,10]。
为什么结果要是这样的呢?
这是因为我们给的学习标签YLabel
它的结构就是这样的:
表示1的标签为[0,1,0,0,0,0,0,0,0,0];
表示2的标签为[0,0,1,0,0,0,0,0,0,0];
...
1.4 损失值,一般情况下,损失值是一维的,我们需要使用一个Value去评价我们的预测的结果,有很多解决办法,通常是使用ReduceMean(相关函数都在第一章有介绍,这里不会再多做赘述)
1.5 准确率:
它通常是描述这张图片从网络里面获取的结果比如
[0.1,0.2,0.04,0.5,0.x,0.y,0............]和这张训练集图像对应(注意,这张图片对应的标签是绝对确定的!)的[0,0,0,1,0,0....]的标签的接近程度。在2分类里面,嗯,我说的有点抽象了,希望你能转的过来吧,在2分类里面,只有两种结果,对和错。
所以对于这个target from net,我们选择里面最大的概率值[0.1,0.2,0.04,0.5,0.x,0.y,0............],比如0.5对应的值(数字3)作为输出结果 Anwser = 3,和标签里面最大概率值对应位置(数字3)做比较,if Answer.eual(YLabel),那就认为正确,反之错误。接着,我们统计1000张正确的数量,这个数量/1000对应比率就是准确率。
这就是浅层网络
1.6 训练过程
这个过程是深度学习的精华所在,但是极难,难以理解,需要单独抽出一章来讲解。我们直接使用Tensorflow的API了,哎。
2 关于Minist手写数据集
它长这玩意,我们现在通过数据读取,将里面的数据组合成[50000,784]这样的数据结构
然后怎么确认你做的就是正确的呢?可以使用,单独拿出一行数据,reshape成[28,28],显示出来,看看效果:
以下是代码:
import sys
sys.path.append("..")
import web
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np
import matplotlib.pyplot as plt
import time
from scipy import misc
import os
import json
import Dater as dater
from PIL import Image
class getDC():
def __init__(self):
self.dc = []
self.label = []
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)
trainSet = mnist.train.images
labelSet = mnist.train.labels
for i in range(3000):
img = trainSet[i]
img = img.reshape(1, 28*28)
img = img * 255
self.dc.append(img)
self.label.append(labelSet[i])
pass
self.dc = np.array(self.dc)
self.dc = self.dc.reshape([3000,784])
self.label=np.array(self.label)
self.label = self.label.reshape([3000,10])
pass
pass
# dc = getDC()
# #
# img = dc.dc[0].reshape([28,28])
# plt.figure(0)
# plt.imshow(img)
# plt.show()
# print(img)
其实数据怎么来的我们并不怎么关心,毕竟很简单!但不管怎么说,我们数据是拿到了,我们开始建造浅层神经网络吧~
import tensorflow as tf
x = tf.placeholder(tf.float32,[None,784])
YLabel = tf.placeholder(tf.float32,[None,10])
W = tf.Variable(tf.zeros([784,10]))
Bias = tf.Variable(tf.zeros([1,10]))
Prediction = tf.nn.softmax(tf.matmul(x,W)+Bias)
Loss = tf.reduce_mean(tf.square(Prediction-YLabel))
Train = tf.train.GradientDescentOptimizer(0.2).minimize(Loss)
BoolCorrect = tf.equal(tf.argmax(Prediction),tf.argmax(YLabel))
Accuracy = tf.reduce_mean(tf.cast(BoolCorrect,tf.float32))
Init = tf.global_variables_initializer()
调用:
import MinistDataAnalyser as md
import ShallowNeuralNet as net
import tensorflow as tf
with tf.Session() as sess:
sess.run(net.Init)
data = md.getDC()
for i in range(100):
sess.run(net.Train, feed_dict={net.x: data.dc, net.YLabel: data.label})
acc = sess.run(net.Accuracy, feed_dict={net.x: data.dc, net.YLabel: data.label})
print(acc)
pass
pass
结果:
网络,数据,执行上下文分开写,代码高内聚低耦合,模块化,这是最基本的...都写一块,现在是爽了,过会儿你要哭~