我正在使用 anaconda 来调节我的环境,对于一个项目,我必须使用 GPU 进行网络训练。我在我的项目中使用 pytorch,并且正在尝试让 CUDA 工作。
我安装了cudatoolkit、numba、cudnn
不过,当我尝试这个命令时:
torch.cuda.is_available()
Run Code Online (Sandbox Code Playgroud)
我得到“False”作为输出。这是我的环境:
# Name Version Build Channel
blas 1.0 mkl
bzip2 1.0.6 h470a237_2 conda-forge
ca-certificates 2018.03.07 0
cairo 1.14.12 he6fea26_5 conda-forge
certifi 2018.8.24 py35_1
cffi 1.11.5 py35he75722e_1
cloudpickle 0.5.5 py35_0
cudatoolkit 9.2 0 anaconda
cudnn 7.2.1 cuda9.2_0 anaconda
cycler 0.10.0 py_1 conda-forge
cython 0.28.5 py35hf484d3e_0 anaconda
dask-core 0.19.2 py35_0
dbus 1.13.0 h3a4f0e9_0 conda-forge
decorator 4.3.0 py35_0
expat 2.2.5 hfc679d8_2 conda-forge
ffmpeg 4.0.2 ha0c5888_1 conda-forge
fontconfig 2.13.1 h65d0f4c_0 conda-forge
freetype 2.9.1 …
Run Code Online (Sandbox Code Playgroud) 根据这个SO和这个PyTorch讨论,PyTorch的view
功能仅适用于连续内存,而reshape
不能。在第二个链接中,作者甚至声称:
[
view
] 将在非连续张量上引发错误。
但是张量什么时候有非连续内存呢?
如何在 pytorch 中使用 tfrecord?
我已经下载了具有视频级特征的“Youtube8M”数据集,但它存储在tfrecord中。我尝试从这些文件中读取一些示例,将其转换为 numpy,然后加载到 pytorch 中。但它失败了。
reader = YT8MAggregatedFeatureReader()
files = tf.gfile.Glob("/Data/youtube8m/train*.tfrecord")
filename_queue = tf.train.string_input_producer(
files, num_epochs=5, shuffle=True)
training_data = [
reader.prepare_reader(filename_queue) for _ in range(1)
]
unused_video_id, model_input_raw, labels_batch, num_frames = tf.train.shuffle_batch_join(
training_data,
batch_size=1024,
capacity=1024 * 5,
min_after_dequeue=1024,
allow_smaller_final_batch=True ,
enqueue_many=True)
with tf.Session() as sess:
label_numpy = labels_batch.eval()
print(type(label_numpy))
Run Code Online (Sandbox Code Playgroud)
但这一步却没有任何结果,只是卡了半天没有任何反应。
我有一个二维张量:
samples = torch.Tensor([
[0.1, 0.1], #-> group / class 1
[0.2, 0.2], #-> group / class 2
[0.4, 0.4], #-> group / class 2
[0.0, 0.0] #-> group / class 0
])
Run Code Online (Sandbox Code Playgroud)
以及对应于一个类的每个样本的标签:
labels = torch.LongTensor([1, 2, 2, 0])
Run Code Online (Sandbox Code Playgroud)
所以len(samples) == len(labels)
。现在我想计算每个类别/标签的平均值。因为有 3 个类(0、1 和 2),所以最终向量应该具有维度[n_classes, samples.shape[1]]
所以预期的解决方案应该是:
result == torch.Tensor([
[0.1, 0.1],
[0.3, 0.3], # -> mean of [0.2, 0.2] and [0.4, 0.4]
[0.0, 0.0]
])
Run Code Online (Sandbox Code Playgroud)
问题:如何在纯 pytorch 中完成此操作(即没有 numpy,以便我可以自动分级)并且理想情况下没有 for 循环?
从Convolution 的PyTorch文档中,我看到该函数torch.nn.Conv1d
需要用户传递参数in_channels
和out_channels
。
我知道这些指的是“输入通道”和“输出通道”,但我不确定它们在卷积的上下文中意味着什么。我的猜测是,这in_channels
相当于输入特征,也out_channels
相当于输出特征,但我不确定。
有人可以解释一下这些论点指的是什么吗?
这是一个非常新手的问题,但我试图解决 Torch 中的 cross_entropy 损失问题,所以我创建了以下代码:
x = torch.FloatTensor([
[1.,0.,0.]
,[0.,1.,0.]
,[0.,0.,1.]
])
print(x.argmax(dim=1))
y = torch.LongTensor([0,1,2])
loss = torch.nn.functional.cross_entropy(x, y)
print(loss)
Run Code Online (Sandbox Code Playgroud)
输出以下内容:
tensor([0, 1, 2])
tensor(0.5514)
Run Code Online (Sandbox Code Playgroud)
我不明白的是,鉴于我的输入与预期输出匹配,为什么损失不为 0?
我正在尝试仅使用 PyTorch Mnist 数据集中的特定数字创建数据加载器
我已经尝试创建自己的采样器,但它不起作用,而且我不确定我是否正确使用了蒙版。
class YourSampler(torch.utils.data.sampler.Sampler):
def __init__(self, mask):
self.mask = mask
def __iter__(self):
return (self.indices[i] for i in torch.nonzero(self.mask))
def __len__(self):
return len(self.mask)
mnist = datasets.MNIST(root=dataroot, train=True, download=True, transform = transform)
mask = [True if mnist[i][1] == 5 else False for i in range(len(mnist))]
mask = torch.tensor(mask)
sampler = YourSampler(mask)
trainloader = torch.utils.data.DataLoader(mnist, batch_size=4, sampler = sampler, shuffle=False, num_workers=2)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我遇到了许多不同类型的错误。对于此实现,它是“停止迭代”。我觉得这很简单/愚蠢,但我找不到一个简单的方法来做到这一点。感谢您的帮助!
在Pytorch中,是否有类似于Scipy的三次样条插值?给定一维输入张量x
和y
,我想对这些点进行插值并在 处求值xs
以获得ys
。另外,我想要一个积分器函数来查找,即从到 的Ys
样条插值的积分。x[0]
xs
在 CPU 上,与 numpy 数组torch.as_tensor(a)
相同, ?如果没有,那为什么不呢?torch.from_numpy(a)
a
从文档中torch.as_tensor
如果数据是
ndarray
对应的dtype
并且device
是cpu,则不会执行任何复制。
从文档中torch.from_numpy
:
返回的张量和
ndarray
共享相同的内存。对张量的修改将反映在 中,ndarray
反之亦然。
在这两种情况下,结果张量的任何更改都会更改原始 numpy 数组。
a = np.array([[1., 2], [3, 4]])
t1 = torch.as_tensor(a)
t2 = torch.from_numpy(a)
t1[0, 0] = 42.
print(a)
# prints [[42., 2.], [3., 4.]]
t2[1, 1] = 55.
print(a)
# prints [[42., 2.], [3., 55.]]
Run Code Online (Sandbox Code Playgroud)
此外,在这两种情况下,尝试调整张量的大小都会导致错误。