Keras入门之一: Hello Keras on MNIST 第一个例子-手写数字识别

 
 
先花一分钟介绍一下Keras
Keras的好处很多人已经说过,纯Python写成的,而且支持CPU/GPU的切换,能方便的使用 CNN/RNN 搞你想要的东东。
下图是Keras的功能模块结构图,十分清晰。

下面我们看一下我学习的第一个Keras 用于创建网络的学习例子。
这是采用了 mnist 手写数字识别数据集
原来的例子中有的地方对小白来说还不太明白,所以我又多加了一些注释,稍微修改了一下结构(比如多建了中间层)。
 
 
#=================== Test 1    Hello Keras for mnist==============================================================================
# 这是一个简单的全连接神经网络的例子。
from keras.models import Sequential  # 采用贯序模型
from keras.layers import Input, Dense, Dropout, Activation
from keras.models import Model
from keras.optimizers import SGD
from keras.datasets import mnist
import numpy as np

tBatchSize = 128
'''第一步:选择模型'''
model = Sequential() # 采用贯序模型

'''第二步:构建网络层'''
'''构建网络只是构建了一个网络结构,并定义网络的参数,此时还没有输入的数据集'''
#构建的第一个层作为输入层
# Dense 这是第一个隐藏层,并附带定义了输入层,该隐含层有500个神经元。输入则是 784个节点
model.add(Dense(500,input_shape=(784,))) # 输入层,28*28=784 输入层将二维矩阵换成了一维向量输入
model.add(Activation('tanh')) # 激活函数是tanh 为双曲正切  tanh(x) = sinh(x)/cosh(x) = (e^x - e^(-x))/(e^x + e^(-x))
model.add(Dropout(0.5)) # 采用50%的dropout  随机取一半进行训练

#构建的第2个层作为隐藏层2, (如果加上输入层,实际上是第三层)
model.add(Dense(500)) # 隐藏层节点500个
model.add(Activation('tanh'))
model.add(Dropout(0.5))

model.add(Dense(500)) # 隐藏层3,节点500个
model.add(Activation('tanh'))
#model.add(Dropout(0.5))

#构建的第3个层作为输出层
model.add(Dense(10)) # 输出结果是10个类别,所以维度是10
# softmax介绍可以参考https://blog.csdn.net/haolexiao/article/details/72757796
model.add(Activation('softmax')) # 最后一层用softmax作为激活函数

'''第三步:网络优化和编译'''
#   lr:大于0的浮点数,学习率
#   momentum:大于0的浮点数,动量参数
#   decay:大于0的浮点数,每次更新后的学习率衰减值
#   nesterov:布尔值,确定是否使用Nesterov动量
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 优化函数,设定学习率(lr)等参数

# 只有通过了编译,model才真正的建立起来,这时候才能够被使用
#model.compile(loss='categorical_crossentropy', optimizer=sgd, class_mode='categorical') # 使用交叉熵作为loss函数 这是原例子,但是执行出错
model.compile(loss='categorical_crossentropy', optimizer=sgd) # 使用交叉熵作为loss函数    # 去掉 class_mode 即可。可能是版本不同导致的???

'''
   第四步:训练
'''

# 数据集获取 mnist 数据集的介绍可以参考 https://blog.csdn.net/simple_the_best/article/details/75267863
(X_train, y_train), (X_test, y_test) = mnist.load_data() # 使用Keras自带的mnist工具读取数据(第一次需要联网)

# 由于mist的输入数据维度是(num, 28, 28),这里需要把后面的维度直接拼起来变成784维
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2])
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2])

#这个能生成一个OneHot的10维向量,作为Y_train的一行,这样Y_train就有60000行OneHot作为输出
Y_train = (np.arange(10) == y_train[:, None]).astype(int)  # 整理输出
Y_test = (np.arange(10) == y_test[:, None]).astype(int)    #np.arange(5) = array([0,1,2,3,4])

'''
   .fit的一些参数
   batch_size:对总的样本数进行分组,每组包含的样本数量
   epochs :训练次数
   shuffle:是否把数据随机打乱之后再进行训练
   validation_split:拿出百分之多少用来做交叉验证
   verbose:屏显模式 0:不输出  1:输出进度  2:输出每次的训练结果
'''
model.fit(X_train, Y_train, batch_size=tBatchSize, epochs=50, shuffle=True, verbose=2, validation_split=0.3)
#model.evaluate(X_test, Y_test, batch_size=200, verbose=0)


'''第五步:输出'''
print("test set")
# 误差评价 :按batch计算在batch用到的输入数据上模型的误差
scores = model.evaluate(X_test,Y_test, batch_size=tBatchSize, verbose=0)
print("")
print("The test loss is %f" % scores)

# 根据模型获取预测结果  为了节约计算内存,也是分组(batch)load到内存中的,
result = model.predict(X_test,batch_size=tBatchSize,verbose=1)

# 找到每行最大的序号
result_max = np.argmax(result, axis = 1) #axis=1表示按行 取最大值   如果axis=0表示按列 取最大值 axis=None表示全部
test_max = np.argmax(Y_test, axis = 1) # 这是结果的真实序号

result_bool = np.equal(result_max, test_max) # 预测结果和真实结果一致的为真(按元素比较)
true_num = np.sum(result_bool) #正确结果的数量
print("The accuracy of the model is %f" % (true_num/len(result_bool))) # 验证结果的准确率



看完上面的例子以后,再回过头来看看程序是怎么建立的:
这一个例子可以算是最简单的,之后我学完一些复杂的网络继续放上来。

原文地址 http://www.cnblogs.com/lc1217/p/7132364.html

猜你喜欢

转载自blog.csdn.net/sdust_dx/article/details/80365674
今日推荐