- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想将 caffe 与矢量标签一起使用,而不是整数。我检查了一些答案,HDF5 似乎是更好的方法。但后来我遇到了这样的错误:
accuracy_layer.cpp:34] Check failed:
outer_num_ * inner_num_ == bottom[1]->count()
(50 vs. 200) Number of labels must match number of predictions; e.g., if label axis == 1 and prediction shape is (N, C, H, W), label count (number of labels) must beN*H*W
, with integer values in {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=dict(type='xavier'))
n.relu1 = L.ReLU(n.ip1, in_place=True)
n.ip2 = L.InnerProduct(n.relu1, num_output=50, weight_filler=dict(type='xavier'))
n.relu2 = L.ReLU(n.ip2, in_place=True)
n.ip3 = L.InnerProduct(n.relu1, num_output=4, weight_filler=dict(type='xavier'))
n.accuracy = L.Accuracy(n.ip3, n.label)
n.loss = L.SoftmaxWithLoss(n.ip3, n.label)
return n.to_proto()
with open(PROJECT_HOME + 'auto_train.prototxt', 'w') as f:
f.write(str(net('/home/romulus/code/project/train.h5list', 50)))
with open(PROJECT_HOME + 'auto_test.prototxt', 'w') as f:
f.write(str(net('/home/romulus/code/project/test.h5list', 20)))
看来我应该增加标签数量并将东西放在整数而不是数组中,但如果我这样做,caffe 会提示数据数量和标签不相等,然后存在。
那么,提供多标签数据的正确格式是什么?
另外,我很想知道为什么没有人只是简单地写下 HDF5 如何映射到 caffe blob 的数据格式?
最佳答案
回答这个问题的标题:
HDF5 文件应该在根目录下有两个数据集,分别命名为“data”和“label”。形状为(数据量
,维度
)。我只使用一维数据,所以我不确定 channel
、width
和 height
的顺序是什么。也许没关系。 dtype
应该是 float 或 double。
使用 h5py
创建训练集的示例代码是:
import h5py, osimport numpy as npf = h5py.File('train.h5', 'w')# 1200 data, each is a 128-dim vectorf.create_dataset('data', (1200, 128), dtype='f8')# Data's labels, each is a 4-dim vectorf.create_dataset('label', (1200, 4), dtype='f4')# Fill in something with fixed pattern# Regularize values to between 0 and 1, or SigmoidCrossEntropyLoss will not workfor i in range(1200): a = np.empty(128) if i % 4 == 0: for j in range(128): a[j] = j / 128.0; l = [1,0,0,0] elif i % 4 == 1: for j in range(128): a[j] = (128 - j) / 128.0; l = [1,0,1,0] elif i % 4 == 2: for j in range(128): a[j] = (j % 6) / 128.0; l = [0,1,1,0] elif i % 4 == 3: for j in range(128): a[j] = (j % 4) * 4 / 128.0; l = [1,0,1,1] f['data'][i] = a f['label'][i] = lf.close()
Also, the accuracy layer is not needed, simply removing it is fine. Next problem is the loss layer. Since SoftmaxWithLoss
has only one output (index of the dimension with max value), it can't be used for multi-label problem. Thank to Adian and Shai, I find SigmoidCrossEntropyLoss
is good in this case.
Below is the full code, from data creation, training network, and getting test result:
main.py (modified from caffe lanet example)
import os, sysPROJECT_HOME = '.../project/'CAFFE_HOME = '.../caffe/'os.chdir(PROJECT_HOME)sys.path.insert(0, CAFFE_HOME + 'caffe/python')import caffe, h5pyfrom pylab import *from caffe import layers as Ldef 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=dict(type='xavier')) n.relu1 = L.ReLU(n.ip1, in_place=True) n.ip2 = L.InnerProduct(n.relu1, num_output=50, weight_filler=dict(type='xavier')) n.relu2 = L.ReLU(n.ip2, in_place=True) n.ip3 = L.InnerProduct(n.relu2, num_output=4, weight_filler=dict(type='xavier')) n.loss = L.SigmoidCrossEntropyLoss(n.ip3, n.label) return n.to_proto()with open(PROJECT_HOME + 'auto_train.prototxt', 'w') as f: f.write(str(net(PROJECT_HOME + 'train.h5list', 50)))with open(PROJECT_HOME + 'auto_test.prototxt', 'w') as f: f.write(str(net(PROJECT_HOME + 'test.h5list', 20)))caffe.set_device(0)caffe.set_mode_gpu()solver = caffe.SGDSolver(PROJECT_HOME + 'auto_solver.prototxt')solver.net.forward()solver.test_nets[0].forward()solver.step(1)niter = 200test_interval = 10train_loss = zeros(niter)test_acc = zeros(int(np.ceil(niter * 1.0 / test_interval)))print len(test_acc)output = zeros((niter, 8, 4))# The main solver loopfor it in range(niter): solver.step(1) # SGD by Caffe train_loss[it] = solver.net.blobs['loss'].data solver.test_nets[0].forward(start='data') output[it] = solver.test_nets[0].blobs['ip3'].data[:8] if it % test_interval == 0: print 'Iteration', it, 'testing...' correct = 0 data = solver.test_nets[0].blobs['ip3'].data label = solver.test_nets[0].blobs['label'].data for test_it in range(100): solver.test_nets[0].forward() # Positive values map to label 1, while negative values map to label 0 for i in range(len(data)): for j in range(len(data[i])): if data[i][j] > 0 and label[i][j] == 1: correct += 1 elif data[i][j] %lt;= 0 and label[i][j] == 0: correct += 1 test_acc[int(it / test_interval)] = correct * 1.0 / (len(data) * len(data[0]) * 100)# Train and test done, outputing convege graph_, ax1 = subplots()ax2 = ax1.twinx()ax1.plot(arange(niter), train_loss)ax2.plot(test_interval * arange(len(test_acc)), test_acc, 'r')ax1.set_xlabel('iteration')ax1.set_ylabel('train loss')ax2.set_ylabel('test accuracy')_.savefig('converge.png')# Check the result of last batchprint solver.test_nets[0].blobs['ip3'].dataprint solver.test_nets[0].blobs['label'].data
h5list files simply contain paths of h5 files in each line:
train.h5list
/home/foo/bar/project/train.h5
test.h5list
/home/foo/bar/project/test.h5
和求解器:
auto_solver.prototxt
train_net: "auto_train.prototxt"test_net: "auto_test.prototxt"test_iter: 10test_interval: 20base_lr: 0.01momentum: 0.9weight_decay: 0.0005lr_policy: "inv"gamma: 0.0001power: 0.75display: 100max_iter: 10000snapshot: 5000snapshot_prefix: "sed"solver_mode: GPU
最后一批结果:
[[ 35.91593933 -37.46276474 -6.2579031 -6.30313492][ 42.69248581 -43.00864792 13.19664764 -3.35134125][ -1.36403108 1.38531208 2.77786589 -0.34310576][ 2.91686511 -2.88944006 4.34043217 0.32656598]...[ 35.91593933 -37.46276474 -6.2579031 -6.30313492][ 42.69248581 -43.00864792 13.19664764 -3.35134125][ -1.36403108 1.38531208 2.77786589 -0.34310576][ 2.91686511 -2.88944006 4.34043217 0.32656598]][[ 1. 0. 0. 0.][ 1. 0. 1. 0.][ 0. 1. 1. 0.][ 1. 0. 1. 1.]...[ 1. 0. 0. 0.][ 1. 0. 1. 0.][ 0. 1. 1. 0.][ 1. 0. 1. 1.]]
我认为这段代码还有很多地方需要改进。任何建议表示赞赏。
关于python - 如何以HDF5格式提供caffe多标签数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33140000/
// Assuming that data are on the CPU initially, and we have a blob. const Dtype* foo; Dtype* bar;
我计划使用 NYU depth v2 数据集实现一个 CNN,它可以从单个图像估计深度。通过本教程,我了解到在 Caffe 上实现处理分类问题的 CNN 很容易。我很好奇 Caffe 是否适合涉及多维
我用图像训练了一个模型。现在想将 fc-6 功能提取到 .npy 文件中。我正在使用 caffe.set_mode_gpu() 运行 caffe.Classifier 并提取特征。 而不是每帧提取和保
我通过 apt install 命令在我的 Ubuntu v18 VM 上安装了 caffe-cpu。我正在努力找出安装目录所在的位置,如果我错了请纠正我,但我相信没有安装目录。我尝试执行的 NN 模
这个问题在这里已经有了答案: how to calculate a net's FLOPs in CNN [closed] (4 个回答) 4年前关闭。 我在tensorflow tutorial看到
似乎this related PR现在已经死了,有没有解决方法可以使用 early stopping在咖啡厅?也许在 Caffe 之上使用 Python? 最佳答案 第一部分很容易手动完成:让我们监控
当我尝试在MacbookPro(El Capitan)上安装最新的caffe时,出现以下错误。怎么了?如何解决? 我在此网站上发现了一些类似的问题,不幸的是显示的修复似乎是ubuntu特有的。 先感谢
average_loss有什么用?有人可以举一个例子或用外行的术语解释吗? 最佳答案 您可以登录 caffe.proto文件。当前版本中的第 151 行对 average_loss 给出了以下注释:
我想先分别处理不同类型的数据,然后将它们融合到一个公共(public)层中。这在 Caffe 中是否可行,如果可以,最好的方法是什么? 我读过可以在同一个 prototxt 文件中定义多个数据层。但是
我正在尝试将几个底部 Blob 合并为一个顶部 Blob ,然后将其馈送到下一层。 这些 Blob 来自不同的卷积/FC层,因此它们的形状不同。 我尝试了 concat 层,但使用轴 0 或 1 时,
包 Digits 需要使用 Caffe 安装目录的位置设置环境变量。 安装Caffe的简单方法是apt-get install caffe-cuda .但是,我无法弄清楚它的安装位置。没有安装在hom
我在 Caffe 中训练过 imagenet。现在我正在尝试为我的模型和 caffe 提供的训练模型计算 ROC/AUC。我有两个问题: 1) ROC/AUC 主要用于二进制类,但我也发现在某些情况下
我正在尝试使我的 Caffe 代码适应 tensorflow。我想知道将我的 train.txt 和 test.txt 转换为适用于 tensorflow 的最佳方法是什么。 在我的 train.tx
有没有办法安装/运行修改后的 Caffe 项目,例如 SegNet或FCN-Berkley-Vision在 Windows 上? 有Microsoft-led project to bring Caf
我想用python设置一个caffe CNN,使用caffe.NetSpec()界面。虽然我看到我们可以把测试网放在 solver.prototxt , 我想写在model.prototxt具有不同的
我有一个预训练的 faster-rcnn caffemodel。我可以使用 net.params[pr][0].data 获取模型的权重。到目前为止,权重是 numpy float32 类型。我想将它
我正在做一个将 keras json 模型转换为 caffe prototxt 的项目 caffe 支持任意填充值 keras(在 tensorflow 之上)支持“相同”和“有效”值 对于 caff
我正在尝试让 CaffeOnSpark 在本地运行,并且我按照 CaffeOnSpark wiki 上的此过程进行操作:https://github.com/yahoo/CaffeOnSpark/wi
我通过caffe使用我自己的数据集训练了网络,现在我想用C++写一个分类代码。我的机器 (linux) 仅适用于 CPU! (我使用 GPU 在 VM 中训练网络)。 当我尝试“包含”特定的 Caff
我知道可以(以编程方式)使用 caffe.Netspec() 设计一个网络,基本上主要目的是编写它的 prototxt。 net = caffe.NetSpec() .. (define) .. wi
我是一名优秀的程序员,十分优秀!