我有一个网络(https://github.com/TheAbhiKumar/tensorflow-value-iteration-networks),我试图在pytorch中实现(我对pytorch很新,但是,根本不是机器学习的新手) .
简而言之,我似乎无法弄清楚如何在pytorch中实现"纯"卷积.在张量流中,它可以像这样完成:
def conv2d_flipkernel(x, k, name=None):
return tf.nn.conv2d(x, flipkernel(k), name=name,
strides=(1, 1, 1, 1), padding='SAME')
Run Code Online (Sandbox Code Playgroud)
使用flipkernel函数:
def flipkernel(kern):
return kern[(slice(None, None, -1),) * 2 + (slice(None), slice(None))]
Run Code Online (Sandbox Code Playgroud)
如何在pytorch中完成类似的事情?
convolution neural-network torch conv-neural-network pytorch
我正在尝试使用列上的逻辑索引切片PyTorch张量.我想要与索引向量中的1值对应的列.切片和逻辑索引都是可能的,但它们是否可以一起使用?如果是这样,怎么样?我的尝试一直在抛出无益的错误
TypeError:使用ByteTensor类型的对象索引张量.唯一支持的类型是整数,切片,numpy标量和torch.LongTensor或torch.ByteTensor作为唯一的参数.
期望的输出
C = torch.LongTensor([[1, 3], [4, 6]])
# 1 3
# 4 6
Run Code Online (Sandbox Code Playgroud)
仅对列进行逻辑索引
import torch
A_log = torch.ByteTensor([1, 0, 1]) # the logical index
B = torch.LongTensor([[1, 2, 3], [4, 5, 6]])
C = B[:, A_log] # Throws error
Run Code Online (Sandbox Code Playgroud)
我也试过使用索引列表
import torch
A_idx = torch.LongTensor([0, 2]) # the index vector
B = torch.LongTensor([[1, 2, 3], [4, 5, 6]])
C = B[:, A_idx] # Throws error
Run Code Online (Sandbox Code Playgroud)
如果向量大小相同,则逻辑索引有效
import torch
A_log = torch.ByteTensor([1, 0, 1]) # the logical …
Run Code Online (Sandbox Code Playgroud) 我想要可视化神经网络层的权重.我正在使用pytorch.
import torch
import torchvision.models as models
from matplotlib import pyplot as plt
def plot_kernels(tensor, num_cols=6):
if not tensor.ndim==4:
raise Exception("assumes a 4D tensor")
if not tensor.shape[-1]==3:
raise Exception("last dim needs to be 3 to plot")
num_kernels = tensor.shape[0]
num_rows = 1+ num_kernels // num_cols
fig = plt.figure(figsize=(num_cols,num_rows))
for i in range(tensor.shape[0]):
ax1 = fig.add_subplot(num_rows,num_cols,i+1)
ax1.imshow(tensor[i])
ax1.axis('off')
ax1.set_xticklabels([])
ax1.set_yticklabels([])
plt.subplots_adjust(wspace=0.1, hspace=0.1)
plt.show()
vgg = models.vgg16(pretrained=True)
mm = vgg.double()
filters = mm.modules
body_model = [i for i in mm.children()][0]
layer1 = …
Run Code Online (Sandbox Code Playgroud) 我得到了一维IntTensor,但我想将其转换为整数。我通过这种方法尝试:
print(dictionary[IntTensor.int()])
Run Code Online (Sandbox Code Playgroud)
但出现错误:
KeyError: Variable containing:
423
[torch.IntTensor of size 1]
Run Code Online (Sandbox Code Playgroud)
谢谢〜
如何使用PyTorch上的fastai实现加载预训练模型?就像在SkLearn中一样,我可以使用pickle将模型转储到文件中,然后加载并稍后使用.在声明像bellow这样的学习实例之后,我使用了.load()方法来加载以前保存的权重:
arch=resnet34
data = ImageClassifierData.from_paths(PATH, tfms=tfms_from_model(arch, sz))
learn = ConvLearner.pretrained(arch, data, precompute=False)
learn.load('resnet34_test')
Run Code Online (Sandbox Code Playgroud)
然后预测图像的类:
trn_tfms, val_tfms = tfms_from_model(arch,100)
img = open_image('circle/14.png')
im = val_tfms(img)
preds = learn.predict_array(im[None])
print(np.argmax(preds))
Run Code Online (Sandbox Code Playgroud)
但它让我错误:
ValueError: Expected more than 1 value per channel when training, got input size [1, 1024]
Run Code Online (Sandbox Code Playgroud)
如果我使用此代码learn.fit(0.01, 3)
而不是learn.load()
.我真正想要的是避免在我的应用程序中的训练步骤.
我有TypeError: expected torch.LongTensor (got torch.cuda.FloatTensor)
.
我如何转换torch.cuda.FloatTensor
为torch.LongTensor
?
Traceback (most recent call last):
File "train_v2.py", line 110, in <module>
main()
File "train_v2.py", line 81, in main
model.update(batch)
File "/home/Desktop/squad_vteam/src/model.py", line 131, in update
loss_adv = self.adversarial_loss(batch, loss, self.network.lexicon_encoder.embedding.weight, y)
File "/home/Desktop/squad_vteam/src/model.py", line 94, in adversarial_loss
adv_embedding = torch.LongTensor(adv_embedding)
TypeError: expected torch.LongTensor (got torch.cuda.FloatTensor)
Run Code Online (Sandbox Code Playgroud) 嗨,我有一个问题,关于如何从BI-LSTM模块的输出中收集正确的结果。
假设我有一个10长度的序列输入到具有100个隐藏单元的单层LSTM模块中:
lstm = nn.LSTM(5, 100, 1, bidirectional=True)
Run Code Online (Sandbox Code Playgroud)
output
形状如下:
[10 (seq_length), 1 (batch), 200 (num_directions * hidden_size)]
# or according to the doc, can be viewed as
[10 (seq_length), 1 (batch), 2 (num_directions), 100 (hidden_size)]
Run Code Online (Sandbox Code Playgroud)
如果我想同时获得两个方向上的第三个(1-索引)输入输出(两个100维矢量),我该如何正确执行呢?
我知道output[2, 0]
会给我一个200维的向量。这个200个暗淡的向量代表两个方向上的第三个输入的输出吗?
令我困扰的是,当进行反向进给时,从第8个(1-索引)输入计算出第三个(1-索引)输出矢量,对吗?
pytorch会自动处理此问题并考虑方向分组输出吗?
谢谢!
假定具有以下形状的火炬张量:
x = torch.rand(20, 1, 120, 120)
Run Code Online (Sandbox Code Playgroud)
我现在想要的是获取每个120x120矩阵的最大值的索引。为了简化问题,我将首先x.squeeze()
使用shape [20, 120, 120]
。然后,我想获取火炬张量,它是具有shape的索引列表[20, 2]
。
我该如何快速完成?
我正在尝试获取已经训练过的神经网络的输出。输入是大小为300x300的图像。我使用的批量大小为1,但是CUDA error: out of memory
成功获取25张图像的输出后,仍然出现错误。
我在网上搜索了一些解决方案并遇到了torch.cuda.empty_cache()
。但这似乎仍不能解决问题。
这是我正在使用的代码。
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
train_x = torch.tensor(train_x, dtype=torch.float32).view(-1, 1, 300, 300)
train_x = train_x.to(device)
dataloader = torch.utils.data.DataLoader(train_x, batch_size=1, shuffle=False)
right = []
for i, left in enumerate(dataloader):
print(i)
temp = model(left).view(-1, 1, 300, 300)
right.append(temp.to('cpu'))
del temp
torch.cuda.empty_cache()
Run Code Online (Sandbox Code Playgroud)
这种for loop
运行给内存错误之前为25次,每次时间。
每次,我都会在网络中发送一个新图像进行计算。因此,在循环中的每次迭代之后,我实际上都不需要将先前的计算结果存储在GPU中。有什么办法可以做到这一点?
任何帮助将不胜感激。谢谢。
pytorch ×10
python ×4
tensor ×2
convolution ×1
indices ×1
lstm ×1
matplotlib ×1
max ×1
resnet ×1
scikit-learn ×1
torch ×1