天道酬勤,学无止境

How to modify batch normalization layers (DeconvNet) to be able to run with caffe?

I wanted to run the Deconvnet on my data, however it seemd it has been written for another version of caffe. Does anyone know how to change batch_params?

The one that is in Deconvnet

layers { bottom: 'conv1_1' top: 'conv1_1' name: 'bn1_1' type: BN
  bn_param { scale_filler { type: 'constant' value: 1 }
             shift_filler { type: 'constant' value: 0.001 }
             bn_mode: INFERENCE } }

And the one that Caffe provides for cifar10 example:

layer {
  name: "bn1"
  type: "BatchNorm"
  bottom: "pool1"
  top: "bn1"
  batch_norm_param {
    use_global_stats: true
  }
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  include {
    phase: TEST
  }
}

Once I wanted to run it show me the following error first:

I1029 13:46:47.156885 11601 solver.cpp:87] Creating training net from net file: train_val.prototxt
[libprotobuf ERROR google/protobuf/text_format.cc:299] Error parsing text-format caffe.NetParameter: 59:3: Unknown enumeration value of "BN" for field "type".
F1029 13:46:47.157971 11601 upgrade_proto.cpp:88] Check failed: ReadProtoFromTextFile(param_file, param)

and after changing BN into BatchNorm, it shows new error about parameters:

I1029 14:03:38.497725 12097 solver.cpp:87] Creating training net from net file: train_val.prototxt
[libprotobuf ERROR google/protobuf/text_format.cc:299] Error parsing text-format caffe.NetParameter: 59:3: Unknown enumeration value of "BatchNorm" for field "type".
F1029 14:03:38.503345 12097 upgrade_proto.cpp:88] Check failed: ReadProtoFromTextFile(param_file, param)

Has anyone tried to train Deconvnet? if yes could you please guide me? Thanks

评论

Could you please let me know if this is correct to change like this?

layer {
  name: "bn1_1"
  type: "BatchNorm"
  bottom: "conv1_1"
  top: "conv1_1"
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  include {
    phase: TEST
  }
  batch_norm_param {
    use_global_stats: true
  }
}
layer {
  name: "scale_conv1_1"
  type: "Scale"
  bottom: "conv1_1"
  top: "conv1_1"
  scale_param {
    bias_term: true
    bias_filler {
      type: "constant"
      value: 0.001
    }
  }
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • “BatchNorm”层应该如何在caffe中使用?(How should “BatchNorm” layer be used in caffe?)
    问题 我对如何在模型中使用/插入“BatchNorm”层感到有些困惑。 我看到了几种不同的方法,例如: ResNets: "BatchNorm" + "Scale" (无参数共享) "BatchNorm"层紧随其后的是"Scale"层: layer { bottom: "res2a_branch1" top: "res2a_branch1" name: "bn2a_branch1" type: "BatchNorm" batch_norm_param { use_global_stats: true } } layer { bottom: "res2a_branch1" top: "res2a_branch1" name: "scale2a_branch1" type: "Scale" scale_param { bias_term: true } } cifar10 示例:仅"BatchNorm" 在 caffe 提供的 cifar10 示例中,使用"BatchNorm"没有任何"Scale" : layer { name: "bn1" type: "BatchNorm" bottom: "pool1" top: "bn1" param { lr_mult: 0 } param { lr_mult: 0 } param { lr_mult: 0 } } cifar10
  • DL笔记:Ubuntu16.04安装cuda-8.0+cudnn5.1+opencv-3.1+caffe+本地浏览器访问服务器jupyter notebook设置
    Ubuntu16.04安装cuda-8.0+cudnn+opencv-3.1+caffe教程! 文章目录 一、安转cuda+cudnn1.1、安转cuda1.2、安转cudnn 二、安转opencv-3.12.1、安装依赖库2.2、问题1: 下载ippicv_linux_20151201失败2.3、问题2: CUDA 8.0不支持OpenCV的GraphCut算法 三、安转caffe(convolutional architecture for feature embedding)3.1、caffe简介3.2、修改Makefile.config文件内容3.3、修改caffe目录下的Makefile文件内容3.4、编译 四、caffe简单例子4.1、准备数据4.2、定义网络结构4.3、配置solver文件4.4、评估模型执行的时间4.5、训练模型4.6、分析结果4.7、本地浏览器访问服务器jupyter notebook设置 参考文献 一、安转cuda+cudnn cuda8.0+cudnn5.1百度云下载链接: 提取码:0ls9 1.1、安转cuda 安装ssh工具:备注:这一步需要到服务器桌面上的命令窗口输入,这一步完成后,就可以用ssh工具远程连接服务器了,本文使用的是XShell。 sudo apt-get install openssh-server 参考我之前的链接
  • TensorRT介绍、安装和测试
    1. What is TensorRT ? TensorRT的核心是一个C++库,能在NVIDIA的图像处理单元(GPU)上进行高性能的推断。它为与TensorFlow, Caffe, PyTorch, MXNet等主流训练框架进行互补工作而设计,专注于在GPU上高效地运行训练好的网络,生成预测结果。 有些训练框架,如TensorFlow,已经集成了TensorRT,所以能够直接在框架内部加速推断。除此之外,TensorRT可以用作应用程序中的库。它包含了一些用于导入TensorFlow, Caffe, PyTorch, MXNet等不同框架模型的解析器,提供了C++和Python 的API来构建模型。     TensorRT通过组合层和优化内核选择来优化网络,从而能改善延迟、吞吐量、功效和内存消耗,如果需要的化,可以以较低精度的方式运行来进一步提升模型运算的性能。   TensorRT被定义为高性能推理优化器和部件运行引擎的一部分,它接受在一些主流框架上训练的模型,优化神经网络计算,生成轻量级运行引擎。 1.1 Benefits Of TensorRT 主要在以下几个方面:   吞吐量: 通过 推理量/每秒 或 样本量/每秒 来衡量;   效率:单位功率的吞吐量,通常表示为性能/瓦特   延迟:执行推理需要的时间,通常是毫秒级   准确率:训练的模型提供准确答案的能力
  • caffe训练自己的数据
    之前学习caffe一直到mnist训练就停止了,因为没有自己的数据。后来参考一些博客整理了一下其他数据集的训练。 一、准备数据 这个是参考博客中准备的数据,共有500张图片,分为大巴车、恐龙、大象、鲜花和马五个类,每个类100张。需要的同学,可到网盘下载:http://pan.baidu.com/s/1nuqlTnN 编号分别以3,4,5,6,7开头,各为一类。我从其中每类选出20张作为测试,其余80张作为训练。因此最终训练图片400张,测试图片100张,共5类。我将图片放在caffe根目录下的data文件夹下面。即训练图片目录:data/re/train/ ,测试图片目录: data/re/test/ 二、转换为lmdb格式 具体的转换过程,可参见我的前一篇博文:Caffe学习系列(11):图像数据转换成db(leveldb/lmdb)文件 首先,在examples下面创建一个myfile的文件夹,来用存放配置文件和脚本文件。然后编写一个脚本create_filelist.sh,用来生成train.txt和test.txt清单文件 # sudo mkdir examples/myfile # sudo vi examples/myfile/create_filelist.sh 编辑此文件,写入如下代码,并保存 #!/usr/bin/env sh DATA=data/re/ MY
  • caffe:模型定义:使用 caffe.NetSpec() 编写不同阶段的相同层(caffe: model definition: write same layer with different phase using caffe.NetSpec())
    问题 我想用 python 设置一个 caffe CNN,使用caffe.NetSpec()接口。 虽然我看到我们可以将测试网络放在solver.prototxt ,但我想将其写在不同阶段的model.prototxt 。 例如,caffe 模型 prototxt 实现了两个不同阶段的数据层: layer { name: "data" type: "Data" top: "data" top: "label" include { phase: TRAIN } .... } layer { name: "data" type: "Data" top: "data" top: "label" include { phase: TEST } .... } 我应该如何在 python 中获得这样的实现? 回答1 我假设您的意思是在使用caffe.NetSpec编写 prototxt 时如何定义阶段? from caffe import layers as L, params as P, to_proto import caffe ns = caffe.NetSpec() ns.data = L.Data(name="data", data_param={'source':'/path/to/lmdb','batch_size':32}, include={'phase':caffe
  • 如何修改 C++ API 的 Caffe 网络输入?(How to modify Caffe network input for C++ API?)
    问题 我正在尝试通过 C++ API 使用 MINST Caffe 示例,但在解决如何重构训练后将部署的网络 prototxt 文件时遇到了一些麻烦。 我已经用原始文件 (lenet_train_test.prototxt) 训练和测试了模型,但是当我想部署它并像在 C++ 和 OpenCV 示例中那样进行预测时,我意识到我必须修改输入部分以使其类似于他们拥有的 deploy.prototxt 文件。 我可以将 lenet_train_test.prototxt 的训练和测试层中的信息替换为 deploy.prototxt 文件的这一部分吗? name: "CaffeNet" input: "data" input_shape { dim: 10 dim: 3 dim: 227 dim: 227 } 我将传递给网络进行分类的图像将是灰度和 24*24 像素,而且我还想像使用 MINST 数据集一样缩放它,所以我可以修改这个部分吗? name: "CaffeNet" input: "data" input_shape { dim: 10 dim: 1 dim: 24 dim: 24 } transform_param { scale: 0.00390625 } 不过,我不完全确定“ dim: 10 ”是从哪里来的。 回答1 为了将您的train_val prototxt“转换”为部署
  • 使用Caffe训练CSV数据的Lenet(use caffe to train Lenet with CSV data)
    问题 打扰一下,我对使用caffe采集高清数据有疑问吗? 我尝试通过以下步骤在Kaggle mnist csv数据上运行示例 使用h5py将其转换为h5数据。 (我使用caffe-example.py进行转换) 然后修改lenet_train_test_prototxt并对其进行培训。 我对这一步不知所措。 我在这里所做的唯一更改是 layer { name: "mnist" type: "HDF5Data" top: "data" top: "label" include { phase: TRAIN } transform_param { scale: 0.00390625 } data_param { source: "data/mnist_train_h5.txt" batch_size: 64 } } 如何更改lenet_train_test_prototxt以适合数据? 还是还有一些其他文件需要更改? 错误日志是 enF0724 18:21:11.052737 79373 hdf5_data_layer.cpp:76] Check failed: !this->layer_param_.has_transform_param() HDF5Data does not transform data. > *** Check failure stack trace: ***
  • ubuntu tensorRT5.1.5.0 sample yolov3转onnx转trt,pytorch转onnx转trt推理
    tensorRT5.1.5.0安装 官网安装并解压:https://developer.nvidia.com/nvidia-tensorrt-5x-download 添加环境变量: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wxy/TensorRT-5.1.5.0/lib pip安装python版本,装在你的python环境下 cd TensorRT-5.1.5.0/python pip install tensorrt-5.1.5.0-cp36-none-linux_x86_64.whl ##验证是否成功 import tensorrt yolov3转onnx转trt yolov3转onnx 官方推荐python2,修改一下代码python3也可以运行,yolov3_to_onnx.py修改 1.parse_cfg_file函数里面remainder = cfg_file.read().decode() 2.if sys.version_info[0] > 2:这两句话判断python版本的注释掉 3.download_file函数md5哈希验证取消掉就可以了 执行python yolov3_to_onnx.py onnx转trt 会出现’NoneType’ object has no attribute ‘serialize’
  • Prediction in Caffe - Exception: Input blob arguments do not match net inputs
    I'm using Caffe for classifying non-image data using a quite simple CNN structure. I've had no problems training my network on my HDF5-data with dimensions n x 1 x 156 x 12. However, I'm having difficulties classifying new data. How do I do a simple forward pass without any preprocessing? My data has been normalized and have correct dimensions for Caffe (it's already been used to train the net). Below is my code and the CNN structure. EDIT: I've isolated the problem to the function '_Net_forward' in pycaffe.py and found that the issue arises as the self.input dict is empty. Can anyone explain
  • 修改多个输入的 Caffe C++ 预测代码(Modifying the Caffe C++ prediction code for multiple inputs)
    问题 我实现了 Caffe C++ 示例的修改版本,虽然它工作得很好,但速度非常慢,因为它只接受一张一张的图像。 理想情况下,我想向 Caffe 传递一个包含 200 张图像的向量,并为每个图像返回最佳预测。 我从王方林那里得到了很大的帮助,并实施了他的一些建议,但我仍然无法弄清楚如何从每张图像中检索出最佳结果。 Classify 方法现在传递了一个cv::Mat对象向量(变量input_channels ),它是一个灰度浮点图像向量。 我已经取消了代码中的预处理方法,因为我不需要将这些图像转换为浮点数或减去平均图像。 我也一直试图摆脱N变量,因为我只想返回每个图像的最高预测和概率。 #include "Classifier.h" using namespace caffe; using std::string; Classifier::Classifier(const string& model_file, const string& trained_file, const string& label_file) { #ifdef CPU_ONLY Caffe::set_mode(Caffe::CPU); #else Caffe::set_mode(Caffe::GPU); #endif /* Load the network. */ net_.reset(new Net
  • 如何以HDF5格式输入Caffe多标签数据?(How to feed caffe multi label data in HDF5 format?)
    问题 我想使用带有矢量标签而不是整数的caffe。 我检查了一些答案,看来HDF5是更好的方法。 但是后来我陷入了像这样的错误: outer_num_ * inner_num_ == bottom[1]->count() :34]检查失败: outer_num_ * inner_num_ == bottom[1]->count() (50 vs. 200)标签数目必须与预测数目相匹配; 例如,如果标签轴== 1且预测形状为(N,C,H,W),则标签计数(标签数量)必须为N*H*W ,且整数值为{0,1,..., C-1}。 HDF5创建为: f = h5py.File('train.h5', 'w') f.create_dataset('data', (1200, 128), dtype='f8') f.create_dataset('label', (1200, 4), dtype='f4') 我的网络是由以下人员生成的: def net(hdf5, batch_size): n = caffe.NetSpec() n.data, n.label = L.HDF5Data(batch_size=batch_size, source=hdf5, ntop=2) n.ip1 = L.InnerProduct(n.data, num_output=50, weight_filler
  • Neural Networks and Deep Learning读书笔记--卷积神经网络应用:手写数字识别
    已经明白了卷积神经网络后面的核心思想,想要通过实现一些卷积网络,并将它们应用于 MNIST 数字分类问题,来看看它们如何在实践中工作。 使用的程序是 network3.py,它是前面章节开发的 network.py 和 network2.py 的强化版本。程序 network.py 和 network2.py 是用 Python 和矩阵库 Numpy 实现的。这些程序从最初的原理工作,并致力于反向传播、随即梯度下降等细节。 network3.py 使用一个称为 Theano 的机器学习库[1]。使用 Theano 使得实现针对卷积神经网络的反向传播很容易,因为它自动计算涉及到的映射。特别地,Theano 的一个非常好的特性是它能够运行于 CPU 或者,如果可以,GPU 上。运行于 GPU 上可以提供显著的增速,而且,有助于实际用于更复杂的网络。 ([1]参见 Theano: A CPU and GPU Math Expression Compiler in Python (http://www.iro.umontreal.ca/~lisa/pointeurs/theano_scipy2010.pdf),作者为 James Bergstra, Olivier Breuleux, Frederic Bastien, Pascal Lamblin, fRavzan Pascanu,
  • 在 Caffe 中训练期间更改输入数据层(Changing the input data layer during training in Caffe)
    问题 是否可以动态更改ImageData层或MemoryData层的输入源? 我试图在每个时期对数据进行洗牌,但我同时拥有图像和其他一些非图像特征,我想在网络的后期连接这些特征。 我找不到一种可靠的方法来以保持两者对齐的方式对图像和其他数据进行混洗。 因此,我正在考虑在每个时期重新生成imagelist.txt以及非图像数据(在内存中),并将新文件附加到ImageData层并用新数据初始化MemoryDataLayer 。 如何确保在不重新启动训练过程的情况下使用新文本文件重新初始化网络。 (我希望网络在同一阶段继续训练,动量等等,只从新文件而不是最初编译的文件中读取图像文件)。 layer { name: "imgdata" type: "ImageData" top: "imgdata" top: "dlabel" transform_param { # Transform param here } image_data_param { source: "path to imagelist.txt" ## This file changes after n iterartions batch_size: XX new_height: XXX new_width: XXX } } 同样,我希望能够将重新洗牌的数据复制到MemoryData层。 我可以在训练过程中调用Net.set
  • ImageDataLayer 和 LMDB 数据层之间的速度(The speed between ImageDataLayer and LMDB data layer)
    问题 Caffe 支持 LMDB 数据层和 ImageDataLayer。 从某些数据集创建 LMDB 数据库需要一些时间和大量空间。 相比之下,ImageDataLayer 只使用一个 txt 文件,非常方便。 我的问题是,这两种层之间的速度差异大吗? 非常感谢你! 回答1 LMDB旨在更快地从给定的key value获取数据。 此外,数据以未压缩的格式存储,这使得机器可以轻松读取数据并将其直接传递给GPU进行处理。 在ImageDataLayer 中,我们必须从文本文件中读取图像细节,并使用 OpenCV 将图像读取到内存中。 图像的这种解压缩在计算上是昂贵的。 但是最好的性能可能并不总是针对 LMDB 层,它在很大程度上取决于机器的配置。 考虑一个批量大小为 256 的图像和大小为 227x227x3 的图像的示例。 还要考虑您使用的是非常好的 GPU 和高端 i8 处理器机器。 这里 LMDB 格式的单个图像可能会占用 151KB。 整批可能占用 37MB。 如果 GPU 每秒能够执行 10 个批次,那么硬盘的读取速度应该为 370MB/s。 如果使用普通的SATA或者外置硬盘,由于硬盘的限制,读取这么大块的数据会出现瓶颈。 如果 caffe 无法以所需的速度获取数据,则瓶颈会减慢整个训练过程,甚至更糟。 同时,如果您正在读取 256 张图像并使用 OpenCV 的多核版本
  • 训练期间难治的常见原因(Common causes of nans during training)
    问题 我注意到在训练期间经常发生的是NAN 。 通常,它似乎是通过权重引入内部产品/完全连接或卷积层中的。 这是由于梯度计算正在爆炸而发生的吗? 还是因为权重初始化(如果是这样,为什么权重初始化会产生这种效果)? 还是可能是由于输入数据的性质引起的? 这里的首要问题很简单:在训练过程中发生NAN的最常见原因是什么? 其次,有什么方法可以解决这个问题(为什么它们起作用)? 回答1 好问题。 我多次遇到这种现象。 这是我的观察结果: 渐变爆炸 原因:梯度大会使学习过程偏离轨道。 您应该期待的是:查看运行时日志,您应该查看每个迭代的损失值。 您会注意到,损失在迭代之间开始显着增长,最终损失将太大而无法用浮点变量表示,并且它将变为nan 。 您可以做什么:将base_lr (在Solver.prototxt中)减少一个数量级(至少)。 如果您有多个损耗层,则应检查日志以查看是哪个层造成了梯度爆炸,并减少了该特定层(而不是一般的base_lr )的loss_weight (在train_val.prototxt中)。 不良的学习率政策和参数 原因: caffe无法计算有效的学习率,而是获取'inf'或'nan' ,该无效率会乘以所有更新,从而使所有参数无效。 您应该期望的是:查看运行时日志,您应该看到学习率本身变为'nan' ,例如: ... sgd_solver.cpp:106]
  • 将 Tensorflow 模型转换为 Caffe 模型(Convert Tensorflow model to Caffe model)
    问题 我希望能够将 Tensorflow 模型转换为 Caffe 模型。 我在谷歌上搜索,但我只能找到从 caffe 到 tensorflow 的转换器,但不能找到相反的转换器。 有没有人知道如何做到这一点? 谢谢,埃维 回答1 我遇到了同样的问题并找到了解决方案。 代码可以在这里找到 (https://github.com/lFatality/tensorflow2caffe),我还在一些 Youtube 视频中记录了代码。 第 1 部分介绍了在 Caffe 和 tflearn 中创建 VGG-19 架构(TensorFlow 的更高级别 API,对原生 TensorFlow 的代码进行一些更改也应该可以工作)。 在第 2 部分中,描述了将 TensorFlow 模型中的权重和偏差导出到 numpy 文件中。 在 tflearn 中,您可以像这样获得层的权重: #get parameters of a certain layer conv2d_vars = tflearn.variables.get_layer_variables_by_name(layer_name) #get weights out of the parameters weights = model.get_weights(conv2d_vars[0]) #get biases out of the
  • 目标检测之SSD学习笔记
    SSD学习笔记 惯例,先放大佬链接(https://zhuanlan.zhihu.com/p/31427288) SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,截至目前是主要的检测框架之一,相比Faster RCNN有明显的速度优势,相比YOLO又有明显的mAP优势。(当然YOLOv3是比不过了) SSD具有如下主要特点: 1、从YOLO中继承了将detection转化为regression的思路,一次完成目标定位与分类 2、基于Faster RCNN中的Anchor,提出了相似的Prior box; 3、加入基于特征金字塔(Pyramidal Feature Hierarchy)的检测方式,即在不同感受野的feature map上预测目标 本文接下来都以SSD 300为例进行分析。 上图2是原论文中的SSD300与YOLO网络结构图。位什么要把SSD与YOLO对比呢?因为截止到目前目标检测分为了2种主流框架: 1、Two stages:以Faster RCNN为代表,即RPN网络先生成proposals目标定位,再对proposals进行classification+bounding box regression完成目标分类。 2、Single shot:以YOLO/SSD为代表
  • Caffe 中的预测 - 例外:输入 blob 参数与净输入不匹配(Prediction in Caffe - Exception: Input blob arguments do not match net inputs)
    问题 我正在使用 Caffe 使用非常简单的 CNN 结构对非图像数据进行分类。 我在尺寸为 nx 1 x 156 x 12 的 HDF5 数据上训练我的网络没有问题。但是,我在对新数据进行分类时遇到了困难。 如何在没有任何预处理的情况下进行简单的前向传递? 我的数据已经标准化并且具有正确的 Caffe 维度(它已经被用于训练网络)。 下面是我的代码和 CNN 结构。 编辑:我已将问题与 pycaffe.py 中的函数“_Net_forward”隔离,并发现问题出现是因为 self.input dict 为空。 谁能解释这是为什么? 该集合应该等于来自新测试数据的集合: if set(kwargs.keys()) != set(self.inputs): raise Exception('Input blob arguments do not match net inputs.') 我的代码发生了一些变化,因为我现在使用 IO 方法将数据转换为数据(见下文)。 这样我就用正确的数据填充了 kwargs 变量。 即使是小提示也将不胜感激! import numpy as np import matplotlib import matplotlib.pyplot as plt # Make sure that caffe is on the python path: caffe
  • Changing the input data layer during training in Caffe
    Is it possible to change the input source of ImageData layer or a MemoryData layer on the fly? I am trying to shuffle the data every epoch but I have both image and some other non-image features that I want to concatenate at a later stage in the network. I could not find a reliable way to shuffle both the image and my other data in a way that preserves the alignment of the two. So, I am thinking of re-generating the imagelist.txt as well as nonimage data (in Memory) every epoch and attach the new file to the ImageData layer and initialize MemoryDataLayer with the new data. How can I make sure
  • 图像分类经典卷积神经网络—ZFNet论文翻译(中英文对照版)—Visualizing and Understanding Convolutional Networks(可视化和理解卷积网络)
    图像分类经典论文翻译汇总:[翻译汇总] 翻译pdf文件下载:[下载地址] 此版为中英文对照版,纯中文版请稳步:[ZFNet纯中文版] Visualizing and Understanding Convolutional Networks 可视化和理解卷积网络 Matthew D. Zeiler Rob Fergus Dept. of Computer Science, New York University, USA(美国纽约大学计算机科学系) {zeiler,fergus}@cs.nyu.edu Abstract Large Convolutional Network models have recently demonstrated impressive classification performance on the ImageNet benchmark Krizhevsky et al. [18]. However there is no clear understanding of why they perform so well, or how they might be improved. In this paper we explore both issues. We introduce a novel visualization technique that