Keras 入门课1 -- 用MLP识别mnist手写字符
来源:互联网 发布:js遍历jsonarray对象 编辑:程序博客网 时间:2024/06/04 21:12
Keras 入门课1: 使用Keras写一个mlp
mlp就是multilayer perceptron,多层感知机。数据集用的是经典的mnist,数字分类问题。
首先导入keras的各种模块
keras.datasets 里面包含了多种常用数据集,如mnist,cifar10等等,可以实现自动下载和解析等等。
keras.models 里面有最核心的模型结构,如顺序模型结构Sequential
keras.layers 里面有一些常用的层结构,如全连接层Dense
keras.optimizers 里面有一些常用优化函数,如adam等
import kerasfrom keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense,Dropoutfrom keras.optimizers import RMSprop
Using TensorFlow backend./usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/importlib/_bootstrap.py:205: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6 return f(*args, **kwds)
载入mnist数据,第一次会自动下载,之后运行会载入本地文件。
(x_train,y_train),(x_test,y_test)=mnist.load_data()
↓查看一下数据格式,训练集一共有6万张,大小是28*28,单通道灰度图,测试集是1000张。标签是列向量
print(x_train.shape,y_train.shape)print(x_test.shape,y_test.shape)
(60000, 28, 28) (60000,)(10000, 28, 28) (10000,)
↓可视化一些图片
import matplotlib.pyplot as pltim = plt.imshow(x_train[0],cmap='gray')plt.show()im2 = plt.imshow(x_train[1],cmap='gray')plt.show()
由于mlp的输入是一维向量,所以要转换
将每一幅图像都转换为一个长向量,大小为28*28=784
x_train = x_train.reshape(60000,784)x_test = x_test.reshape(10000,784)x_train = x_train.astype('float32')x_train = x_train.astype('float32')print(x_train.shape)
(60000, 784)
归一化,将图像的像素归到0~1
x_train = x_train/255x_test = x_test/255
将label也转换成One-hot标签,这里直接用keras的预置的一个函数 keras.utils.to_categorical
print(y_train[0:10])# 查看原始标签 0~9
[5 0 4 1 9 2 1 3 1 4]
y_train = keras.utils.to_categorical(y_train,10)y_test = keras.utils.to_categorical(y_test,10)print(y_train[0:10])#查看转换完毕的标签
[[ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.] [ 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.] [ 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.] [ 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.] [ 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.] [ 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]]
开始构建模型,模型分包含两个隐层和一个输出层,都是全连接层,使用Sequential构建
其中隐层输出采用ReLU激活函数,Sequential的第一层要指定input_shape,要注意,这里的input_shape 是不包含batch大小的,就只是后面几维
model = Sequential()model.add(Dense(512,activation='relu',input_shape=(784,)))model.add(Dropout(0.2))model.add(Dense(512,activation='relu'))model.add(Dropout(0.2))model.add(Dense(10,activation='softmax'))
model.summary()#这一句用来输出网络结构
_________________________________________________________________Layer (type) Output Shape Param # =================================================================dense_1 (Dense) (None, 512) 401920 _________________________________________________________________dropout_1 (Dropout) (None, 512) 0 _________________________________________________________________dense_2 (Dense) (None, 512) 262656 _________________________________________________________________dropout_2 (Dropout) (None, 512) 0 _________________________________________________________________dense_3 (Dense) (None, 10) 5130 =================================================================Total params: 669,706Trainable params: 669,706Non-trainable params: 0_________________________________________________________________
配置模型,主要包括
loss:loss计算方法(损失函数)
optimizer:优化函数
metrics:指定哪些量需要在训练及测试中关注,一般都会写accuracy
model.compile(loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy'])
开始训练。这里使用的是model对象的fit方法。前两个参数分别是完整的训练数据和训练标签
batch_size 表示每一次塞入多少张图片
epochs 表示训练几轮
verbose 表示用何种方式显示输出信息,0表示不输出,1表示在一直输出更新,2表示每一个epoch才输出一次。
validation_data 表示验证集,格式和训练集一样,如果此参数不为空的话,每一个epoch过后就会输出验证集的loss和accuracy
model.fit(x_train,y_train,batch_size=64,epochs=2,verbose=1, validation_data=(x_test,y_test))
Train on 60000 samples, validate on 10000 samplesEpoch 1/260000/60000 [==============================] - 21s - loss: 0.2260 - acc: 0.9299 - val_loss: 0.1394 - val_acc: 0.9582Epoch 2/260000/60000 [==============================] - 20s - loss: 0.1072 - acc: 0.9693 - val_loss: 0.1353 - val_acc: 0.9621<keras.callbacks.History at 0x12e041ba8>
测试结果,输出为loss以及其他之前compile模型时指定过的metrics的值
score = model.evaluate(x_test,y_test,verbose=1)print('Test loss:',score[0])print('Test accuracy',score[1])
9792/10000 [============================>.] - ETA: 0sTest loss: 0.135303073547Test accuracy 0.9621
总结
本文主要写了一个最简单的多层感知机模型,目的是熟悉keras最基本的操作。
知识点:
- 学习载入Keras中预置的数据库及数据库数据的基本变换
- Sequential模型的定义,以及如何添加层
- 如何对Dense层及Dropout层进行基本的配置
- 学习使用compile对网络进行配置
- 使用fit方法来对小数据库进行训练,这里的小数据库指的是所有数据可以一次性载入到内存
- 使用evaluate方法来对模型进行效果评估
本文代码下载:https://github.com/tsycnh/Keras-Tutorials/blob/master/class_1.ipynb
参考:
https://github.com/keras-team/keras/tree/master/examples
- Keras 入门课1 -- 用MLP识别mnist手写字符
- keras:1)初体验-MLP神经网络实现MNIST手写识别
- Keras入门课2 -- 使用CNN识别mnist手写数字
- tensorflow中MLP识别mnist手写数字
- keras 手把手入门#1-MNIST手写数字识别 深度学习实战闪电入门
- Keras 浅尝之MNIST手写数字识别
- keras 入门 --手写数字识别
- keras 实现CNN 进行手写字符识别
- anaconda+theano+keras手写字符识别新版
- Keras中将LSTM用于mnist手写数字识别
- keras入门实战:手写数字识别
- Keras入门例子:cnn实现手写识别
- 【Tensorflow入门】手写字体识别(MNIST)
- Tensorflow入门 mnist手写数字识别
- MLP 之手写数字识别
- keras 识别Mnist
- keras---minist手写识别
- Tensorflow #1 祖传例子 MNIST 手写识别
- 包装类
- ES6学习12章:Generator函数
- 安装mysql最新版出现错误
- 软考常考知识点整理-项目配置管理角色和分工
- 一行命令搞定node.js 版本升级
- Keras 入门课1 -- 用MLP识别mnist手写字符
- 测试格式
- 深度学习: translation invariant (平移不变性)
- ES6学习13章:Promise对象
- lwp和线程区别
- 游戏开发学习笔记(十五)怪物系统
- 双调排序进阶:对任意长度的序列排序
- 微信小程序----App生命周期
- bash shell的配置