使用Keras进行神经网络架构学习
前段时间学习了CS231N的相关课程,对于神经网络有了一定的了解,也做了几个assignment。就正如每个作业对于神经网络内部有较好的学习掌握,但是例如编写一个VGG16网络可就太麻烦了,需要一层层搭建。经过师兄推荐使用Keras架构搭建方便多了。
我眼中的Keras
根据已知的Tensorflow的架构,扩张内容,减少编写的难度,简单入手,但是要是理解内部每个函数的多种参数的用法需要认真学习深度学习内的内容。笔者举个例子,普通的搭建神经网络,编写前向传播反向传播就好比手写计算题;而使用Keras搭建就好比使用计算器计算计算题,只需要输入公式和参数就可以得到结果。
计划任务
该学习需要和神经网络学习相辅相成,两块内容都会更新。
任务一 MNIST手写体识别
任务简介:使用MNIST数据集,用训练集训练一个神经网络,使用测试集去检测网络的准确性。
任务分析:MNIST数据集,60000个训练集和10000个测试集组成的数据库,且每一个数据都有一个标签,标记该数据为什么数字。每个数据都是由28*28的像素组成,再增加一个标签,那么一个数据为785个参数。
然后将训练集数据放入编写的神经网络,训练神经网络的参数。之后使用测试集,我们假装标签未知,从而让网络进行预测,若输出结果与标签一致则记为1,否则为0。
最后计算测试集的准确率,即最后输出得分/10000即可。
程序
# 即使在python2.X,使用print就得像python3.X那样加括号使用
from __future__ import print_function
import numpy as np
from keras.datasets import mnist
#Sequential model表示所有层输出都是一个,多个输出使用API model
from keras.models import Sequential
#Dense 全链接层, Activation 激活层
from keras.layers.core import Dense, Activation
#SGD 优化方式,即对于学习率的一个缩减的优化方法
from keras.optimizers import SGD
#一种矩阵处理头文件
from keras.utils import np_utils
#重复性设置
np.random.seed(1671)
NB_EPOCH = 200
BATCH_SIZE = 128
VERBOSE = 1
#输出个数等于数字个数
NB_CLASSES = 10
OPTIMIZER = SGD()
N_HIDDEN = 128
#训练集中用作验证集的数据比例
VALIDATION_SPLIT = 0.2
#数据:混合并划分训练集和测试集数据,无需下载数据集
(X_train, y_train), (X_test, y_test) = mnist.load_data()
#X_train是60000行28*28的数据,变形为60000*784
RESHAPE = 784
X_train = X_train.reshape(60000, RESHAPE)
X_test = X_test.reshape(10000, RESHAPE)
#转化数组的数据类型
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
#归一化处理,将像素值数据缩小到[0,1]之间
X_train /= 255
X_test /= 255
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')
# 是把类别标签转换为onehot编码, reshape函数类似
Y_tarin = np_utils.to_categorical(y_train, NB_CLASSES)
Y_test = np_utils.to_categorical(y_test, NB_CLASSES)
#10个输出
#最后是softmax激活函数
model = Sequential()
model.add(Dense(NB_CLASSES, input_shape=(RESHAPE, )))
model.add(Activation('softmax'))
model.summary()
#编译模型,确定损失函数为交叉熵,优化器使用SGD方式,输出指标正确率
model.compile(loss='categorical_crossentropy', optimizer=OPTIMIZER, metrics=['accuracy'])
#epochs为训练轮数,优化器尝试调整权重;batch_size是群众更新前要观察的训练实例数
history = model.fit(X_train, Y_tarin,batch_size=BATCH_SIZE, epochs=NB_EPOCH,verbose=VERBOSE, validation_split=VALIDATION_SPLIT)
#测试集运行
score = model.evaluate(X_test, Y_test, verbose=VERBOSE)
print("TEST score:", score[0])
print("TEST accuracy", score[1])
实验结果
该网络由全链接和softmax构造的神经网络输出,输出准确率在92.2%左右,后续要提升其准确率会对网络进行一定的更新。