小刘的深度学习---CNN

前言:

前段时间我在树莓派上通过KNN,SVM等机器学习的算法实现了门派识别的项目,所用到的数据集是经典的MNIST。可能是因为手写数字与印刷体存在一些区别,识别率并是很不高。基于这样的情况,我打算在PC端用CNN试一试MNIST上的识别率。



正文:

一张图展示CNN

导入基础包

import tensorflow as tf
from sklearn.datasets import load_digits
import numpy as np

导入数据集

digits = load_digits()
X_data = digits.data.astype(np.float32)
Y_data = digits.target.astype(np.float32).reshape(-1,1)

预处理

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_data = scaler.fit_transform(X_data)
from sklearn.preprocessing import OneHotEncoder
Y = OneHotEncoder().fit_transform(Y_data).todense()
X = X_data.reshape(-1,8,8,1)

MinMaxScaler(将数据归一化)

公式:X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) ;

   X_scaler = X_std/ (max - min) + min

OneHotEncoder(将数据二值化)

MBGD(小批量梯度下降)

batch_size = 8
def generatebatch(X,Y,n_examples, batch_size):
    for batch_i in range(n_examples // batch_size):
        start = batch_i*batch_size
        end = start + batch_size
        batch_xs = X[start:end]
        batch_ys = Y[start:end]
        yield batch_xs, batch_ys

输入层

tf.reset_default_graph()
tf_X = tf.placeholder(tf.float32,[None,8,8,1])
tf_Y = tf.placeholder(tf.float32,[None,10]

卷积,激活和池化层

conv_filter_w1 = tf.Variable(tf.random_normal([3, 3, 1, 10]))
conv_filter_b1 =  tf.Variable(tf.random_normal([10]))
relu_feature_maps1 = tf.nn.relu( tf.nn.conv2d(tf_X, conv_filter_w1,strides=[1, 1, 1, 1], padding=‘SAME‘) + conv_filter_b1)max_pool1 = tf.nn.max_pool(relu_feature_maps1,ksize=[1,3,3,1],strides=[1,2,2,1],padding=‘SAME‘)

[3,3,1,10]前2个参数是卷积核大小,第三个是通道数,第四个是卷积核数量

strides是卷积的滑动步长

padding是图像边缘的填充方式,

’SAME‘不够核大小的填充0

‘VALID‘不够核大小的丢弃

[1,3,3,1]首尾2个参数常为1,保证不在batch和channels上做池化,中间2参数是池化窗口大小

再卷积一次

conv_filter_w2 = tf.Variable(tf.random_normal([3, 3, 10, 5]))
conv_filter_b2 =  tf.Variable(tf.random_normal([5]))
conv_out2 = tf.nn.conv2d(relu_feature_maps1, conv_filter_w2,strides=[1, 2, 2, 1], padding=‘SAME‘) + conv_filter_b2

BN归一化+激活层

batch_mean, batch_var = tf.nn.moments(conv_out2, [0, 1, 2], keep_dims=True)
shift = tf.Variable(tf.zeros([5]))
scale = tf.Variable(tf.ones([5]))
epsilon = 1e-3
BN_out = tf.nn.batch_normalization(conv_out2, batch_mean, batch_var, shift, scale, epsilon)

池化层

max_pool2 = tf.nn.max_pool(relu_BN_maps2,ksize=[1,3,3,1],strides=[1,2,2,1],padding=‘SAME‘)

展开特征

max_pool2_flat = tf.reshape(max_pool2, [-1, 2*2*5])

全连接层

fc_w1 = tf.Variable(tf.random_normal([2*2*5,50]))
fc_b1 =  tf.Variable(tf.random_normal([50]))
fc_out1 = tf.nn.relu(tf.matmul(max_pool2_flat, fc_w1) + fc_b1)

输出层

out_w1 = tf.Variable(tf.random_normal([50,10]))
out_b1 = tf.Variable(tf.random_normal([10]))
pred = tf.nn.softmax(tf.matmul(fc_out1,out_w1)+out_b1)

损失函数

loss = -tf.reduce_mean(tf_Y*tf.log(tf.clip_by_value(pred,1e-11,1.0)))

训练(迭代1000个周期)

train_step = tf.train.AdamOptimizer(1e-3).minimize(loss)
y_pred = tf.arg_max(pred,1)
bool_pred = tf.equal(tf.arg_max(tf_Y,1),y_pred)
accuracy = tf.reduce_mean(tf.cast(bool_pred,tf.float32))
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for epoch in range(1000):
        for batch_xs,batch_ys in generatebatch(X,Y,Y.shape[0],batch_size):
            sess.run(train_step,feed_dict={tf_X:batch_xs,tf_Y:batch_ys})
        if(epoch%100==0):
            res = sess.run(accuracy,feed_dict={tf_X:X,tf_Y:Y})
            print (epoch,res)
    res_ypred = y_pred.eval(feed_dict={tf_X:X,tf_Y:Y}).flatten()
    print (res_ypred)

大功告成(ノ?`?′?)ノ︵

训练的最终结果在0.998附近



彩蛋:

现在正直世界杯,在端午节期间写下这篇随笔(′-ω-`)

未来暑假将写2篇关于faster RCNN 和 Mask RCNN的随笔(? ??_??)?

原文地址:https://www.cnblogs.com/zhabendejqxx/p/9192569.html

时间: 2024-08-29 00:27:06

小刘的深度学习---CNN的相关文章

七月算法--12月机器学习在线班-第十九次课笔记-深度学习--CNN

七月算法--12月机器学习在线班-第十九次课笔记-深度学习--CNN 七月算法(julyedu.com)12月机器学习在线班学习笔记http://www.julyedu.com 1,卷积神经网络-CNN 基础知识 三个要点 1: 首先将输入数据看成三维的张量(Tensor) 2: 引入Convolution(卷积)操作,单元变成卷积核,部分连接共享权重 3:引入Pooling(采样)操作,降低输入张量的平面尺寸 ,1.1 张量(Tensor) 高,宽度,深度,eg:彩色图像:rgb,3个深度,图

分享《自然语言处理理论与实战》PDF及代码+唐聃+《深入浅出Python机器学习》PDF及代码+段小手+《深度学习实践:计算机视觉》PDF+缪鹏+《最优化理论与算法第2版》高清PDF+习题解答PDF+《推荐系统与深度学习》PDF及代码学习

<自然语言处理理论与实战>高清PDF,362页,带书签目录,文字可以复制:配套源代码.唐聃等著. <大数据智能互联网时代的机器学习和自然语言处理技术>PDF,293页,带书签目录,文字可以复制,彩色配图.刘知远等著.  下载: https://pan.baidu.com/s/1waP6C086-32_Lv0Du3BbNw 提取码: 1ctr <自然语言处理理论与实战>讲述自然语言处理相关学科知识和理论基础,并介绍使用这些知识的应用和工具,以及如何在实际环境中使用它们.由

深度学习 CNN CUDA 版本2

作者:zhxfl 邮箱:zhxfl##mail.ustc.edu.cn 主页:http://www.cnblogs.com/zhxfl/p/4155236.html 第1个版本blog在这里:http://www.cnblogs.com/zhxfl/p/4134834.html 第2个版本github:https://github.com/zhxfl/CUDA-CNN 欢迎fork,在第一个版本的时候,我们只是针对手写数字,也就是黑白图片.在第二个版本中,我加入了很多东西. 第二个版本的特性 1

小知识:深度学习的5大常用模型解读

自动编码器 AutoEncoder Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结构的系统,如果给定一个神经网络,我们假设其输出与输入是相同的,然后训练调整其参数,得到每一层中的权重. 自然地,我们就得到了输入I的几种不同表示(每一层代表一种表示),这些表示就是特征.自动编码器就是一种尽可能复现输入信号的神经网络. 为了实现这种复现,自动编码器AutoEncoder就必须捕捉可以代表输入数据的最重要的因素,就像PCA那样,找到可以代表

深度学习-CNN tensorflow 可视化

tf.summary模块的简介 在TensorFlow中,最常用的可视化方法有三种途径,分别为TensorFlow与OpenCv的混合编程.利用Matpltlib进行可视化.利用TensorFlow自带的可视化工具TensorBoard进行可视化.这三种方法,在前面博客中都有过比较详细的介绍.但是,TensorFlow中最重要的可视化方法是通过tensorBoard.tf.summary和tf.summary.FileWriter这三个模块相互合作来完成的. tf.summary模块的定义位于s

相比于深度学习,传统的机器学习算法难道就此没落了吗,还有必要去学习吗?

自从 MIT Technology Review(麻省理工科技评论) 将 深度学习 列为 2013 年十大科技突破之首.加上今年 Google 的 AlphaGo 与 李世石九段 惊天动地的大战,AlphaGo 以绝对优势完胜李世石九段.人工智能.机器学习.深度学习.强化学习,成为了这几年计算机行业.互联网行业最火的技术名词. 其中,深度学习在图像处理.语音识别领域掀起了前所未有的一场革命.我本人是做图像处理相关的,以 2016 年计算机视觉三大会之一的 Conference on Comput

IJCAI_论文-深度学习-Deep Learning for Event-Driven Stock Prediction

Deep Learning for Event-Driven Stock Prediction Reading time:2019/3/30-2019/4/12  Theme:Deep learning; CNN; NLP Abstract: We propose a deep learning method for eventdriven stock market prediction. First, events are extracted from news text, and repre

python数据可视化、数据挖掘、机器学习、深度学习 常用库、IDE等

一.可视化方法 条形图 饼图 箱线图(箱型图) 气泡图 直方图 核密度估计(KDE)图 线面图 网络图 散点图 树状图 小提琴图 方形图 三维图 二.交互式工具 Ipython.Ipython notebook Plotly 三.Python IDE类型 PyCharm,指定了基于Java Swing的用户界面 PyDev,基于SWT的用户界面(适用Eclipse) IEP(Interactive Editor for Pyhton),交互式编辑器 Enthought中的Canopy:以PyQt

基于深度学习的图像语义分割技术概述之背景与深度网络架构

图像语义分割正在逐渐成为计算机视觉及机器学习研究人员的研究热点.大量应用需要精确.高效的分割机制,如:自动驾驶.室内导航.及虚拟/增强现实系统.这种需求与机器视觉方面的深度学习领域的目标一致,包括语义分割或场景理解.本文对多种应用领域语义分割的深度学习方法进行概述.首先,我们给出本领域的术语及主要背景知识.其次,介绍主要的数据集及难点,以帮助研究人员找到合适的数据集和研究目标.之后,概述现有方法,及其贡献.最后,给出提及方法的量化标准及其基于的数据集,接着是对于结果的讨论.最终,对于基于深度学习