你的第一个神经网络-keras识别手写数字(python)

你的第一个神经网络-keras分类mnist数据集

提示:博主也是小白,通过学习其他的大神的代码,加了自己的注释和见解,希望能让人更加明白。一起学习!

文章目录

  • 你的第一个神经网络-keras分类mnist数据集
  • 一、keras是什么?
  • 二、搭建神经网络并测试
    • 1.引入库
    • 2.加载数据集并处理
    • 3.搭建神经网络(全连接)
    • 4.神经网络的编译和训练
    • 5.测试集上测试模型性能
    • 6.运行结果
  • 总结


一、keras是什么?

Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化 。

Keras在代码结构上由面向对象方法编写,完全模块化并具有可扩展性,其运行机制和说明文档有将用户体验和使用难度纳入考虑,并试图简化复杂算法的实现难度 。Keras支持现代人工智能领域的主流算法,包括前馈结构和递归结构的神经网络,也可以通过封装参与构建统计学习模型 。在硬件和开发环境方面,Keras支持多操作系统下的多GPU并行计算,可以根据后台设置转化为Tensorflow、Microsoft-CNTK等系统下的组件 。

二、搭建神经网络并测试

1.引入库

from keras.utils import to_categorical
from keras import models, layers, regularizers
from keras.optimizers import RMSprop
from keras.datasets import mnist
import matplotlib.pyplot as plt

2.加载数据集并处理

(train_images,train_labels),(test_images,test_labels)=mnist.load_data()#归一化处理,注意必须进行归一化操作,否则准确率非常低,图片和标签

#将图片由二维铺开成一维
train_images=train_images.reshape((60000,28*28)).astype('float')  #将28*28的二维数组转变为784的一维数组,浮点数类型
test_images=test_images.reshape((10000,28*28)).astype ('float')
train_labels=to_categorical(train_labels)  #to_categorical就是将类别向量转换为二进制(只有01)的矩阵类型表示
test_labels=to_categorical(test_labels)
#print(train_labels[0])

3.搭建神经网络(全连接)

(network = models.Sequential()   #选用的是Sequential 序贯模型
network.add(layers.Dense(units=15, activation='relu', input_shape=(28*28, ),))#添加一个(隐藏层)全连接层,神经元为15,激活函数是relu线性整流
                                                                                                                #函数,输入形状为28*28
network.add(layers.Dense(units=10, activation='softmax'))#添加一个(输出层)全连接层,神经元为10,激活函数为softmax(Softmax 具有更好的解释性,
                                                                                 #包含属于猫的这一类的特征越多,输出为猫的概率就越大)
                                                                   #这块通过softmax激活函数,最后的数组中,十个数哪个最大,计算机就认为是哪个
#print(network.summary())  #查看神经网络model结构

4.神经网络的编译和训练

# 编译步骤,损失函数是模型优化的目标,优化器使用RMSporp,学习率为0.001,损失函数是categorical_crossentropy,评价函数为accuracy准确率
network.compile(optimizer=RMSprop(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])
# 训练网络,用fit函数(fit()方法用于执行训练过程), epochs表示训练多少个回合, batch_size表示每次训练给多大的数据,一次训练所选取的样本数。
network.fit(train_images, train_labels, epochs=22, batch_size=128, verbose=2)  #verbose:日志显示 0 为不在标准输出流输出日志信息 1 为输出进度条记录
                                                                                                                #2 为每个epoch输出一行记录

5.测试集上测试模型性能

y_pre = network.predict(test_images[:5])  #预测前五张图片的,model.predict 实际预测,其输出是目标值,根据输入数据预测。
print(y_pre, test_labels[:5])
test_loss, test_accuracy = network.evaluate(test_images, test_labels)  #model.evaluate函数预测给定输入的输出
print("test_loss:", test_loss, "    test_accuracy:", test_accuracy)

6.运行结果

你的第一个神经网络-keras识别手写数字(python)_第1张图片上面是神经网络的结构,下面是运行结果,最后识别率是0.838。和CNN相差太多了

总结

本次的神经网络识别mnist数据集,完全采用的是全连接层,所以识别率较低,而且出现过拟合现象,可以使用正则化,同时使部分的神经元失去作用就会好很多。
这也是博主第一次写,不好的地方请大家多多指正!谢谢!

下面是我看的这位Up主的,觉得写得很好!,尤其是他还有视频讲解,非常友好。[https://blog.csdn.net/qq_40438165/article/details/105846692]

你可能感兴趣的:(python,神经网络,tensorflow,机器学习,人工智能)