概述是我正在编写代码来理解我的问题空间,并且我遇到了'PANIC:调用Lua API(内存不足)时出现无保护错误'错误.我正在寻找绕过这个限制的方法.
环境底线是Torch,一个在LuaJIT上运行的科学计算框架,LuaJIT在Lua上运行.我需要Torch,因为我最终想要在GPU上使用神经网络来解决我的问题,但为了实现这一目标,我需要很好地表达问题以提供给网络.我(卡住)在Centos Linux上,我怀疑尝试从32位模式重建源代码(据报道将LuaJIT内存限制扩展到4gb)将是一个噩梦,如果它适用于所有的库.
问题空间本身可能不是特别相关,但总的来说,我有点数据文件,我计算这些距离之间的距离然后bin(即直方图)这些距离试图找出最有用的范围.方便的是,我可以创建复杂的Lua表,其中包含各种箱子和torch.save(),这些都是数不清的,然后在以后拿起并检查不同的标准化等等 - 所以经过一个月的游戏后我发现这是真的很容易和强大.
我可以使它看起来最多3个距离,每个15个容器(15x15x15加上开销),但这只是通过添加显式的garbagecollection()调用并使用fork()/ wait()为每个数据文件,以便外部循环将保持运行,如果一个数据文件(几千)仍然打破内存限制并使孩子崩溃.当每个成功的子进程现在必须读取,修改和写入当前的bin计数集时,这会变得非常痛苦 - 我最大的文件目前是36mb.我想要更大(更多的垃圾箱),并且真的更愿意只持有15个我无法访问的RAM的计数.
所以,这里有一些我想过的路径; 如果你能确认/否认他们中的任何一个会/不会让我超出1gb边界,或者只是提高我的效率,请发表评论.如果您可以提出我没想过的其他方法,请发表评论.
我错过了一个触发Lua进程的方法,我可以从中读取任意表格吗?毫无疑问,我可以将我的问题分解成更小的部分,但是从stdio解析返回表(从系统调用到另一个Lua脚本)似乎容易出错,而写入/读取小型中间文件将是很多磁盘i/o.
我错过了一个存储和访问表高内存模块?这似乎是我真正想要的,但还没有找到它
FFI C数据结构可以放在1gb之外吗?看起来似乎并非如此,但我当然缺乏对造成限制的原因的全面理解.我怀疑这会让我比普通的Lua表更能提高效率,因为这些表已经超越原型设计了吗?(除非我为每个更改做了一堆编码)
当然我可以通过在C中写一个扩展来解决(Torch似乎支持超出限制的网络),但是我的简短调查发现了对'lightuserdata'指针的引用 - 这是否意味着更正常的扩展赢了也不到1gb以外?这看起来似乎也应该是原型制作练习的开发成本.
我很了解C,所以走FFI或扩展路线并没有打扰我 - 但我从经验中知道,以这种方式封装算法既可以非常优雅,又可以通过两个地方来隐藏错误.处理包含堆栈中表格中的表格的数据结构似乎也不是很好.在我做出这些努力之前,我想确定最终结果真的能解决我的问题.
感谢阅读长篇文章.
我想知道在使用多GPU进行训练时,通过同步批量统计来实现批量规范化层的可能方法.
Caffe也许有一些caffe可以做的变种,比如链接.但是对于BN层,我的理解是它仍然只同步层的输出,而不是平均值和变量.也许MPI可以同步手段和变量,但我认为MPI有点难以实现.
火炬我在这里和这里看到了一些评论,它们显示了running_mean和running_var可以同步,但我认为批量平均值和批量变量不能或难以同步.
Tensorflow通常,它与caffe和torch相同.BN的实施是指这一点.我知道tensorflow可以将操作分配给指定的任何设备tf.device().但是平均值和变量的计算是在BN层的中间,所以如果我在cpu中收集平均值和变量,我的代码将是这样的:
cpu_gather = []
label_batches = []
for i in range(num_gpu):
with tf.device('/gpu:%d' % i):
with tf.variable_scope('block1', reuse=i > 0):
image_batch, label_batch = cifar_input.build_input('cifar10', train_data_path, batch_size, 'train')
label_batches.append(label_batch)
x = _conv('weights', image_batch, 3, 3, 16, _stride_arr(1))
block1_gather.append(x)
with tf.device('/cpu:0'):
print block1_gather[0].get_shape()
x1 = tf.concat(block1_gather, 0)
# print x1.get_shape()
mean, variance = tf.nn.moments(x1, [0, 1, 2], name='moments')
for i in range(num_gpu):
with tf.device('/gpu:%d' % i): …Run Code Online (Sandbox Code Playgroud) 由于Adam Optimizer保持一对平均值,如渐变的均值/方差,我想知道它应该如何正确处理重量衰减.我已经看到了两种实现它的方法.
仅根据客观损失,每个小批量明确的衰减权重更新梯度的均值/方差.(以下代码摘自https://github.com/dmlc/mxnet/blob/v0.7.0/python/mxnet/optimizer.py)
weight[:] -= lr*mean/(sqrt(variance) + self.epsilon)
wd = self._get_wd(index)
if wd > 0.:
weight[:] -= (lr * wd) * weight
Run Code Online (Sandbox Code Playgroud)根据客观损失+正则化损失更新梯度的均值/方差,并像往常一样更新权重.(以下代码摘自https://github.com/dmlc/mxnet/blob/master/src/operator/optimizer_op-inl.h#L210)
grad = scalar<DType>(param.rescale_grad) * grad +
scalar<DType>(param.wd) * weight;
// stuff
Assign(out, req[0],
weight -
scalar<DType>(param.lr) * mean /
(F<square_root>(var) + scalar<DType>(param.epsilon)));
Run Code Online (Sandbox Code Playgroud)这两种方法有时在训练结果上显示出显着差异.而我实际上认为第一个更有意义(并且发现它会不时地提供更好的结果).Caffe和旧版本的mxnet遵循第一种方法,而火炬,tensorflow和新版本的mxnet遵循第二种方法.
真的很感谢你的帮助!
我对Torch不是很熟悉,主要使用Tensorflow。然而,我需要使用在 Torch 中重新训练的重新训练的初始模型。由于为我的特定应用程序重新训练初始模型需要大量计算资源,因此我想使用已经重新训练的模型。
该模型保存为.pth.tar文件。
我希望能够首先加载这个模型。到目前为止,我已经知道我必须使用以下内容:
model = torch.load('iNat_2018_InceptionV3.pth.tar', map_location='cpu')
Run Code Online (Sandbox Code Playgroud)
这似乎有效,因为print(model)打印出一大组数字和其他值,我认为它们是权重和偏差的值。
之后,我需要能够用它对图像进行分类。我一直无法弄清楚这一点。我必须如何格式化图像?是否应该将图像转换为数组?之后,我必须如何将输入数据传递到网络?
我想在pytorch中创建模型,但无法计算损失。它总是返回Tensor的Bool值,并且有多个值是模棱两可的。 实际上,我运行示例代码,它可以工作。
loss = CrossEntropyLoss()
input = torch.randn(8, 5)
input
target = torch.empty(8,dtype=torch.long).random_(5)
target
output = loss(input, target)
Run Code Online (Sandbox Code Playgroud)
这是我的代码,
################################################################################
##
##
import torch
from torch.nn import Conv2d, MaxPool2d, Linear, CrossEntropyLoss, MultiLabelSoftMarginLoss
from torch.nn.functional import relu, conv2d, max_pool2d, linear, softmax
from torch.optim import adadelta
##
##
## Train
Train = {}
Train["Image"] = torch.rand(2000, 3, 76, 76)
Train["Variable"] = torch.rand(2000, 6)
Train["Label"] = torch.empty(2000, dtype=torch.long).random_(2)
##
##
## Valid
Valid = {}
Valid["Image"] = torch.rand(150, 3, 76, 76)
Valid["Variable"] …Run Code Online (Sandbox Code Playgroud) 我需要避免从网上下载模型(由于安装的机器的限制)。
这可行,但它从互联网下载模型
model = torch.hub.load('pytorch/vision:v0.9.0', 'deeplabv3_resnet101', pretrained=True)
Run Code Online (Sandbox Code Playgroud)
我已将.pth文件和hubconf.py文件放在 /tmp/ 文件夹中,并将我的代码更改为
model = torch.hub.load('/tmp/', 'deeplabv3_resnet101', pretrained=True, source='local')
Run Code Online (Sandbox Code Playgroud)
但令我惊讶的是,它仍然从互联网上下载模型。我究竟做错了什么?如何在本地加载模型?
只是为了向您提供更多详细信息,我在 Docker 容器中执行所有这些操作,该容器在运行时具有只读卷,因此这就是新文件下载失败的原因。
我面临着将三个张量连接在一起,使得3个px1张量成为一个3px1张量.
我能想出的最简洁的是:
torch.Tensor{v2:totable(),v4:totable(),v6:totable()}:view(3*p,1)
Run Code Online (Sandbox Code Playgroud)
有没有办法在不转换为表格和返回张量的情况下执行此操作?似乎应该有一种将张量连接到某个指定维度的通用方法,假设它们具有兼容的形状.
我可以看到如何编写这样一个函数,一个不存在吗?
我有一个整数类标签的字节张量,例如来自MNIST数据集.
1
7
5
[torch.ByteTensor of size 3]
Run Code Online (Sandbox Code Playgroud)
如何使用它来创建1-hot向量的张量?
1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0 0
[torch.DoubleTensor of size 3x10]
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过一个循环来做到这一点,但我想知道是否有任何聪明的Torch索引会在一行中为我提供.
PyTorch的torch.transpose功能仅转换2D输入.文档在这里.
另一方面,Tensorflow的tf.transpose功能允许您转置N任意尺寸的张量.
有人可以解释为什么PyTorch没有/不能具有N维转置功能吗?这是否是由于PyTorch中的计算图构造与Tensorflow的Define-then-Run范式的动态特性?
我有一个 Pandas 数据框,其中的n行和k列已加载到内存中。我想获得一个预测的任务,其中一个批次的第一次训练的例子应该具有形状批次(q, k)与q指从原始数据帧的行数(例如,0:128)。下一个例子应该是(128:256, k)等等。因此,最终一批应具有(32, q, k)与批大小对应的 32的形状。
由于TensorDatasetfromdata_utils在这里不起作用,我想知道最好的方法是什么。我试图np.array_split()将q值的可能拆分数作为第一维,以便编写自定义 DataLoader,但由于并非所有数组都具有相同的形状,因此不能保证重新整形工作。
这是一个最小的例子,可以让它更清楚。在这种情况下,批量大小为 3,q为 2:
import pandas as pd
import numpy as np
df = pd.DataFrame(data=np.arange(0,30).reshape(10,3),columns=['A','B','C'])
Run Code Online (Sandbox Code Playgroud)
数据集:
A B C
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
4 12 13 14
5 15 16 17
6 18 19 20
7 21 …Run Code Online (Sandbox Code Playgroud) torch ×10
python ×4
pytorch ×4
caffe ×2
lua ×2
tensorflow ×2
indexing ×1
luajit ×1
multi-gpu ×1
mxnet ×1
pandas ×1
python-3.x ×1
torchvision ×1