keras/构建卷积神经网络识别mnist

环境:Keras 2.04, python 2.7,GPU

使用深度学习框架keras,构建卷积神经网络识别手写数字,keras在构建神经网络方面比Tensorflow简单很多,而且Tensorflow也将keras作为其高级api

#coding:utf-8
"""
python 2.7
keras 2.0.4
"""
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Activation,Convolution2D,MaxPooling2D,Flatten
from keras.optimizers import Adam
from sklearn.metrics import confusion_matrix,classification_report
import numpy as np
import input_data
import datetime

start_time = datetime.datetime.now()
#设置随机种子
np.random.seed(1000)

#数据格式转换
#one_hot=False这里故意使y值为如下表示:(0000000000),目的是后面使用keras的np_utils
mnist = input_data.read_data_sets('mnist/',one_hot=False)
#样本数,颜色通道,28行28列
train_data=mnist.train.images.reshape(mnist.train.images.shape[0],1,28,28)
#通过keras的np_utils将y值转为如下表示:(0000000000)
train_labels = np_utils.to_categorical(mnist.train.labels,nb_classes=10)
test_data = mnist.test.images.reshape(mnist.test.images.shape[0],1,28,28)
test_labels = np_utils.to_categorical(mnist.test.labels,nb_classes=10)

#构建模型
model = Sequential()
#卷积层,32个卷积核,每个卷积核大小5*5,采用same_padding的方式
model.add(Convolution2D(nb_filter=32,nb_row=5,nb_col=5,border_mode='same',input_shape=(1,28,28)))
#pooling层,采用same padding 
model.add(MaxPooling2D(pool_size=(2,2),border_mode='same'))
model.add(Convolution2D(nb_filter=64,nb_row=5,nb_col=5,border_mode='same'))
model.add(MaxPooling2D(pool_size=(2,2),border_mode='same'))
#将数据展平
model.add(Flatten())
#全连接层
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))
#编译模型sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9,nesterov=True)  
model.compile(optimizer=Adam(lr = 0.001),loss='categorical_crossentropy',metrics=['accuracy'])
#训练模型
#shuffle就是是否把数据随机打乱之后再进行训练  
# verbose是屏显进度条   
# validation_split就是拿出百分之多少用来做交叉验证  
model.fit(train_data,train_labels,nb_epoch=10,batch_size=50,shuffle=True,verbose=1,validation_split=0.3)

#测试集结果
c,acc = model.evaluate(test_data,test_labels,batch_size=50)
#输出预测分类是0,1,2,3,4,5这种类型
predictions = model.predict_classes(test_data,batch_size=50)
#混淆矩阵
print(confusion_matrix(mnist.test.labels,predictions))
#report
print(classification_report(mnist.test.labels,np.array(predictions)))
#模型训练了多久
end_time = datetime.datetime.now()
total_time = (end_time - start_time).seconds
print('total time is:',total_time)

结果:

实验过程是在GPU上测试的,速度比cpu快很多,进行十轮训练用了582s
这里写图片描述

这里写图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于Python的卷积神经网络可以非常有效地识别MNIST数据集。MNIST是一个手写数字识别的经典数据集,包含了60000个训练样本和10000个测试样本,每个样本是一个28x28像素的灰度图像。 首先,我们需要使用Python的深度学习库Keras构建卷积神经网络模型。卷积神经网络的核心是卷积层和池化层,这些层能够提取图像的特征。我们可以使用Conv2D函数来添加卷积层,它将输入的图像进行卷积计算。然后,我们可以使用MaxPooling2D函数来添加池化层,它可以对卷积层的输出进行下采样。 其次,我们需要将MNIST数据集进行预处理。我们可以使用Keras提供的工具函数将图像数据规范化到0到1之间,并将标签进行独热编码。这样可以更好地适应卷积神经网络的输入和输出。 接下来,我们可以定义我们的卷积神经网络模型。一个简单的卷积神经网络可以包含几个卷积层和池化层,然后是一个或多个全连接层。我们可以使用Keras的Sequential模型来构建这个模型,并逐层加入卷积层和池化层。 然后,我们需要对模型进行编译和训练。我们可以使用compile函数对模型进行配置,设置损失函数、优化器和评估指标。对于MNIST数据集的分类问题,我们可以选择交叉熵作为损失函数,并使用Adam优化器进行优化。然后,我们可以使用fit函数将模型训练在训练集上进行训练。 最后,我们可以使用训练好的模型对测试集进行预测,并评估模型的准确率。我们可以使用evaluate函数计算模型在测试集上的损失和准确率。 总结来说,通过使用Python的卷积神经网络Keras,我们可以很容易地构建一个能够识别MNIST数据集的卷积神经网络模型。该模型可以对手写数字图像进行特征提取和分类,并能够给出准确的识别结果。 ### 回答2: 基于Python的卷积神经网络(Convolutional Neural Network, CNN)可以用来识别MNIST数据集。MNIST是一个手写数字的图像数据集,包含训练集和测试集,每个图像是28x28的灰度图像。 要使用CNN识别MNIST数据集,首先需要导入必要的Python库,如TensorFlow和Keras。然后,定义CNN的模型架构。模型可以包含一些卷积层、池化层和全连接层,以及一些激活函数和正则化技术。 接下来,将训练集输入到CNN模型进行训练。训练数据集包含大量有标签的图像和对应的数字标签。通过迭代训练数据集,目标是调整CNN模型的参数,使其能够准确地预测出输入图像的数字标签。 训练完成后,可以使用测试集来评估CNN模型的性能。测试集与训练集是相互独立的,其中包含一些未曾训练过的图像和相应的标签。通过使用CNN模型来预测测试集图像的标签,并将预测结果与实际标签进行比较,可以计算出模型的准确率。 对于MNIST数据集的识别,使用CNN相比传统的机器学习算法有许多优势。CNN可以自动提取特征,无需手动设计特征。此外,CNN可以有效地处理图像数据的空间关系和局部模式,能够更好地捕捉图像中的结构信息。这使得CNN在图像识别任务中具有较高的准确率。 总之,基于Python的卷积神经网络可以很好地识别MNIST数据集。通过构建一个CNN模型,从训练数据中学习到的参数可以用来预测测试数据中的图像标签,并通过比较预测结果和实际标签来评估模型的性能。 ### 回答3: 卷积神经网络CNN)是一种在计算机视觉领域中广泛应用的深度学习模型,其中包括卷积层、池化层和全连接层等不同层级。 在使用Python构建CNN识别MNIST数据集时,我们需要先从MNSIT数据集中加载图像和标签。接下来,我们可以使用Python的图像处理库将图像转换为适当的格式,以供CNN模型使用。 在卷积层中,我们可以使用Python的数据处理和图像处理库(如NumPy和OpenCV)来实现卷积操作。通过设置合适的滤波器和步幅,我们可以从图像中提取特征。卷积层的输出将通过使用ReLU等激活函数来进行非线性变换。 接下来是池化层,它有助于减小特征图的大小并减少计算量。在这一步骤中,我们可以使用Python的库(如NumPy)来实现最大池化或平均池化操作。 在完成卷积和池化操作后,我们将使用全连接层,将具有多个特征图的输出连接成一个向量。然后,我们可以使用Python的深度学习框架(如TensorFlow或Keras),通过神经网络的反向传播来训练CNN模型。 在训练过程中,我们可以使用Python的库(如NumPy)来进行损失函数的计算和梯度下降等操作。通过不断迭代优化CNN的权重和偏差,我们可以逐步提高模型在MNIST数据集上的准确性。 最后,我们可以使用训练好的CNN模型对新的MNIST图像进行分类预测。通过输入图像到CNN模型中,我们可以获取每个类别的概率分布,然后选择概率最高的类别标签作为预测结果。 总之,基于Python的卷积神经网络CNN)的步骤是:加载MNIST数据集、进行卷积层、池化层和全连接层操作、使用深度学习框架训练模型,并使用训练好的模型进行分类预测。这样的CNN模型可以在MNIST数据集上实现高精度的数字识别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值