我的列车和标签数据为data.mat
。 (我有200个训练数据,6000个特征和标签是(-1,+ 1)已保存在data.mat中。
我正在尝试转换hdf5
中的数据(训练和测试)并使用以下方式运行Caffe:
load input.mat
hdf5write('my_data.h5', '/new_train_x', single( permute(reshape(new_train_x,[200, 6000, 1, 1]),[4:-1:1] ) ));
hdf5write('my_data.h5', '/label_train', single( permute(reshape(label_train,[200, 1, 1, 1]), [4:-1:1] ) ) , 'WriteMode', 'append' );
hdf5write('my_data_test.h5', '/test_x', single( permute(reshape(test_x,[77, 6000, 1, 1]),[4:-1:1] ) ));
hdf5write('my_data_test.h5', '/label_test', single( permute(reshape(label_test,[77, 1, 1, 1]), [4:-1:1] ) ) , 'WriteMode', 'append' );
(请参阅this thread关于在matlab中将mat文件转换为hdf5)。
我的train_val.prototxt
是:
layer {
type: "HDF5Data"
name: "data"
top: "new_train_x" # note: same name as in HDF5
top: "label_train" #
hdf5_data_param {
source: "file.txt"
batch_size: 20
}
include { phase: TRAIN }
}
layer {
type: "HDF5Data"
name: "data"
top: "test_x" # note: same name as in HDF5
top: "label_test" #
hdf5_data_param {
source: "file_test.txt"
batch_size: 20
}
include { phase:TEST }
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "new_train_x"
top: "ip1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 30
weight_filler {
type: "gaussian" # initialize the filters from a Gaussian
std: 0.01
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "tanh1"
type: "TanH"
bottom: "ip1"
top: "tanh1"
}
layer {
name: "ip2"
type: "InnerProduct"
bottom: "tanh1"
top: "ip2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 1
weight_filler {
type: "gaussian" # initialize the filters from a Gaussian
std: 0.01
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "loss"
type: "TanH"
bottom: "ip2"
bottom: "label_train"
top: "loss"
}
但我有一个问题。看来,它无法读取我的输入数据。
I1227 10:27:21.880826 7186 layer_factory.hpp:76] Creating layer data
I1227 10:27:21.880851 7186 net.cpp:110] Creating Layer data
I1227 10:27:21.880866 7186 net.cpp:433] data -> new_train_x
I1227 10:27:21.880893 7186 net.cpp:433] data -> label_train
I1227 10:27:21.880915 7186 hdf5_data_layer.cpp:81] Loading list of HDF5 filenames from: file.txt
I1227 10:27:21.880965 7186 hdf5_data_layer.cpp:95] Number of HDF5 files: 1
I1227 10:27:21.962596 7186 net.cpp:155] Setting up data
I1227 10:27:21.962702 7186 net.cpp:163] Top shape: 20 6000 1 1 (120000)
I1227 10:27:21.962738 7186 net.cpp:163] Top shape: 20 1 1 1 (20)
I1227 10:27:21.962772 7186 layer_factory.hpp:76] Creating layer ip1
I1227 10:27:21.962838 7186 net.cpp:110] Creating Layer ip1
I1227 10:27:21.962873 7186 net.cpp:477] ip1 <- new_train_x
I1227 10:27:21.962918 7186 net.cpp:433] ip1 -> ip1
I1227 10:27:21.979375 7186 net.cpp:155] Setting up ip1
I1227 10:27:21.979434 7186 net.cpp:163] Top shape: 20 30 (600)
I1227 10:27:21.979478 7186 layer_factory.hpp:76] Creating layer tanh1
I1227 10:27:21.979529 7186 net.cpp:110] Creating Layer tanh1
I1227 10:27:21.979557 7186 net.cpp:477] tanh1 <- ip1
I1227 10:27:21.979583 7186 net.cpp:433] tanh1 -> tanh1
I1227 10:27:21.979620 7186 net.cpp:155] Setting up tanh1
I1227 10:27:21.979650 7186 net.cpp:163] Top shape: 20 30 (600)
I1227 10:27:21.979670 7186 layer_factory.hpp:76] Creating layer ip2
I1227 10:27:21.979696 7186 net.cpp:110] Creating Layer ip2
I1227 10:27:21.979720 7186 net.cpp:477] ip2 <- tanh1
I1227 10:27:21.979746 7186 net.cpp:433] ip2 -> ip2
I1227 10:27:21.979796 7186 net.cpp:155] Setting up ip2
I1227 10:27:21.979825 7186 net.cpp:163] Top shape: 20 1 (20)
I1227 10:27:21.979854 7186 layer_factory.hpp:76] Creating layer loss
I1227 10:27:21.979881 7186 net.cpp:110] Creating Layer loss
I1227 10:27:21.979909 7186 net.cpp:477] loss <- ip2
I1227 10:27:21.979931 7186 net.cpp:477] loss <- label_train
I1227 10:27:21.979962 7186 net.cpp:433] loss -> loss
F1227 10:27:21.980006 7186 layer.hpp:374] Check failed: ExactNumBottomBlobs() == bottom.size() (1 vs. 2) TanH Layer takes 1 bottom blob(s) as input.
*** Check failure stack trace: ***
@ 0x7f44cbc68ea4 (unknown)
@ 0x7f44cbc68deb (unknown)
@ 0x7f44cbc687bf (unknown)
@ 0x7f44cbc6ba35 (unknown)
@ 0x7f44cbfd0ba8 caffe::Layer<>::CheckBlobCounts()
@ 0x7f44cbfed9da caffe::Net<>::Init()
@ 0x7f44cbfef108 caffe::Net<>::Net()
@ 0x7f44cc03f71a caffe::Solver<>::InitTrainNet()
@ 0x7f44cc040a51 caffe::Solver<>::Init()
@ 0x7f44cc040db9 caffe::Solver<>::Solver()
@ 0x41222d caffe::GetSolver<>()
@ 0x408ed9 train()
@ 0x406741 main
@ 0x7f44ca997a40 (unknown)
@ 0x406f69 _start
@ (nil) (unknown)
Aborted (core dumped)
现在,如果我像这样改变损失层:
layer {
name: "loss"
type: "TanH"
bottom: "ip2"
top: "loss"
}
我有这个问题:
F1227 10:53:17.884419 9102 insert_splits.cpp:35] Unknown bottom blob 'new_train_x' (layer 'ip1', bottom index 0)
*** Check failure stack trace: ***
@ 0x7f502ab5dea4 (unknown)
@ 0x7f502ab5ddeb (unknown)
@ 0x7f502ab5d7bf (unknown)
@ 0x7f502ab60a35 (unknown)
@ 0x7f502af1d75b caffe::InsertSplits()
@ 0x7f502aee19e9 caffe::Net<>::Init()
@ 0x7f502aee4108 caffe::Net<>::Net()
@ 0x7f502af35172 caffe::Solver<>::InitTestNets()
@ 0x7f502af35abd caffe::Solver<>::Init()
@ 0x7f502af35db9 caffe::Solver<>::Solver()
@ 0x41222d caffe::GetSolver<>()
@ 0x408ed9 train()
@ 0x406741 main
@ 0x7f502988ca40 (unknown)
@ 0x406f69 _start
@ (nil) (unknown)
Aborted (core dumped)
非常感谢!!!!任何建议将不胜感激!
答案 0 :(得分:2)
您的数据层仅定义为phase: TRAIN
我认为当caffe尝试构建测试时网(即phase: TEST
网)时会发生错误。
您应该有一个包含测试数据的附加层:
layer {
type: "HDF5Data"
name: "data"
top: "new_train_x" # note: same name as in HDF5
top: "label_train" #
hdf5_data_param {
source: "test_file.txt"
batch_size: 20
}
include { phase: TEST } # do not forget TEST phase
}
顺便说一句,如果你不想在训练期间测试你的网,你可以关掉这个选项。有关详细信息,请参阅this thread。
<强>更新强>
原谅我直言不讳,但是你弄得一团糟。
"TanH"
不是损失层 - 它是神经元/激活层。它用作应用于线性层(转换/内积)的非线性。因此,它接受单个输入(底部blob)并输出单个blob(顶部)
损失层计算标量损失值,通常需要两个输入:预测和地面实况进行比较。 "HDF5Data"
阶段添加了TEST
图层,但此图层输出top: "test_x"
,您的网络中没有任何图层需要bottom: "test_x"
你只有期待"new_train_x"
的图层......同样适用于"label_text"
。我建议您使用更通用的名称(例如,x
和label
)重新编写hdf5文件,以便 列车和测试。只需使用不同的文件名来区分它们。这样,您的网络在两个阶段都使用"x"
和"label"
,并且只根据阶段加载相应的数据集。