我在对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) 双方.flatten()并.view(-1)压平PyTorch张量。有什么不同?
.flatten()复制张量的数据?.view(-1)更快吗?.flatten()没有不工作的情况?为Pytorch模型执行超参数优化的最佳方法是什么?实施例如自己随机搜索?使用Skicit Learn?或者还有什么我不知道的?
我正在研究分类问题,其中我有一个字符串列表作为类标签,我想将它们转换为张量。到目前为止,我已经尝试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.
有人可以建议另一种方法吗?谢谢
根据我的理解,内置的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操作.
我通过 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 …
我已经在 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
我正在 Jupyter-Lab 笔记本上训练 PyTorch 深度学习模型,在 Tesla K80 GPU 上使用 CUDA 进行训练。在进行训练迭代时,会使用 12 GB 的 GPU 内存。我通过保存模型检查点来完成训练,但想继续使用笔记本进行进一步分析(分析中间结果等)。
但是,这些 12 GBnvtop在完成训练后继续被占用(如从 中看到的)。我想释放这个内存,以便我可以将它用于其他笔记本。
到目前为止,我的解决方案是重新启动此笔记本的内核,但这并不能解决我的问题,因为到目前为止我无法继续使用相同的笔记本及其各自计算的输出。
在 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 的批量大小运行了相同的代码,但没有收到任何类似的错误。
在 PyTorch 中,Tensor类有一个grad_fn属性。这引用了用于获取张量的操作:例如, if a = b + 2, a.grad_fnwill be AddBackward0。但“参考”到底是什么意思呢?
检查AddBackward0usinginspect.getmro(type(a.grad_fn))将指出 的唯一基类AddBackward0是object。此外,在源代码grad_fn中找不到该类的源代码(事实上,在 中可能遇到的任何其他类) !
所有这些让我想到以下问题:
grad_fn以及如何调用它?grad_fn没有某种通用的超类,为什么 GitHub 上没有它们的源代码?