ESAF有源滤波柜主开关选择厂家?

1558人阅读
caffe对于训练数据格式,支持:lmdb、h5py……,其中lmdb数据格式常用于单标签数据,像分类等,经常使用lmdb的数据格式。对于回归等问题,或者多标签数据,一般使用h5py数据的格式。当然好像还有其它格式的数据可用,本文就主要针对lmdb数据格式的制作方法,进行简单讲解。
以一个简单的例子来介绍一下如何生成自己的图像集。主要分为两步:
(1)生成标签文件列表,即生成 .txt 文件
(2)将 txt 文件列表中的图像与train图像库、val图像库的图像相连接,生成lmdb格式文件
lmdb用于单标签数据。为了简单起见,我后面通过一个性别分类作为例子,进行相关数据制作讲解。
1、数据准备
首先我们要准备好训练数据,然后新建一个名为train的文件夹和一个val的文件夹:
train文件存放训练数据,val文件存放验证数据。然后我们在train文件下面,把训练数据猫、狗图片各放在一个文件夹下面:
同样的我们在val文件下面也创建文件夹:
两个文件也是分别存我们用于验证的图片数据猫与狗图像文件。我们在test_cat下面存放了都是猫的图片,然后在test_dog下面存放的都是验证数据的狗图片。
将train 与 val 文件夹放到一个文件夹内,本文中放到了Data_Test文件夹内。
2、标签文件.txt文件制作.
接着我们需要制作一个train.txt、val.txt文件,这两个文件分别包含了我们上面的训练数据的图片路径,以及其对应的标签,如下所示。
我们把猫图片标号为1,狗图片标记为0。标签数据文件txt的生成可以通过如下代码,通过扫描路径猫、狗下面的图片,得到标签文件train.txt和val.txt:
需要注意的是,路径与标签之间是一个空格,标签最好从0开始。
&pre class=&python& name=&code&&#coding:utf-8
'''
Created on Jul 29, 2016
@author: sgg
'''
&&span style=&&font-family:Afont-size:18&&&&
&&span style=&&font-size:18&&&&
&&span style=&&font-size:18&&&&
def IsSubString(SubStrList,Str):
for substr in SubStrList:
if not(substr in Str):
flag=False
return flag
def GetFileList(FindPath,FlagStr=[]):
FileList=[]
FileNames=os.listdir(FindPath)
if len(FileNames)&0:
for fn in FileNames:
if len(FlagStr)&0:
if IsSubString(FlagStr,fn):
fullfilename=os.path.join(FindPath,fn)
FileList.append(fullfilename)
fullfilename=os.path.join(FindPath,fn)
FileList.append(fullfilename)
if len(FileList)&0:
FileList.sort()
return FileList
train_txt=open('train.txt','w')
#制作标签数据,如果是狗的,标签设置为0,如果是猫的标签为1
imgfile=GetFileList('train/train_cat')#将数据集放在与.py文件相同目录下
for img in imgfile:
str1=img+' '+'1'+'\n'
#用空格代替转义字符 \t
train_txt.writelines(str1)
imgfile=GetFileList('train/train_dog')
for img in imgfile:
str2=img+' '+'0'+'\n'
train_txt.writelines(str2)
train_txt.close()
#测试集文件列表
test_txt=open('val.txt','w')
#制作标签数据,如果是男的,标签设置为0,如果是女的标签为1
imgfile=GetFileList('val/test_cat')#将数据集放在与.py文件相同目录下
for img in imgfile:
str3=img+' '+'1'+'\n'
test_txt.writelines(str3)
imgfile=GetFileList('val/test_dog')
for img in imgfile:
str4=img+' '+'0'+'\n'
test_txt.writelines(str4)
test_txt.close()
print(&成功生成文件列表&)
将上述代码保存为.py的Python文件,运行该Python代码生成 txt 文件。
注:本文中生成txt文件时,Data_Test文件夹与生成文件列表的代码.py文件位于同一个目录下。
3、生成lmdb数据
接着我们的目的就是要通过上面的四个文件(两个txt文件列表、train与val两个图库),把图片的数据和其对应的标签打包起来,打包成lmdb数据格式:
在caffe-master创建My_Files文件夹,然后将caffe-master下的imagenet文件夹的create_imagenet.sh复制到该文件夹下进行修改,进行训练和测试路径的设置,运行该sh.
注意:这里是对.sh文件进行修改,在终端打开该文件后进行修改并保存。这里为了排版所以代码类型选择了Python代码类型。
&pre class=&python& name=&code&&#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
EXAMPLE=My_Files/Build_lmdb
#生成模型训练数据文件夹,即create_imagenet.sh所在文件夹
DATA=My_Files/Data_Test
#python脚本处理数据路径,即生成的文件列表.txt文件所在文件夹
TOOLS=build/tools
#caffe的工具库,不用更改
TRAIN_DATA_ROOT=&span style=&font-size:14&&/home/sgg/workspace/caffe_learn/scr/Data_Test/&/span&
#待处理的训练数据
VAL_DATA_ROOT=&span style=&font-size:14&&/home/sgg/workspace/caffe_learn/scr/Data_Test/&/span&
#待处理的验证数据
# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true
#是否需要对图片进行resize
if $RESIZE; then
RESIZE_HEIGHT=256
RESIZE_WIDTH=256
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
if [ ! -d &$TRAIN_DATA_ROOT& ]; then
echo &Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT&
echo &Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path& \
&where the ImageNet training data is stored.&
if [ ! -d &$VAL_DATA_ROOT& ]; then
echo &Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT&
echo &Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path& \
&where the ImageNet validation data is stored.&
echo &Creating train lmdb...&
rm -rf $EXAMPLE/train_lmdb
rm -rf $EXAMPLE/val_lmdb
#删除已存在的lmdb格式文件,若在已存在lmdb格式的文件夹下再添加lmdb文件,会出现错误
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/train_lmdb
echo &Creating val lmdb...&
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$DATA/val.txt \
$EXAMPLE/val_lmdb
echo &Done.&
这里对程序中所涉及的几个路径做简单说明:
先通过几张图了解一下每个文件夹所包含的内容与位置:
1、训练与测试图像库,即 train 与 val 文件夹所在位置,可以通过查看属性来确定其位置,本文中其位置是位于/home/sgg/workspace/caffe_learn/scr/Data_Test下
2、生成的txt文件,即 train.txt 与&test.txt 文件所在位置,可以通过查看属性来确定其位置,本文中其位置是位于/home/sgg/Downloads/caffe-master/My_Files/Data_Test下
3、生成lmdb的.sh文件,即 进行修改后的create_imagenet.sh文件所在位置,可以通过查看属性来确定其位置,本文中其位置是位于/home/sgg/Downloads/caffe-master/My_Files/Build_lmdb下
4、生成后的lmdb格式文件,即 生成的train_lmdb与val_lmdb文件夹所在位置,其位置与生成文件create_imagenet.sh位于同一目录下,本文中其位置是位于/home/sgg/Downloads/caffe-master/My_Files/Build_lmdb下
正式介绍文件中的几个路径值:
1、EXAMPLE
EXAMPLE 表示生成模型训练数据文件夹,即create_imagenet.sh所在文件夹
本文设为EXAMPLE=My_Files/Build_lmdb&&&&&,其中My_Files文件夹位于caffe-master文件夹下
DATA 表示python脚本处理数据路径,即生成的文件列表.txt文件所在文件夹
本文设为 DATA=My_Files/Data_Test&&&&&&&&&&&&
注:(1)本文开始为了测试DATA
值的设定,在该目录下直接拷贝了eclipse工作空间下的Data_Test文件,所以这里要注意这里是含有Data_Test文件夹的。
(2)该DATA路径直接写为 My_Files/Data_Test&&&,不用将其变为&/home/sgg/Downloads/caffe-master/My_Files/Data_Test
,写成这样是错误的。具体原因尚不明确。
TOOLS &表示caffe的工具库,为& TOOLS=build/tools&&&不用更改
4、TRAIN_DATA_ROOT
TRAIN_DATA_ROOT 表示待处理的训练数据,即 train 训练图像库所在位置。
(1)这里需要写具体地址,这就是为什么看地址时需要通过文件的属性进行查看具体地址,写的地址为属性中所显示的地址。
像本文train 训练图像库所在位置为& /home/sgg/workspace/caffe_learn/scr/Data_Test/train/&&&,我们经常在终端定位时写的比较简单,在终端定位时的地址为: /workspace/caffe_learn/scr/Data_Test/train/&&&,会直接省略 /home/sgg
,但如果在程序中省略的话是出错误的,所以这里的地址要是完整地址。
(2)由于我们在生成txt
文件时路径中包含了 “train” 与& val &,所以在 .sh 文件中写路径时去掉了train,将其路径定义为&
/home/sgg/workspace/caffe_learn/scr/Data_Test/& ,TRAIN_DATA_ROOT所设定的值与 txt 文件中路径两者合起来是图像的整体路径。
5、VAL_DATA_ROOT
VAL_DATA_ROOT&表示待处理的验证数据,即 val 训练图像库所在位置,其要求与TRAIN_DATA_ROOT
4、验证生成的lmdb数据
通过运行上面的脚本,我们将得到文件夹train_lmdb\val_lmdb:
我们打开train_lmdb文件夹
并查看一下文件data.mdb数据的大小,如果这个数据包好了我们所有的训练图片数据,查一下这个文件的大小是否符合预期大小,如果文件的大小才几k而已,那么就代表你没有打包成功,估计是因为路径设置错误。
通过代码将lmdb中的图像信息显示出来,即通过Python代码,将lmdb中的图像在重塑出来,同时也可以观察到图像的信息。具体代码如下:
#coding:utf-8
'''
Created on Aug 9, 2016
@author: sgg
'''
#加载必要的库
import matplotlib.pyplot as plt
import sys
from caffe.proto import caffe_pb2
import lmdb
import numpy
# 编写一个函数,将二进制的均值转换为python的均值
def read_lmdb(path,visualize = False):
env = lmdb.open(path,readonly=True)
with env.begin() as txn:
cursor = txn.cursor()
for key,value in cursor:
print 'key:',key
datum = caffe_pb2.Datum()#datum类型
#转换维datum
datum.ParseFromString(value)
#转换成numpy
#flat_x=numpy.fromstring(datum.dta,dtype=numpy.uint8)
flat_x=numpy.array(bytearray(datum.data))
#reshape大小
img_data = flat_x.reshape(datum.channels,datum.height,datum.width)
#读取datum数据
print img_data.shape
x.append(img_data)
y.append(datum.label)
if visualize:
img_data=img_data.transpose([1,2,0])
img_data = img_data[:,:,::-1]
plt.imshow(img_data)
plt.show()
print datum.label
#调用read_lmdb
read_lmdb(&/home/sgg/Downloads/caffe-master/examples/sgg_datas/train_lmdb&,True)
在生成过程中遇到了如下问题:
<span style="font-size:14 color:#、如果文件夹下含有lmdb&#26684;式的文件,那么生成时会出现错误,所以在生成之前需要对create_imagenet.sh 所在文件夹进行检查,删除之前的 lmdb 文件。代码中添加了代码,来辅助完成此检查:
rm -rf $EXAMPLE/train_lmdb
rm -rf $EXAMPLE/val_lmdb
#删除已存在的lmdb格式文件,若在已存在lmdb格式的文件夹下再添加lmdb文件,会出现错误
2、在生成lmdb过程中,出现&can&not&find&or&open&&…//////.......jpg&这个错误时,这个错误中会给出相应的图像路径:
首先,查看路径是否正确,若路径不正确,则需要更改相应的图像路径。再运行,看问题是否解决。
若问题还没有解决,则检查train.txt中,路径和标签之间是否只有一个空&#26684;!
在一些程序中,在对图像加标签时,标签与路径之间的空&#26684;使用转义字符 “& \t& ”来生成,可是在生成txt中,路径与标签之间的距离往往多于一个空&#26684;,所以在生成标签文档时,程序中用空&#26684;代替转义字符 \t& 。如下方程序所示:
str1=img+&#39; &#39;+&#39;1&#39;+&#39;\n&#39;
3、在生成lmdb过程中,出现路径错误
将文件中的路径换成绝对路径,在尝试。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:52899次
排名:千里之外
原创:32篇
转载:55篇
评论:41条
(3)(4)(1)(2)(8)(11)(5)(26)(29)Caffe源码解读之Layer(三)-爱编程
Caffe源码解读之Layer(三)
Layer涉及到的代码较多。
在Layer中,所有的Pooling,Convolve,apply nonlinearities等操作都在这里实现。在Layer中input data用bottom表示output data用top表示。每一层定义了三种操作setup(Layer初始化), forward(正向传导,根据input计算output), backward(反向传导计算,根据output计算input的梯度)。forward和backward有GPU和CPU两个版本的实现(.cu即GPU版本的实现)。
Layer又细分成了5种,分别是data_layer,neuron_layer,loss_layer,common_layer
,vision_layer,下面一一介绍。
1.data_layer主要包含与数据有关的文件。在官方文档中指出data是caffe数据的入口是网络的最低层,并且支持多种格式,在这之中又有5种LayerType:
DATA用于LevelDB或LMDB数据格式的输入的类型,输入参数有source, batch_size, (rand_skip), (backend)。后两个是可选。
MEMORY_DATA这种类型可以直接从内存读取数据使用时需要调用 MemoryDataLayer::Reset,输入参数有batch_size, channels, height, width。
HDF5_DATAHDF5数据格式输入的类型,输入参数有source, batch_size。
HDF5_OUTPUTHDF5数据格式输出的类型,输入参数有file_name。
IMAGE_DATA图像格式数据输入的类型,输入参数有source, batch_size,(rand_skip), (shuffle), (new_height), (new_width)。
其实还有两种WINDOW_DATA, DUMMY_DATA用于测试和预留的接口,不重要。
2.activation/neuron_layer
同样是数据的操作层,neuron_layer实现里大量激活函数,主要是元素级别的操作,具有相同的bottom,top size。
Caffe中实现了大量激活函数GPU和CPU的都有很多。它们的父类都是NeuronLayer。
template &typename Dtype&
class NeuronLayer : public Layer&Dtype&
一般的参数设置格式如下(以relu_layer为例):
name: &relu1&
type: RELU
bottom: &conv1&
top: &conv1&
3.loss_layer是Loss层计算网络误差,loss_layer.hpp头文件调用情况:
#include &caffe/blob.hpp&
#include &caffe/layer.hpp&
#include &caffe/proto/caffe.pb.h&
一般来说Loss放在最后一层。caffe实现了大量loss function,它们的父类都是LossLayer。
template &typename Dtype&
class LossLayer : public Layer&Dtype&
<mon_layer这一层主要进行的是vision_layer的连接,源码在。声明了9个类型的common_layer,部分有GPU实现:
InnerProductLayer 常常用来作为全连接层
SplitLayer 用于一输入对多输出的场合(对blob)
FlattenLayer 将n * c * h * w变成向量的格式n * ( c * h * w ) * 1 * 1
ConcatLayer 用于多输入一输出的场合
SilenceLayer 用于一输入对多输出的场合(对layer)
(Elementwise Operations) 这里面是我们常说的激活函数层Activation Layers。
EltwiseLayer
SoftmaxLayer
ArgMaxLayer
5.vision_layer主要是实现Convolution和Pooling操作, 主要有以下几个类:
ConvolutionLayer最常用的卷积操作
Im2colLayer与MATLAB里面的im2col类似,即image-to-column transformation, 转换后方便卷积计算
LRNLayer全称local response normalization layer,在Hinton论文中有详细介绍ImageNet Classification with Deep Convolutional Neural Networks 。
PoolingLayerPooling操作
注意,由于Layer定义的类型很多,所以以上的activation/neuron_layer,common_layer和vision_layer等是一类Layer的集合,并不是特指。例如vision_layer包含了convolution_layer,pooling_layer,lrn_layer。具体参考
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。1934人阅读
由于caffe-master\examples\imagenet中有生成lmdb和计算均&#20540;的脚本,所以,我们可以使用这些脚本。
我们将训练所用的图片文件夹放在image下,train.txt和val.txt也放在image下,如:
(BMW等文件夹放的是图像)
然后,将image文件夹拷贝到Linux下的caffe-master\examples\imagenet文件夹里,接着,修改create_imagenet.sh这个脚本
#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
EXAMPLE=examples/imagenet
DATA=examples/imagenet/image
TOOLS=build/tools
TRAIN_DATA_ROOT=examples/imagenet/
VAL_DATA_ROOT=examples/imagenet/
# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true
if $RESIZE; then
RESIZE_HEIGHT=256
RESIZE_WIDTH=256
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
if [ ! -d &$TRAIN_DATA_ROOT& ]; then
echo &Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT&
echo &Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path& \
&where the ImageNet training data is stored.&
if [ ! -d &$VAL_DATA_ROOT& ]; then
echo &Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT&
echo &Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path& \
&where the ImageNet validation data is stored.&
echo &Creating train lmdb...&
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/mydata_train_lmdb
#生成训练集的lmdb,名字可修改
echo &Creating val lmdb...&
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$DATA/val.txt \
$EXAMPLE/mydata_val_lmdb
#生成验证集的lmdb,名字可修改
echo &Done.&
然后,在caffe-master下运行改脚本:$caffe-master ./examples/imagenet/create_imagenet.sh
这样,就得到训练集和验证集的lmdb。
接着,计算均&#20540;,打开make_imagenet_mean.sh,修改:
#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12
EXAMPLE=examples/imagenet
DATA=examples/imagenet
TOOLS=build/tools
$TOOLS/compute_image_mean $EXAMPLE/mydata_train_lmdb \ #改成你的lmdb
$DATA/mydata_mean.binaryproto #生成的均值文件名,可修改
echo &Done.&
这样,均&#20540;文件就计算好了。
生成了lmdb和均&#20540;文件,接着就可以修改网络来训练了,具体过程请看:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:179930次
积分:2307
积分:2307
排名:第14151名
原创:69篇
转载:18篇
评论:931条
(1)(5)(7)(6)(2)(7)(12)(3)(10)(10)(10)(17)你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
自己改源码吧
要回复问题请先或
关注: 2 人caffe - Shuffle data in LMDB file - Stack Overflow
Join the Stack Overflow Community
Stack Overflow is a community of 7.0 million programmers, just like you, helping each other.
J it only takes a minute:
I already have an existing (Symas Lightning Memory-Mapped Database) file which is created for . Is there any possible way to shuffle the data in already existing LMDB to create a new LMDB with data shuffled. Any suggestions or ideas would be helpful.
LMDB traverses data according to the lexicological order of the key. You can prepend a random number to your current key and the data will be shuffled accordingly. I am also investigating an efficient way to rewrite the keys randomly between epochs as I would like to use Batch normalization in my data set.
To add to the answer given by @Manolo, while creating the LMDB dataset as suggested , I concatenated a random int to the beginning as follows:
random.seed(i)
str_id = '{:05}'.format(random.randint(1,70000))+'{:05}'.format(i)
I chose 70000, since my LMDB had about 72000 images.
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Post as a guest
By posting your answer, you agree to the
Not the answer you&#39;re looking for?
Browse other questions tagged
rev .25660
Stack Overflow works best with JavaScript enabled

我要回帖

更多关于 有源滤波柜主开关选择 的文章

 

随机推荐