标签: pytorch

在pytorch中使用交叉熵损失时,我应该使用softmax作为输出吗?

我在对pytorch 中的 MNIST 数据集的2 个隐藏层的全连接深度神经网络进行分类时遇到问题。

我想在两个隐藏层中都使用tanh作为激活,但最后,我应该使用softmax

对于损失,我选择nn.CrossEntropyLoss()了 PyTORch,它(正如我发现的那样)不想将单热编码标签作为真正的标签,而是采用 LongTensor 类。

我的模型是nn.Sequential(),当我最终使用 softmax 时,它在测试数据的准确性方面给了我更糟糕的结果。为什么?

import torch
from torch import nn

inputs, n_hidden0, n_hidden1, out = 784, 128, 64, 10
n_epochs = 500
model = nn.Sequential(
    nn.Linear(inputs, n_hidden0, bias=True), 
    nn.Tanh(),
    nn.Linear(n_hidden0, n_hidden1, bias=True),
    nn.Tanh(),
    nn.Linear(n_hidden1, out, bias=True),
    nn.Softmax()  # SHOULD THIS BE THERE?
)
                 
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.5)

for epoch in range(n_epochs):
    y_pred = model(X_train)
    loss = criterion(y_pred, …
Run Code Online (Sandbox Code Playgroud)

python mnist softmax pytorch

19
推荐指数
1
解决办法
1万
查看次数

PyTorch 中的 .flatten() 和 .view(-1) 有什么区别?

双方.flatten().view(-1)压平PyTorch张量。有什么不同?

  1. 是否.flatten()复制张量的数据?
  2. .view(-1)更快吗?
  3. .flatten()没有不工作的情况?

python pytorch

19
推荐指数
2
解决办法
7204
查看次数

Pytorch模型的超参数优化

为Pytorch模型执行超参数优化的最佳方法是什么?实施例如自己随机搜索?使用Skicit Learn?或者还有什么我不知道的?

machine-learning deep-learning hyperparameters pytorch

18
推荐指数
4
解决办法
7726
查看次数

如何在pytorch中将字符串列表转换为张量?

我正在研究分类问题,其中我有一个字符串列表作为类标签,我想将它们转换为张量。到目前为止,我已经尝试numpy array使用np.arraynumpy 模块提供的函数将字符串列表转换为。

truth = torch.from_numpy(np.array(truths))

但我收到以下错误。

RuntimeError: can't convert a given np.ndarray to a tensor - it has an invalid type. The only supported types are: double, float, int64, int32, and uint8.

有人可以建议另一种方法吗?谢谢

python numpy pytorch

18
推荐指数
3
解决办法
3万
查看次数

将torch.nn.DataParallel与自定义CUDA扩展一起使用

根据我的理解,内置的pytorch操作都可以通过隐式矢量化自动处理批处理,允许跨多个GPU进行并行处理.

但是,根据文档在CUDA中编写自定义操作时,给定的LLTM示例执行批处理不变的操作,例如,计算元素的Sigmoid函数的梯度.

但是,我有一个不是批处理元素不变的用例而不是vectorisable.在单个GPU上运行,我目前(效率低下)遍历批处理中的每个元素,为每个元素执行内核启动,就像这样(用浏览器编写,只是为了演示):

std::vector<at::Tensor> op_cuda_forward(at::Tensor input, 
                                        at::Tensor elementSpecificParam) {

    auto output = at::zeros(torch::CUDA(/* TYPE */), {/* DIMENSIONS */});

    const size_t blockDim = //
    const size_t gridDim = //
    const size_t = numBatches = //

    for (size_t i = 0; i < numBatches; i++) {
        op_cuda_forward_kernel<T><<<gridDim, blockDim>>>(input[i],
                                                         elementSpecificParam[i], 
                                                         output[i]);
    }

    return {output};
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望通过批处理元素将此操作拆分为多个GPU.

如何output在多GPU场景中分配Tensor?

当然,可以在启动适当的内核之前在每个GPU上创建中间Tensors,但是将输入数据复制到每个GPU并且再次返回的开销将是有问题的.

有没有一种更简单的方法来启动内核而不首先探测GPU信息的环境(#GPU等)?

最终目标是使用与torch.nn.DataParallel一起使用的CUDA操作.

neural-network deep-learning pytorch libtorch

18
推荐指数
1
解决办法
533
查看次数

获取CUDA_HOME环境路径PYTORCH

我通过 anaconda 在我的系统上安装了 cuda,该系统有 2 个 GPU,它被我的 python 识别。

import torch
torch.cuda.is_available()
true
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试通过 C API 运行模型时,出现以下错误:

~/anaconda3/lib/python3.6/site-packages/torch/utils/cpp_extension.py in _join_cuda_home(*paths)
722     '''
723     if CUDA_HOME is None:
--> 724         raise EnvironmentError('CUDA_HOME environment variable is not set. '
725                                'Please set it to your CUDA install root.')
726     return os.path.join(CUDA_HOME, *paths)

OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.
Run Code Online (Sandbox Code Playgroud)

https://lfd.readthedocs.io/en/latest/install_gpu.html页面给出了如果通过他们的方法安装 cuda 则设置 CUDA_HOME 路径的说明。由于我已经通过 anaconda 安装了 cuda,所以我不知道要设置哪个路径。

我尝试了 find 方法,但它返回了太多 cuda 路径。有人可以帮我找到 CUDA …

python anaconda deep-learning pytorch

18
推荐指数
1
解决办法
7万
查看次数

安装 cudatoolkit 时缺少 Nvcc?

我已经在 pytorch 上安装了 cuda

conda install pytorch torchvision cudatoolkit=10.0 -c pytorch
Run Code Online (Sandbox Code Playgroud)

但是,似乎没有安装 nvcc。例如nvcc -V,如果我想使用,我会收到未找到 nvcc 的错误,我应该使用sudo apt install nvidia-cuda-toolkit. Can I do this安装它(我不想只是尝试然后发现它不起作用/弄乱了整个cuda 设置)。这是错误还是预期行为?

我使用的是 Ubuntu 18.04 并且有 cuda 10.2

cuda nvcc anaconda pytorch

18
推荐指数
6
解决办法
2万
查看次数

如何在不重启内核的情况下在 PyTorch 模型训练后清除 GPU 内存

我正在 Jupyter-Lab 笔记本上训练 PyTorch 深度学习模型,在 Tesla K80 GPU 上使用 CUDA 进行训练。在进行训练迭代时,会使用 12 GB 的 GPU 内存。我通过保存模型检查点来完成训练,但想继续使用笔记本进行进一步分析(分析中间结果等)。

但是,这些 12 GBnvtop在完成训练后继续被占用(如从 中看到的)。我想释放这个内存,以便我可以将它用于其他笔记本。

到目前为止,我的解决方案是重新启动此笔记本的内核,但这并不能解决我的问题,因为到目前为止我无法继续使用相同的笔记本及其各自计算的输出。

python jupyter pytorch

18
推荐指数
4
解决办法
2万
查看次数

CUDA 错误:调用 `cublasCreate(handle)` 时出现 CUBLAS_STATUS_ALLOC_FAILED

在 colab 中运行 pytorch 深度学习模型时出现以下错误

/usr/local/lib/python3.6/dist-packages/torch/nn/functional.py in linear(input, weight, bias)
   1370         ret = torch.addmm(bias, input, weight.t())
   1371     else:
-> 1372         output = input.matmul(weight.t())
   1373         if bias is not None:
   1374             output += bias

RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`
Run Code Online (Sandbox Code Playgroud)

我什至将批量大小从 128 减少到 64,即减少到一半,但仍然出现此错误。早些时候,我以 128 的批量大小运行了相同的代码,但没有收到任何类似的错误。

nlp pytorch bert-language-model

18
推荐指数
5
解决办法
4万
查看次数

在 PyTorch 中,grad_fn 属性到底存储什么以及如何使用?

在 PyTorch 中,Tensor类有一个grad_fn属性。这引用了用于获取张量的操作:例如, if a = b + 2, a.grad_fnwill be AddBackward0。但“参考”到底是什么意思呢?

检查AddBackward0usinginspect.getmro(type(a.grad_fn))将指出 的唯一基类AddBackward0object此外,在源代码grad_fn中找不到该类的源代码(事实上,在 中可能遇到的任何其他类) !

所有这些让我想到以下问题:

  1. 反向传播期间到底存储了什么grad_fn以及如何调用它?
  2. 为什么存储的对象grad_fn没有某种通用的超类,为什么 GitHub 上没有它们的源代码?

python oop pytorch

18
推荐指数
1
解决办法
2万
查看次数