之前我们在使用cnn做图片分类的时候使用了CIFAR-10数据集

其他框架对于CIFAR-10的图片分类是怎么做的

来与TensorFlow做对比。

Caffe Keras

安装

官方安装文档:

https://github.com/IraAI/caffe-gpu-installation

https://github.com/BVLC/caffe/tree/windows

windows下安装gpu加速版的caffe

mark

使用的数据集依然是CIFAR-10,使用的也依然是卷积神经网络。查看有什么不同点和相同点。

十种分类。

准备数据

把图片转成leveldb格式,对图片做均值。

mark

里面是一个官方给出来的例子,如何使用caffe 对cifar10做分类。

caffe-master/examples/cifar10/create_cifar10.sh

是一个bash脚本: 作用是转换cifar数据到 into leveldb format.

定义了两个目录变量和数据类型

EXAMPLE=examples/cifar10
DATA=data/cifar10
DBTYPE=lmdb

删除指定目录下的文件

echo "Creating $DBTYPE..."rm -rf $EXAMPLE/cifar10_train_$DBTYPE $EXAMPLE/cifar10_test_$DBTYPE

调用了convert_cifar_data.bin 二进制文件。 指定参数,就可以下载,解压,格式化。

计算图片的均值。compute_image_mean 输入参数 backend: 数据类型。

计算均值,保存到mean.binaryproto文件中

  • 将数据转换为lmdb格式,保存到磁盘中。

  • 计算image文件的均值。保存。

这里用到的两个命令是c++编写的,也可以阅读源代码变成python脚本。

网上也有这个数据脚本的python实现代码

http://research.beenfrog.com/code/2015/05/04/write-leveldb-lmdb-using-python.html

就是根据c++代码改写的。这两个数据格式都是键值对的格式。

训练模型

caffe-master/examples/cifar10/train_quick.sh

#!/usr/bin/env shset -e

TOOLS=./build/tools

定义一个存放的目录

调用tools目录下的caffe 主程序。

$TOOLS/caffe train \
  --solver=examples/cifar10/cifar10_quick_solver.prototxt $@

第一个参数指定训练,第二个参数指定模型

cifar10_quick_solver.prototxt

超参数和模型的结构定义与描述。

# The train/test net protocol buffer definitionnet: "examples/cifar10/cifar10_quick_train_test.prototxt"

网络结构:
caffe-master/examples/cifar10/cifar10_quick_train_test.prototxt

我们在使用TensorFlow时是使用python脚本定义的网络结构。有多少层什么的。

caffe使用一个描述文件来描述。

第二次的时候从第一次的模型快照处继续运行。

# reduce learning rate by factor of 10 after 8 epochs$TOOLS/caffe train \
  --solver=examples/cifar10/cifar10_quick_solver_lr1.prototxt \
  --snapshot=examples/cifar10/cifar10_quick_iter_4000.solverstate $@

两次的变化只是学习率不同。

模型的描述文件

mark

  • 训练参数,初始化参数: 网络描述

caffe中有方法可以将模型的描述文件打印成图表

caffe-master/examples/cifar10/cifar10_quick_train_test.prototxt

http://ethereon.github.io/netscope/#/editor

mark

第一层是数据层。卷积层 池层 卷积层 池层 全连接 激励函数。 softmax

本地版本:

https://graphviz.gitlab.io/_pages/Download/Download_windows.html# 下载Graphvizpip install pydot
python draw_net.py C:\Users\mtian\PycharmProjects\NeuralNetworksGetStarted\caffe-master\examples\cifar10\cifar10_quick_train_test.prototxt ./cifar.png

运行的画图py文件,位于caffe python下。

三个参数: 1. 网络模型的ProtoTXT文件 2. 保存的图片路径 3. 从左到右。

–rankdir=x , x 有四种选项,分别是LR, RL, TB, BT 。

画图报错:

Traceback (most recent call last):
  File "draw_net.py", line 9, in <module>    import caffe.draw
  File "C:\software\caffe\python\caffe\draw.py", line 31, in <module>
    pydot_find_graphviz = pydot.graphviz.find_graphviz
AttributeError: module 'pydot_ng' has no attribute 'graphviz'

查看这个文件可以看到里面写着解决方案

pip install pydot-plustry:    # Try to load pydotplus
    import pydotplus as pydot

给这个描述文件起一个名字

name: "CIFAR10_quick"

定义每一层,名字,类型,top有两个一个是data 一个是label。数据层的top有两个

layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"

mark

训练阶段调用这一层

  include {    phase: TRAIN
  }

图片的均值文件所放的路径。

  transform_param {    mean_file: "examples/cifar10/mean.binaryproto"
  }

图片的训练数据路径,batchsize的大小。训练数据存储的方式

  data_param {    source: "examples/cifar10/cifar10_train_lmdb"
    batch_size: 100
    backend: LMDB
  }

接下来又定义了一层

layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mean_file: "examples/cifar10/mean.binaryproto"
  }
  data_param {
    source: "examples/cifar10/cifar10_test_lmdb"
    batch_size: 100
    backend: LMDB
  }
}

跟上一层一模一样,只不过指定了阶段是TEST

测试集入口和训练集入口

卷积层

layer {  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }  param {    lr_mult: 2
  }  convolution_param {    num_output: 32
    pad: 2
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "gaussian"
      std: 0.0001
    }    bias_filler {      type: "constant"
    }
  }
}

起个名字,类型卷积层。bottom是data也就是上一层的名字。上一层的top对应下一层的bottom

top是conv1

mark

指定了一下w和b的学习率。以及卷积层的相关参数

  • 总共有多少个output的feature map

  • padding 过滤器大小 步长

  • w的初始化方式: 高斯 方差

  • b的初始化方式: 类型

池层

layer {  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 2
  }
}

类型池层。 bottom是conv1 top是pool1

mark

池层的参数: 取最大值的pool(或均值)

池层出来的结果过relu 激励函数。它的bottom和top是一个

mark

把数据过完relu之后又返回pool1.

定义第二个卷积层。relu层。池层。 卷积层。 全连接层

计算test上的准确率,计算loss值。使用的类型softmax

mark

caffe的官方网站上就介绍了这些data loss

数据layers 卷积层。可以看到input output

http://caffe.berkeleyvision.org/tutorial/

给你一个sample如何定义一个卷积。每个参数的意思。

Solver 定义你所使用的优化方式。

Loss 定义损失。

keras是怎样做的

keras比theano 或者TensorFlow写代码简洁很多。

中文文档:

https://keras-cn.readthedocs.io/en/latest/

上手keras。源代码工程中。

7-3 keras-master/examples/cifar10_cnn.py

引入一些我们工程需要的包

from __future__ import print_functionimport kerasfrom keras.datasets import cifar10from keras.preprocessing.image import ImageDataGeneratorfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Activation, Flattenfrom keras.layers import Conv2D, MaxPooling2Dimport os
batch_size = 32num_classes = 10epochs = 100data_augmentation = Truenum_predictions = 20save_dir = os.path.join(os.getcwd(), 'saved_models')
model_name = 'keras_cifar10_trained_model.h5'

定义网络训练所需要的超参数

# The data, split between train and test sets:(x_train, y_train), (x_test, y_test) = cifar10.load_data()

读取数据分为训练数据,测试数据。

model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
                 input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25)) model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25)) model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

我们要把网络结构层加入到sequential中

官方文档中有激励函数的说明。Flatten展开成1维的。

过最后一个全连接层的时候,总共有10类。

keras是一个高层次的封装。简单的网络结构。

# initiate RMSprop optimizeropt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)

告诉我们的模型使用的是什么损失函数

# Let's train the model using RMSpropmodel.compile(loss='categorical_crossentropy',
              optimizer=opt,
              metrics=['accuracy'])

模型训练fit,以前我们是训练多少轮,每轮里面有多少个batch

    model.fit(x_train, y_train,
              batch_size=batch_size,
              epochs=epochs,
              validation_data=(x_test, y_test),
              shuffle=True)

注明验证数据集是什么。是否需要打乱。

keras是基于theano和TensorFlow之上的。

更改后端。厦门叉车价格是多少

keras代码简洁。caffe使用文件配置模型描述。

mark

课程总结

神经元 激励函数 神经网络 神经网络中的梯度下降 前向传播 反向更新

随机梯度下降 简单版本神经网络

提高神经网络的学习效率: 并行计算 梯度消失问题 归一化

参数初始化 正则化 学习率 Dropout 交叉熵

简单版本的前馈神经网络 增加代码提高学习效率

卷积神经网络 全连接神经网络对比 卷积核 卷积层(参数)

池化层(池化层参数) 典型的卷积神经网络 如何使用卷积神经网络做图片识别

softmax层 theano实现卷积神经网络

TensorFlow框架 线性回归 TensorBoard

手写数字识别 图片分类(cnn) 单gpu 多gpu

其他两个框架与TensorFlow对比。caffe keras

神经网络的算法和原理有初步的了解。

rnn神经网络原理 与 应用 游戏ai

卷积神经网络做图像风格变化。 人脸识别。

深度学习之神经网络核心原理与算法-caffe&keras框架图片分类的更多相关文章

  1. Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1

    3.Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1 http://blog.csdn.net/sunbow0 ...

  2. Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.2

    3.Spark MLlib Deep Learning Convolution Neural Network(深度学习-卷积神经网络)3.2 http://blog.csdn.net/sunbow0 ...

  3. 针对深度学习(神经网络)的AI框架调研

    针对深度学习(神经网络)的AI框架调研 在我们的AI安全引擎中未来会使用深度学习(神经网络),后续将引入AI芯片,因此重点看了下业界AI芯片厂商和对应芯片的AI框架,包括Intel(MKL CPU). ...

  4. Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.3

    3.Spark MLlib Deep Learning Convolution Neural Network(深度学习-卷积神经网络)3.3 http://blog.csdn.net/sunbow0 ...

  5. 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【四】使用CUBLAS加速计算人脸向量的余弦距离

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  6. 机器学习&深度学习基础(机器学习基础的算法概述及代码)

    参考:机器学习&深度学习算法及代码实现 Python3机器学习 传统机器学习算法 决策树.K邻近算法.支持向量机.朴素贝叶斯.神经网络.Logistic回归算法,聚类等. 一.机器学习算法及代 ...

  7. 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型

    from:http://www.freebuf.com/articles/network/139697.html DGA(域名生成算法)是一种利用随机字符来生成C&C域名,从而逃避域名黑名单检 ...

  8. 深度学习——卷积神经网络 的经典网络(LeNet-5、AlexNet、ZFNet、VGG-16、GoogLeNet、ResNet)

    一.CNN卷积神经网络的经典网络综述 下面图片参照博客:http://blog.csdn.net/cyh_24/article/details/51440344 二.LeNet-5网络 输入尺寸:32 ...

  9. 分享《机器学习实战基于Scikit-Learn和TensorFlow》中英文PDF源代码+《深度学习之TensorFlow入门原理与进阶实战》PDF+源代码

    下载:https://pan.baidu.com/s/1qKaDd9PSUUGbBQNB3tkDzw <机器学习实战:基于Scikit-Learn和TensorFlow>高清中文版PDF+ ...

随机推荐

  1. Flume性能测试报告(翻译Flume官方wiki报告)

    因使用flume的时候总是会对其性能有所调研,网上找的要么就是自测的这里找到一份官方wiki的测试报告供大家参考 https://cwiki.apache.org/confluence/display ...

  2. oracle 表的创建与管理 约束

    在 Oracle 之中数据表就被称为数据库对象,而对象的操作语法一共有三种:· 创建对象:CREATE 对象类型 对象名称 [选项]:· 删除对象:DROP 对象类型 对象名称 [选项]:· 修改对象 ...

  3. 笔记:iOS随机数与随机数据集

    //0 到 N - 1 之间的随机整数 NSUInteger r = arc4random_uniform(N); //1 到 N 之间的随机整数 NSUInteger r = arc4random_ ...

  4. 20155222卢梓杰 课堂测试ch06补做

    20155222卢梓杰 课堂测试ch06补做 1.下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为() A . 1 B . 1/4 C . 1/2 D . 3/4 正确答案 ...

  5. 20155210 潘滢昊2016-2017-2 《Java程序设计》第9周学习总结

    20155210 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC驱动的四种类型(按操作方式分类的): JDBC-ODBC Bridge Driver ...

  6. 使用开源软件 enfuse 做照片的曝光合成

    使用开源软件 enfuse 做照片的曝光合成 所谓曝光合成就是对同一场景用不同的曝光量拍摄多张照片,然后将这些照片再合成为一张照片.之所以我们要这么做是因为现在的相机感光的动态范围相比人眼实在是太小了 ...

  7. 18-[模块]-shutil

    shutil模块 高级的 文件.文件夹.压缩包 处理模块 (1)文件操作 shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中 import ...

  8. 2-功能1:基于用户认证组件和Ajax实现登录验证(图片验证码)

    1.登录页面的设计 (1)label标签的id属性 label标签的id属性,点击label标记,相当于点击了input框 bootstarp样式 class="form-group&quo ...

  9. TensorFlow Python2.7环境下的源码编译(一)环境准备

    参考: https://blog.csdn.net/yhily2008/article/details/79967118 https://tensorflow.google.cn/install/in ...

  10. [Lua] try catch实现

    参考了https://blog.csdn.net/waruqi/article/details/53649634这里的代码,但实际使用时还有些问题,修改后在此记录一下. -- 异常捕获 functio ...