实验内容
- 设计一个原始的神经网络。记录其运行时间和模型大小和准确率。
- 对该网络进行剪枝操作,记录其运行时间和模型大小和准确率。
- 对剪枝后的几个网络分别分部做rebirth,记录其运行时间和模型大小和准确率。
- 对所有之前涉及的网络做mobile net 。记录其运行时间和模型大小和准确率。
实验基础
原始神经网络的架构 (被舍弃)如下:
经过测试,以上的神经网络的架构训练网络很难,原始模型在训练10epoch后准确率才超过50%,后面根据该模型改写的mobile net 根本就没法训练了,正确率始终是10%左右,这根瞎猜没区别了。更换神经网络架构,后来还是采用了之前用的架构,如下:
虽然直接跟换以后解决了上面模型的问题,但这个问题,我不是很能想明白,前面的网络的最前面的并行网络的设计,我是参照GoogLeNet设计的,为什么效果这么差。后来通过- 数据集 :mnist手写数字的数据集。
实验详情记录
训练难度对比
- 原始网络 的准确度曲线如下,我们可以看到不到2K 步,正确率就基本在0.9几了。
- mobile net 的准确度曲线如下,我们可以看到前期准确度一直很低很低,知道6k 步以后才慢慢上升,直到10k以后才达到90%多。
对比以上两个网络,我们可以明显的看出,经过使用mobile net 改造后的网络训练难度明显很高,我的电脑跑得很慢,我前期差点就要放弃了。
训练准确度,时间,模型大小
实验步骤与数据。
1. 先训练具有上面架构的原始模型t001.pb,记录模型的大小,预测速度,和准确度。
2. 对原始模型进行迭代剪枝7轮,得到t101.pb,t102.pb,…t107.pb七个模型。分别记录模型的大小,预测速度,和准确度。(conv2,conv3,fc1,表示对应层的输出)
3.对原始模型和剪枝后的模型进行rebirth,由于rebirth后的模型大小不变,主要记录其速度和准确度。(时间1和时间2,只是进行了分别跑了两次,记录下来的,可以证明预测速度受电脑状态的影响还是有点大)
4. 对前面rebirth 后的模型再进行剪枝。(使用前面rebirth后的结果进行剪枝,比如 t501 对应t401、t502对应t402)
5. 根据原始模型t001.pb和剪枝一次后的模型t101.pb分别构建对应的mobile net 模型t201.pb(原始模型) 和 201.pb(剪枝一次后的模型)。
实验结果分析
1. 剪枝对于缩小模型大小和加快速度都有很好的效果。
2. rebirth在加快速度方面有很好的效果。
3. 将 剪枝 和rebirth 结合起来,反复迭代,可以得到一个很小,速度很快,准确度也不受影响的模型。
4. mobile net 可以加快速度,但训练难度较大。
遗留问题
1, mobile net得到的模型的大小,反而比之前的大了。(这有可能是我的代码写得有问题,我的mobile net 部分的代码如下,希望有人能帮忙指出问题。)
代码中主要是使用depseparable_conv3v3函数代替了之前的卷积函数,以实现mobilenet的结构。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import tensorflow as tf
import tensorflow.contrib.slim as slim
import time
def depseparable_conv3v3