卜若的代码笔记-Deeplerning-第二章:浅层手写数字识别网络

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];

我们通常会使用概率去描述这个问题,所以:

SolftMax(Prediction),其结果依旧是[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(相关函数都在第一章有介绍,这里不会再多做赘述)

ReduceMean((Prediction - YLabel)^2)

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

结果:

网络,数据,执行上下文分开写,代码高内聚低耦合,模块化,这是最基本的...都写一块,现在是爽了,过会儿你要哭~

发布了202 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37080133/article/details/102308355