keras 深度学习 mnist示例代码

'''
功能:通过深度学习,让机器学会自动识别手写数字。
源数据来源于:mnist官方库中手写数字的训练及测试数据。

附:
keras中文文档:
http://keras-cn.readthedocs.io/en/latest/for_beginners/concepts/

keras英文文档:
https://keras.io/
'''

#!/usr/bin/env python

import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
import numpy as np
import keras
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers import Conv2D, MaxPool2D, Flatten
from keras.optimizers import SGD, Adam
from keras.utils import np_utils
from keras.datasets import mnist

# 定义数据加载函数
def load_data():
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    
    '''
    x_train.shape=[10000,28,28], x_train[0]=(一个二维数组)
    x_test.shape=[(10000, 28, 28)],x_test[0]=(一个二维数组)
    y_train.shape=[(60000,)],y_train[0]=[5]
    y_test.shape=[(10000,)],y_test[0]=[7]
    说明x_train的每一个元素, 都是一个28*28的数组, 下面我们要将数转换成一维向量
    '''

    number = 10000
    x_train = x_train[0:number]
    y_train = y_train[0:number]

    # 将三维数组转换为二维数组
    x_train = x_train.reshape(number, 28*28)
    x_test = x_test.reshape(x_test.shape[0], 28*28)

    # 将向里中每个元素的值从整形转为浮点
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')

    # convert class vectors to binary class matrices
    # 即用one hot encoding方法将输出标签的向量(vector)转化为
    # 只在出现对应标签的那一列为1,其余为0的布尔矩阵, 10个列,有值的一列为1, 其余为0
    # keras.utils.to_categorical(labels, num_classes)
    y_train = np_utils.to_categorical(y_train, 10)
    y_test = np_utils.to_categorical(y_test, 10)

    '''
    x_train = x_train
    x_test = x_test
    '''

    x_train = x_train / 255
    x_test = x_test / 255

    return (x_train, y_train), (x_test, y_test)

'''
x_train.shape => (10000, 784) x_train的形状: 10000个784维的向量
x_train[0] => 第一个向量的值
'''

# 加载训练数据及测试数据
(x_train, y_train), (x_test, y_test) = load_data()
'''
print ('x_train.shape=[%s],x_train[0]=[%s]' %(x_train.shape, x_train[0]))
print ('x_test.shape=[%s],x_test[0]=[%s]'   %(x_test.shape, x_test[0]))
print ('y_train.shape=[%s],y_train[0]=[%s]' %(y_train.shape, y_train[0]))
print ('y_test.shape=[%s],y_test[0]=[%s]'   %(y_test.shape, y_test[0]))
print ('\n\n')
exit()

x_train.shape=[(10000, 784)],x_train[0]=(一个一维数组)
x_test.shape=[(10000, 784)],x_test[0]=(一个一维数组)
y_train.shape=[(10000, 10)],y_train[0]=[[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]]
y_test.shape=[(10000, 10)],y_test[0]=[[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]]
'''

# 定义一个序贯模型(Graph模型的一个特殊情况)
# 序贯模型是多个网络层的线性堆叠,训练时数据在网络层之间顺序执行。
# 序贯模型是相对于Graph模型而言。
# Graph模型支持多输入多输出,层与层之间想怎么边就怎么连,但是编译速度慢。
model = Sequential()

# 定义神经网络输入层
model.add(Dense(input_dim=28*28, units=633, activation='relu'))

# 定义神经网络的隐藏层
model.add(Dense(units=633, activation='relu'))
model.add(Dense(units=633, activation='relu'))

# 定义神经网络输出层
model.add(Dense(units=10, activation='softmax'))

# 指定损失函数:loss, 优化器:optimizer, 性能评估指标列表:metrics
model.compile(loss='categorical_crossentropy',optimizer=SGD(lr=0.1),metrics=['accuracy'])

# 开始训练模型
# model.fit(data, labels, batch_size=, epochs=)
model.fit(x_train, y_train, batch_size=1, epochs=1000)

# 打印训练得到最终的准确度
print('\nGet Train Accuracy')
result_train = model.evaluate(x_train,y_train)
print('Train Accuracy:[%f]\n' %(result_train[1]))

# 打印应用到测试数据得到的准确度
print('Get Test Accuracy')
result_test = model.evaluate(x_test,y_test)
print('Test Accuracy:[%f]' %(result_test[1]))

'''
# 使用训练得到的模型,对新的数据进行预测:
classes = model.predict(x_newdata, batch_size=128)
'''

 

TensorFlow 中文社区 MNIST学习笔记

本笔记内容整理自: http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html

官方例子: 辨识手写数字

要实现的功能: 从MNIST数据集中训练, 学习, 实现识别手写数字的功能.

模型思路:

每一张图片包含(28像素*28像素)。我们可以用一个数字数组来表示这张图片:

我们把这个数组展开成一个向量,长度是 28×28 = 784。

于是, 对于给定的一张图片, 可以通过矩阵将图片表示为: [x1, x2, … , x784].

通过神经网络, 将分别对这个矩阵数据进行加权运行, 加上一定的偏移量(bias), 计算出对应0-9的每个数字的概率是多少, 概率最大的那个就是神经经网络判断的结果.

所有步骤可以简化为:

1.

对[x1, x2, ..., x784]通过加权矩阵[W1,1, W1,2, ..., W1,784]计算, 加上偏移b1, 得到X这张图片数字为0的概率;

2.

对[x1, x2, ..., x784]通过加权矩阵[W2,1, W2,2, ..., W2,784]计算, 加上偏移b2, 得到X这张图片数字为1的概率;

3.

 ...... (分别计算为2,3,4,5,6,7,8的概率); 

4.

对[x1, x2, ..., x784]通过加权矩阵[W10,1, W10,2, ..., W10,784]计算, 加上偏移b9, 得到X这张图片数字为9的概率;

5.

得出概率最大的那个即为神经网络运算的结果, 同时如果概率要尽可能接近100%, 则表示结果可信度更好.

这里, 加权矩阵W[784,10], 以及偏移量矩阵b[1,10], 就是我们通过深度学习要挖掘出来的数据, 是我们所有训练, 测试所要达到的目标.

对于softmax回归模型可以用下面的图解释,对于输入的xs加权求和,再分别加上一个偏置量,最后再输入到softmax函数中:

 

其实就是:

y1=softmax(W1,1 * X1 +W1,2 * X2 +W1,3 * X3 + b1)

y2=softmax(W2,1 * X1 +W2,2 * X2 +W2,3 * X3 + b2)

y3=softmax(W3,1 * X1 +W3,2 * X2 +W3,3 * X3 + b3)

我们可以用向量表示这个计算过程:用矩阵乘法和向量相加。这有助于提高计算效率。(也是一种更有效的思考方式)

更进一步,可以写成更加紧凑的方式:

softmax函数的作用: 把Wx+b的输出空间映射到[0, 1]这个区间, 映射得到的值相当于统计意义上的概率, 不同输出值的大小相当于概率的大小.