2017-06-20 24 views
1

我是新来的深度学习。当我使用caffe时,发现有两个prototxt文件,一个是“deploy”,另一个是“train_val”。
我知道“train_val”用于训练模型。但是对于“部署”文件,有些人表示这是为了测试映像。
所以,我的问题是“部署”只有forward()网络,所以测试图像数据只通过转发网络一次得分?转发CNN的网络

回答

2

正如您已经注意到的那样,有一些fundamental differences between 'train_val.prototxt' and 'deploy.prototxt'
一个关键的区别是'deploy.prototxt'通常缺少任何损失层。
当你没有为网络定义的损失函数时,没有后向传播的意义:你会传播什么梯度?什么函数的渐变?

因此,caffe中的net对象具有backward()所有阶段实现的方法。尽管如此,当您测试没有损失函数的网络时(仅预测),这种方法是毫无意义的。

2

理想情况下,它应该如何工作,但文件只是网络定义。您可以使用单个文件进行训练和测试。您必须指定要使用某些Blob的阶段,这意味着您可以定2 inputData层,一个将在训练期间被使用,并且另一个用于测试和指定相应的相位是这样的:

name: "MyModel" 
layer { 
    name: "data" 
    type: "Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TRAIN 
    } 
    transform_param { 
    mirror: false 
    crop_size: 227 
    mean_file: "data/train_mean.binaryproto" # location of the training data mean 
    } 
    data_param { 
    source: "data/train_lmdb" # location of the training samples 
    batch_size: 128 # how many samples are grouped into one mini-batch 
    backend: LMDB 
    } 
} 
layer { 
    name: "data" 
    type: "Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TEST 
    } 

在训练期间,先前层将被使用,其中所述第二将被忽略。 在测试阶段,第一层将被忽略,第二层将被用作测试的输入。

另一点是,在测试过程中,我们需要我们预测的准确度,因为我们并不需要更新了我们的权重 升

layer { 
    name: "accuracy" 
    type: "Accuracy" 
    bottom: "fc8" 
    bottom: "label" 
    top: "accuracy" 
    include { 
    phase: TEST 
    } 
} 
layer { 
    name: "loss" 
    type: "SoftmaxWithLoss" 
    bottom: "fc8" 
    bottom: "label" 
    top: "loss" 
} 

如果include指令没有给出,该层包括在所有阶段。

虽然您也可以在训练过程中包含准确性层以查看输出是如何进行的(即:为了在多少次迭代后测量准确度改进),我们需要更多的预测。在求解 ,您可以指定test_iter后多少迭代测试操作进行指定(您验证模型中的每个test_iter迭代)

train_val和部署文件这两个阶段分成两个不同的files.All规范train_val与训练阶段有关。并部署测试。我不确定,train_val组合来自哪里,但我想这是因为你可以在test_iter之后验证你的模型,并继续从那里继续训练。 由于在测试过程中您不需要损失,而不是概率,所以可以使用softmax代替概率输出函数,而不是部署中的softmaxwithloss,或者您可以同时定义这两个函数。 caffe测试命令执行正向操作,但不执行反向()(反向传播)操作。我希望它有帮助