了解 Caffe 中的输入维度、SoftmaxWithLoss 和标签
Understanding input dimentions, SoftmaxWithLoss and labels in Caffe
我正在尝试使用我自己训练的网络和我自己的 C++ 数据。我在具有 ImageData
层的“.jpg”数据上训练和测试了网络,然后实现了基本的 caffe 示例 "classification.cpp" 以通过内存一张一张地传递图像。结果我需要知道 2 类:
的概率
1 - 对象,
2 - 环境。
我的常规输入层如下所示:
layer {
name: "data"
top: "data"
top: "label"
type: "Input"
input_param { shape: { dim: 1 dim: 3 dim: 256 dim: 256 }}
}
输出层:
layer {
name: "fc6"
top: "fc6"
type: "InnerProduct"
bottom: "drop5"
inner_product_param {
num_output: 2
weight_filler {
type: "xavier"
std: 0.1
}
}
}
layer {
name: "prob"
top: "prob"
type: "SoftmaxWithLoss"
bottom: "fc6"
bottom: "label"
}
layer {
name: "accuracy"
top: "accuracy"
type: "Accuracy"
bottom: "fc6"
bottom: "label"
include {
phase: TEST
}
}
在测试阶段,网络已经达到了accuracy=0.93,但是现在在C++中正常使用我无法弄清楚一些基本概念并且在解析模型时出错。
Check failure stack trace:
...
caffe::SoftmaxWithLossLayer<>::Reshape()
caffe::Net<>::Init()
caffe::Net<>::Net()
...
Check failed: outer_num_ * inner_num_ == bottom[1]->count() (1 vs. 196608) Number of labels must match number of predictions; e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), label count (number of labels) must be N*H*W, with integer values in {0, 1, ..., C-1}.
好的,1x3x256x256 = 196608,但为什么我需要这个标签计数?
我有一个文件 "labels.txt",如示例 "classification.cpp":
environment
object
为什么标签 != 类?
我应该如何处理 SoftmaxWithLoss 和输入维度?
您没有为标签定义 shape
,我假设您每张图片只有一个标签。于是
layer {
name: "data"
top: "data"
top: "label"
type: "Input"
input_param { shape: { dim: 1 dim: 3 dim: 256 dim: 256 }
shape: { dim: 1 dim: 1 }} # one label per image
}
我正在尝试使用我自己训练的网络和我自己的 C++ 数据。我在具有 ImageData
层的“.jpg”数据上训练和测试了网络,然后实现了基本的 caffe 示例 "classification.cpp" 以通过内存一张一张地传递图像。结果我需要知道 2 类:
的概率
1 - 对象,
2 - 环境。
我的常规输入层如下所示:
layer {
name: "data"
top: "data"
top: "label"
type: "Input"
input_param { shape: { dim: 1 dim: 3 dim: 256 dim: 256 }}
}
输出层:
layer {
name: "fc6"
top: "fc6"
type: "InnerProduct"
bottom: "drop5"
inner_product_param {
num_output: 2
weight_filler {
type: "xavier"
std: 0.1
}
}
}
layer {
name: "prob"
top: "prob"
type: "SoftmaxWithLoss"
bottom: "fc6"
bottom: "label"
}
layer {
name: "accuracy"
top: "accuracy"
type: "Accuracy"
bottom: "fc6"
bottom: "label"
include {
phase: TEST
}
}
在测试阶段,网络已经达到了accuracy=0.93,但是现在在C++中正常使用我无法弄清楚一些基本概念并且在解析模型时出错。
Check failure stack trace:
...
caffe::SoftmaxWithLossLayer<>::Reshape()
caffe::Net<>::Init()
caffe::Net<>::Net()
...
Check failed: outer_num_ * inner_num_ == bottom[1]->count() (1 vs. 196608) Number of labels must match number of predictions; e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), label count (number of labels) must be N*H*W, with integer values in {0, 1, ..., C-1}.
好的,1x3x256x256 = 196608,但为什么我需要这个标签计数? 我有一个文件 "labels.txt",如示例 "classification.cpp":
environment
object
为什么标签 != 类? 我应该如何处理 SoftmaxWithLoss 和输入维度?
您没有为标签定义 shape
,我假设您每张图片只有一个标签。于是
layer {
name: "data"
top: "data"
top: "label"
type: "Input"
input_param { shape: { dim: 1 dim: 3 dim: 256 dim: 256 }
shape: { dim: 1 dim: 1 }} # one label per image
}