Numpy 分配torch.cuda.FloatTensor

Numpy 分配torch.cuda.FloatTensor,numpy,gpu,pytorch,Numpy,Gpu,Pytorch,我想知道如何执行以下代码,但现在使用pytorch, 其中dtype=torch.cuda.FloatTensor。下面是纯python代码(使用numpy): 这是我的尝试: import torch dtype = torch.cuda.FloatTensor def fit (position): return position**2 def main(): pop = 30 xmax, xmin = 5, -5 x= (xmax-xmin)*torch

我想知道如何执行以下代码,但现在使用pytorch, 其中dtype=torch.cuda.FloatTensor。下面是纯python代码(使用numpy):

这是我的尝试:

import torch
dtype = torch.cuda.FloatTensor 
def fit (position):
    return  position**2
def main():
    pop = 30
    xmax, xmin = 5, -5
    x= (xmax-xmin)*torch.rand(pop, 1).type(dtype)+xmin
    y = fit(x)
    [miny, indexmin] = torch.min(y,0)
    best = x[indexmin]
    print(best)  
在最后一部分中,我将变量best定义为索引等于indexmin的x值,但它不起作用。我做错了什么

出现以下消息:

RuntimeError: expecting vector of indices at /opt/conda/conda-bld/pytorch_1501971235237/work/pytorch-0.1.12/torch/lib/THC/generic/THCTensorIndex.cu:405

上述代码在pytorch
0.2
中运行良好。让我分析一下您的代码,以便您能够识别问题

x= (xmax-xmin)*torch.rand(pop, 1).type(dtype)+xmin
y = fit(x)
这里,
x
y
是形状为
30x1
的二维张量。在下一行:

[miny, indexmin] = torch.min(y,0)
返回的张量
miny
是形状为
30x1
的二维张量,
indexmin
是大小为
1
的一维张量。因此,当您执行时:

best = x[indexmin]
它(可能)给出了错误(在旧pytorch版本中),因为
x
是形状为
30x1
的二维张量,
indexmin
是大小为
1
的一维张量。要解决此错误,只需执行以下操作:

best = x.squeeze()[indexmin] # x.squeeze() returns a 1d tensor of size `30`
请注意,形状为
30x1
的二维张量与大小为
30
的一维张量相同。因此,您可以按如下方式修改您的程序

import torch
dtype = torch.cuda.FloatTensor 
def main():
    pop, xmax, xmin = 30, 5, -5
    x= (xmax-xmin)*torch.rand(pop).type(dtype)+xmin
    y = torch.pow(x, 2)
    minz, indexmin = y.min(0)
    best = x[indexmin]
    print(best)

main()

上述代码在pytorch
0.2
中运行良好。让我分析一下您的代码,以便您能够识别问题

x= (xmax-xmin)*torch.rand(pop, 1).type(dtype)+xmin
y = fit(x)
这里,
x
y
是形状为
30x1
的二维张量。在下一行:

[miny, indexmin] = torch.min(y,0)
返回的张量
miny
是形状为
30x1
的二维张量,
indexmin
是大小为
1
的一维张量。因此,当您执行时:

best = x[indexmin]
它(可能)给出了错误(在旧pytorch版本中),因为
x
是形状为
30x1
的二维张量,
indexmin
是大小为
1
的一维张量。要解决此错误,只需执行以下操作:

best = x.squeeze()[indexmin] # x.squeeze() returns a 1d tensor of size `30`
请注意,形状为
30x1
的二维张量与大小为
30
的一维张量相同。因此,您可以按如下方式修改您的程序

import torch
dtype = torch.cuda.FloatTensor 
def main():
    pop, xmax, xmin = 30, 5, -5
    x= (xmax-xmin)*torch.rand(pop).type(dtype)+xmin
    y = torch.pow(x, 2)
    minz, indexmin = y.min(0)
    best = x[indexmin]
    print(best)

main()

嘿我无法重现这个错误。我使用的是另一个pytorch版本,它运行得很好。请您从航站楼运行
conda list | grep pytorch
好吗?@cleros谢谢!很抱歉,我发布了错误的代码导入torch dtype=torch.cuda.FloatTensor def fit(x):返回x2 def main():pop=30 xmax,xmin=5,-5 x=(xmax xmin)*torch.rand(pop,1)。type(dtype)+xmin y=fit(x)[miny,indexmin]=torch.min(y,0)best=x[indexmin]print(best)main()这是给我错误的代码。**2)当我运行grep pytorch时:“grep”不被识别为内部或外部命令、可操作程序或批处理文件。嘿!我无法重现这个错误。我使用的是另一个pytorch版本,它运行得很好。请您从航站楼运行
conda list | grep pytorch
好吗?@cleros谢谢!很抱歉,我发布了错误的代码导入torch dtype=torch.cuda.FloatTensor def fit(x):返回x2 def main():pop=30 xmax,xmin=5,-5 x=(xmax xmin)*torch.rand(pop,1)。type(dtype)+xmin y=fit(x)[miny,indexmin]=torch.min(y,0)best=x[indexmin]print(best)main()这是给我错误的代码。**2)当我运行grep pytorch时:“grep”不被识别为内部或外部命令、可操作程序或批处理文件。