Python Tensorflow-避免张量大小限制

Python Tensorflow-避免张量大小限制,python,tensorflow,Python,Tensorflow,我正在研究中描述的FCN-32网络的实现,但在上采样时遇到了障碍。为了向上采样到原始大小,其他人使用带有双线性过滤器的conv2d\u转置层,内核大小为64x64。在您开始使用大量类之前,这一切都很好 对于任何数量的类>~375,转置层中的过滤器变量大于2 gb(64 x 64 x(>375)x(>375)),因此Tensorflow抱怨并死亡,说 ValueError:无法创建内容大于2GB的张量原型。 有没有办法避免这个尺寸限制?我的第一个想法是生成张量,但我找不到任何关于如何创建这种构造

我正在研究中描述的FCN-32网络的实现,但在上采样时遇到了障碍。为了向上采样到原始大小,其他人使用带有双线性过滤器的
conv2d\u转置
层,内核大小为64x64。在您开始使用大量类之前,这一切都很好

对于任何数量的类>~375,转置层中的
过滤器
变量大于2 gb(64 x 64 x(>375)x(>375)),因此Tensorflow抱怨并死亡,说

ValueError:无法创建内容大于2GB的张量原型。


有没有办法避免这个尺寸限制?我的第一个想法是生成张量,但我找不到任何关于如何创建这种构造的文档,如果这种构造存在或可能的话。

您可以将输出类拆分为多个操作,并在最后连接它们

通过concat操作,Backprop将正常工作。它应该像创建两个
conv2d\u transpose
操作一样简单,每个操作都有一半的类,并适当地计算结果,然后继续从那里得到损失函数

根据需要创建2个以上的
conv2d\u transpose
操作同样有效


考虑到这一点,我相信它会起作用。如果有问题,请告诉我,我会更新答案。

您确定64x64是正确的形状吗?我认为应该小得多,这是内核的大小,64x64是非常大的。我在文章中看到了对14x14的引用(3x3或5x5更为正常)。64x64是实现FCN-32时的正确形状;FCN-16/FCN-8实现的内核大小使用ksize 4x4到16x16。有关更多详细信息,请参阅caffe参考实现:较大的内核大小是必要的,因为它将被放大32倍。我相信这是层输出的正确形状,而不是产生输出的实际内核的正确形状,
filters
属性指代权重,例如
[kernel\u height,kernel\u width,channels\u in,channels\u out]
内核看起来是一个
[3,3]
内核,在
5:def conv\u relu行(底部,nout,ks=3,跨步=1,pad=1):
感谢您对此进行更多的研究。
[3,3]
似乎是所有卷积层的默认内核大小,但我所指的层是deconv层upscore8。请参见第58-61行:
n.upscore=L.Deconvolution(n.score\u fr,convolution\u param=dict(num\u output=21,kernel\u size=64,stride=32,
我明白了,我相信你现在必须确定一下。)然后,我的第一个直觉是将输出类拆分为多个操作,并在最后连接它们。我没有尝试过,但我想不出任何原因它不起作用。Backprop在concat操作中工作得很好。它应该与创建两个
conv2d\u transpose
操作一样简单,每个操作都带有half类和concat适当地计算结果,并从那里继续损失函数。我将
conv2d_transpose
操作分为10个单独的操作,但Tensorflow显然也有2GB的图形大小限制。因此,在库处于当前状态时,无法执行这些操作:(再次感谢您的帮助!对于未来的读者,可以使用1000个类实现FCN-8网络,但是大小限制使得在TF中使用FCN-16和FCN-32无法实现这一点。等等,在图形大小上会出现什么错误?我有推10GB的模型。但可能不在变量中。这让我感到惊讶。ValueError:GraphDef cannot大于2GB。但这是
GraphDef
,图形中的定义,所有符号的东西。据我所知,这不应该受到
变量大小的影响。检查这个线程,似乎是同一个问题:我想你正在创建一个常量,你应该在某个地方创建一个变量。我保留但可能是错误的。看起来发生了GraphDef错误,因为在初始化20个单独的上采样层(而不是一个大的上采样层)时,所有的过滤器(大小为64 x 64 x 50 x 1000)正在隐式转换为张量。修复方法是在传递到
conv2d\u transpose
之前将过滤器转换为单个张量,这样它们就不会转换为20个不同的张量。然后我将
concat
20个上采样层并运行argmax-这会产生比仅将#logits减少为20更糟糕的结果。不确定原因,但它确实存在运行这个网络需要很长时间,所以我觉得不值得调查。