发布于2019-08-20 15:00 阅读(972) 评论(0) 点赞(6) 收藏(5)
作为kaggle上入门级别比赛,手写体数字识别是最基本的一个。这里所用的数据为MNIST提供的0-9的手写体数字,kaggle上提供了csv格式的数据文件,可以直接读取。这里推荐使用readr包的read_csv函数读取,能够进一步提升文件读取速度。
数据简介:训练集样本个数为42000,测试集样本个数为28000,第一列为label为标签,第2到第785列为黑白图片每个像素点的灰度值(28*28).
模型搭建:采用多种基于skflow工具包的模型完成大规模手写体数字图片识别的任务。这些模型包括:线性回归器,全连接并包含三个隐层的深度神经网络(DNN)以及一个较为复杂但是性能强大的卷积神经网络(CNN)。
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """
- @File : MNIST.py
- @Author: Xinzhe.Pang
- @Date : 2019/7/28 0:27
- @Desc :
- """
- import pandas as pd
-
- train = pd.read_csv('./train.csv')
- # 查看训练样本信息
- print(train.shape)
-
- # 使用pandas从本地读取的MNIST手写体数字测试图片集
- test = pd.read_csv('./test.csv')
- print(test.shape)
-
- # 将训练集中的数据特征与对应标记分离
- y_train = train['label']
- X_train = train.drop('label', 1)
-
- # 准备测试特征
- X_test = test
-
- # 分别导入tensorflow和skflow
- import tensorflow as tf
- import skflow
-
- # 使用skflow中已经封装好的基于tensorflow搭建的线性分类器TensorflowFlowLinearClassifier进行学习预测
- classifier = skflow.TensorFlowLinearClassifier(n_classes=10, batch_size=100, steps=1000, learning_rate=0.01)
- classifier.fit(X_train, y_train)
-
- linear_y_pred = classifier.predict(X_test)
-
- linear_submission = pd.DataFrame({'ImageId': range(1, 28001), 'Label': linear_y_pred})
- linear_submission.to_csv('./linear_submission.csv', index=False)
-
- # 使用基于tensorflow搭建的全连接深度神经网络TensorflowDNNClassifier进行学习预测
- classifier = skflow.TensorFlowDNNClassifier(hidden_units=[200, 50, 10], n_classes=10, steps=5000, learning_rate=0.01,
- batch_size=50)
- classifier.fit(X_train, y_train)
-
- dnn_y_pred = classifier.predict(X_test)
- dnn_submission = pd.DataFrame({'ImageId': range(1, 28001), 'Label': dnn_y_pred})
- dnn_submission.to_csv('./dnn_submission.csv', index=False)
-
- # 使用Tensorflow中的算子自行搭建更为复杂的卷积神经网络,并使用skflow的程序接口从事MNIST数据的学习与预测
- def max_pool_2x2(tensor_in):
- return tf.nn.max_pool(tensor_in, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
-
-
- def conv_model(X, y):
- X = tf.reshape(X, [-1, 28, 28, 1])
- with tf.variable_scope('conv_layer1'):
- h_conv1 = skflow.ops.conv2d(X, n_filters=32, filter_shape=[5, 5], bias=True, activation=tf.nn.relu)
- h_pool1 = max_pool_2x2(h_conv1)
- with tf.variable_scope('conv_layer2'):
- h_conv2 = skflow.ops.conv2d(h_pool1, n_filters=64, filter_shape=[5, 5], bias=True, activation=tf.nn.relu)
- h_pool2 = max_pool_2x2(h_conv2)
- h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
- h_fcl = skflow.ops.dnn(h_pool2_flat, [1024], activation=tf.nn.relu, keep_prob=0.5)
- return skflow.models.logistic_regression(h_fcl, y)
-
-
- classifier = skflow.TensorFlowEstimator(model_fn=conv_model, n_classes=10, batch_size=100, steps=20000,
- learning_rate=0.001)
- classifier.fit(X_train, y_train)
-
- # 这里不要直接将所有测试样本交给模型进行预测,因为Tensorflow会同时对所有测试样本进行矩阵运算,一次对28000个测试图片进行计算
- # 会消耗大量的内存和计算资源,这里采用的是逐批次地对样本进行预测,最后拼接全部预测结果
- conv_y_pred = []
- import numpy as np
-
- for i in np.arange(100, 28001, 100):
- conv_y_pred = np.append(conv_y_pred, classifier.predict(X_test[i - 100:i]))
- conv_submission = pd.DataFrame({'ImageId': range(1, 28001), 'Label': np.int32(conv_y_pred)})
- conv_submission.to_csv('./conv_submission.csv', index=False)
作者:雷神归来
链接:https://www.pythonheidong.com/blog/article/49450/8d412d6da4157d41f647/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!