keras_mnist简单实现与注释

Keras_mnist学习记录


前言

代码来源:
https://blog.csdn.net/Yasin0/article/details/86483914

该篇主要是keras模型训练简单流程 ,个人学习记录,内容十分基础。
代码部分是对他人代码的注释,


提示:以下是本篇文章正文内容,下面案例可供参考

一、引用库

from keras.models import Sequential  
from keras.layers.core import Dense, Dropout, Activation  
from keras.optimizers import SGD  
from keras.datasets import mnist  
import numpy 

二、选择模型

model = Sequential()

三、构建网络层

model.add(Dense(500,input_shape=(784,))) # 输入层,28*28=784  
model.add(Activation('tanh')) # 激活函数是tanh  
model.add(Dropout(0.5)) # 采用50%的dropout

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

model.add(Dense(10)) # 输出结果是10个类别,所以维度是10  
model.add(Activation('softmax')) # 最后一层用softmax作为激活函数

四、编译

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 优化函数,设定学习率(lr)等参数  
model.compile(loss='categorical_crossentropy', optimizer=sgd) # 使用交叉熵作为loss函数

五、训练

(X_train, y_train), (X_test, y_test) = mnist.load_data()
 # 使用Keras自带的mnist工具读取数据(第一次需要联网)
# 由于mist的输入数据维度是(num, 28, 28),这里需要把后面的维度直接拼起来变成784维
#此处涉及到keras中张量的表达(数量,维度)
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2]) 
#等价于X_train = X_train.reshape(60000,28*28) 
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2])  
#等价于X_train = X_train.reshape(60000,28*28) 
Y_train = (numpy.arange(10) == y_train[:, None]).astype(int) 
#将十进制映射成one-hot编码
Y_test = (numpy.arange(10) == y_test[:, None]).astype(int)
#将十进制映射成one-hot编码
model.fit(X_train,Y_train,batch_size=200,epochs=50,shuffle=True,verbose=0,validation_split=0.3)
model.evaluate(X_test, Y_test, batch_size=200, verbose=0)

六、输出(此处个人理解困难点为argmax函数)


print("test set")
scores = model.evaluate(X_test,Y_test,batch_size=200,verbose=0)
print("")
print("The test loss is %f" % scores)
result = model.predict(X_test,batch_size=200,verbose=0)

print(result.shape)
"""
问题:为什么要用argmax去获取行最大值? 
答:用X_train,Y_train做的训练,且Y_train为ont-hot编码(只有1和0,用位置表示不同值), 所以带入X_test的预测结果result中的最大值索引代表其标签, 再将result与Y_test比较后的逻辑值相加除以样本数(1000)得出准确率。
"""
result_max = numpy.argmax(result, axis = 1)#每1行的最大值索引。
print("result_max:",result_max)
test_max = numpy.argmax(Y_test, axis = 1)#每1行的最大值索引。
print("test_max:",test_max)
"""argmax返回的是最大值的索引,参数axis=0,表示每1列的最大值索引(),axis=1,表示每1行的最大值索引。"""
#https://www.cnblogs.com/touch-skyer/p/8509217.html

result_bool = numpy.equal(result_max, test_max)#比较两个参数大小,返回逻辑值
print("result_bool:",result_bool)
true_num = numpy.sum(result_bool)
print()
print("true_num:",true_num)
print("The accuracy of the model is %f" % (true_num/len(result_bool)))

总结

keras的序列建模方法可以很快搭建好一个神经网络,适合新手。
但此处mnist数据集是已经预处理好了的,若要用自己的数据套模型训练要先对数据进行预处理(数据划分,数据标准化,数据增强,构建生成器),keras中的数据处理函数ImageDataGenerator,返回生成器函数flow_from_directory可较为方便的实现数据处理,训练数据划分可用sklearn内的train_test_split函数。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腹有诗书,何患无辞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值