pycaffe不能从上到下传递差异

时间:2017-07-04 01:55:55

标签: python neural-network deep-learning caffe conv-neural-network

我使用pycaffe的后向功能来实现反卷积过程。我首先运行正向过程并获取网络的输出数据blob,然后将数据blob分配给顶层的diff blob,然后运行后向过程。但是,底层的差异不会被后向过程改变,后者全部为零。我不知道为什么不会向后传输差异。

Myfile = open('GG.txt') 
c = [i[:] for i in Myfile] 

def cole():
    x = 0

    for line in c:
        a = line.strip().split(' ') 
        for m in a:

            if(int(m) > x):
                x = int(m)

    for line in c:
        if str(x) in line:
            return ('[' + line.strip() + ']') 

print(cole()) 

在上面的代码中,name_list_按顺序包含所有转换层和合并层,并且从最后一个转换层开始向后。谢谢!

2 个答案:

答案 0 :(得分:1)

使用pycaffe通过start =和end =参数推断网络的一部分是困难的,但是可能的。如果可以推论所有图层,那会更简单-只需按照Shai的建议设置“ force_backward:true”即可。

以下两个问题可能导致net.backward(...)之后起始层的差异为零:

  1. Caffe(其C ++部分)对Backward()调用进行了优化,使其对某些认为不必要的层进行了优化。它优化了达到可学习参数(只是没有可学习参数,或所有参数上的lr_mult = 0)所不需要的反向传播。最常见的结果是优化反向传播到数据层,因为它通常不需要渐变。

    如果您需要在数据层上进行区分(例如,对于Gatys型样式传输),请将“ force_backward:true”放入包含您的网络层的原型中-这会取消此优化。

  2. 另一个问题是自动拆分图层。加载网络时,只要在其他图层的2个或多个底部(输入)中使用了某个图层的顶部(输出),Caffe就会自动插入拆分图层。您可以检查Caffe日志文件中名称中包含“ _split_”子字符串的图层。

    示例:

    原始网络(节点是层):

    data ---> conv1 -> conv2 -> ...
          \-> somelayer -> ...
    

    加载后:

    data -> split ---> conv1 -> conv2 -> ...
                   \-> somelayer -> ...
    

    插入自动拆分图层后,图层“数据”的顶部(输出)保留其名称,但“ conv1”和“ somelayer”的底部重新命名为某些生成的名称。结果,当您对从“ conv1”层开始的网络部分运行向后(...)时,.diff仅在自动生成的Blob中进行更新。要使用原始Blob名称,请移动“ start =“ arg值”以包括自动拆分层(用于forward()和backward()调用)。

答案 1 :(得分:0)

可能是您的网络默认不通过渐变 考虑在您的网络原型文件中设置force_backward 例如,请参阅this answer