我使用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_按顺序包含所有转换层和合并层,并且从最后一个转换层开始向后。谢谢!
答案 0 :(得分:1)
使用pycaffe通过start =和end =参数推断网络的一部分是困难的,但是可能的。如果可以推论所有图层,那会更简单-只需按照Shai的建议设置“ force_backward:true”即可。
以下两个问题可能导致net.backward(...)之后起始层的差异为零:
Caffe(其C ++部分)对Backward()调用进行了优化,使其对某些认为不必要的层进行了优化。它优化了达到可学习参数(只是没有可学习参数,或所有参数上的lr_mult = 0)所不需要的反向传播。最常见的结果是优化反向传播到数据层,因为它通常不需要渐变。
如果您需要在数据层上进行区分(例如,对于Gatys型样式传输),请将“ force_backward:true”放入包含您的网络层的原型中-这会取消此优化。
另一个问题是自动拆分图层。加载网络时,只要在其他图层的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。