标签: pytorch

DCGAN 调试。得到只是垃圾

介绍:

我正在尝试让 CDCGAN(条件深度卷积生成对抗网络)处理 MNIST 数据集,考虑到我使用的库(PyTorch)在其网站上有教程,这应该相当容易。
但我似乎无法让它工作,它只会产生垃圾或模型崩溃或两者兼而有之。

我试过的:

  • 使模型有条件的半监督学习
  • 使用批处理规范
  • 除了生成器和鉴别器上的输入/输出层之外,在每一层上使用 dropout
  • 标签平滑以打击过度自信
  • 向图像添加噪声(我猜你称之为实例噪声)以获得更好的数据分布
  • 使用leaky relu来避免梯度消失
  • 使用重放缓冲区来防止忘记学到的东西和过度拟合
  • 玩超参数
  • 将其与 PyTorch 教程中的模型进行比较
  • 除了嵌入层等一些事情之外,基本上我做了什么。

我的模型生成的图像:

超参数:

batch_size=50, learning_rate_discrimiantor=0.0001, learning_rate_generator=0.0003, shuffle=True, ndf=64, ngf=64, dropout=0.5
在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

batch_size=50, learning_rate_discriminator=0.0003, learning_rate_generator=0.0003, shuffle=True, ndf=64, ngf=64, dropout=0
在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

图片Pytorch 教程 模型生成:

pytorch 教程 dcgan 模型的代码
作为比较,这里是来自 pytorch turoial 的 DCGAN 的图像:
在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

我的代码:

import torch
import torch.nn as nn
import torchvision
from torchvision import transforms, datasets
import torch.nn.functional as F
from torch import optim as optim
from torch.utils.tensorboard import SummaryWriter …
Run Code Online (Sandbox Code Playgroud)

python neural-network pytorch generative-adversarial-network

30
推荐指数
1
解决办法
664
查看次数

为什么在 Pytorch 张量上调用 .numpy() 之前调用 .detach() ?

已经确定这my_tensor.detach().numpy()是从torch张量获取 numpy 数组的正确方法。

我试图更好地理解为什么。

在刚刚链接的问题的公认答案中,Blupon 指出:

您需要将您的张量转换为另一个除了其实际值定义之外不需要梯度的张量。

在他链接到的第一个讨论中,albanD 指出:

这是预期的行为,因为移动到 numpy 会破坏图形,因此不会计算梯度。

如果您实际上不需要渐变,那么您可以显式地 .detach() 需要 grad 的 Tensor 以获得具有相同内容但不需要 grad 的张量。然后可以将这个其他 Tensor 转换为一个 numpy 数组。

在他链接到的第二个讨论中,apaszke 写道:

变量不能转换为 numpy,因为它们是保存操作历史的张量的包装器,而 numpy 没有这样的对象。您可以使用 .data 属性检索变量持有的张量。然后,这应该有效:var.data.numpy()。

我研究了 PyTorch 的自动分化库的内部工作原理,但我仍然对这些答案感到困惑。为什么它会破坏图形以移动到 numpy?是否因为在 autodiff 图中不会跟踪对 numpy 数组的任何操作?

什么是变量?它与张量有什么关系?

我觉得这里需要一个彻底的高质量 Stack-Overflow 答案,向尚不了解自动分化的 PyTorch 新用户解释原因。

特别是,我认为通过一个图形来说明图形并显示在此示例中断开连接是如何发生的会很有帮助:

import torch

tensor1 = torch.tensor([1.0,2.0],requires_grad=True)

print(tensor1)
print(type(tensor1))

tensor1 = tensor1.numpy()

print(tensor1)
print(type(tensor1))
Run Code Online (Sandbox Code Playgroud)

numpy autodiff pytorch

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

理解一个简单的LSTM pytorch

import torch,ipdb
import torch.autograd as autograd
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable

rnn = nn.LSTM(input_size=10, hidden_size=20, num_layers=2)
input = Variable(torch.randn(5, 3, 10))
h0 = Variable(torch.randn(2, 3, 20))
c0 = Variable(torch.randn(2, 3, 20))
output, hn = rnn(input, (h0, c0))
Run Code Online (Sandbox Code Playgroud)

这是文档中的LSTM示例.我不明白以下事项:

  1. 什么是输出大小,为什么没有在任何地方指定?
  2. 为什么输入有3个维度.5和3代表什么?
  3. h0和c0中的2和3是什么,这些代表什么?

编辑:

import torch,ipdb
import torch.autograd as autograd
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable
import torch.nn.functional as F

num_layers=3 …
Run Code Online (Sandbox Code Playgroud)

neural-network lstm pytorch rnn

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

如何将自定义数据集拆分为训练和测试数据集?

import pandas as pd
import numpy as np
import cv2
from torch.utils.data.dataset import Dataset

class CustomDatasetFromCSV(Dataset):
    def __init__(self, csv_path, transform=None):
        self.data = pd.read_csv(csv_path)
        self.labels = pd.get_dummies(self.data['emotion']).as_matrix()
        self.height = 48
        self.width = 48
        self.transform = transform

    def __getitem__(self, index):
        pixels = self.data['pixels'].tolist()
        faces = []
        for pixel_sequence in pixels:
            face = [int(pixel) for pixel in pixel_sequence.split(' ')]
            # print(np.asarray(face).shape)
            face = np.asarray(face).reshape(self.width, self.height)
            face = cv2.resize(face.astype('uint8'), (self.width, self.height))
            faces.append(face.astype('float32'))
        faces = np.asarray(faces)
        faces = np.expand_dims(faces, -1)
        return faces, self.labels

    def __len__(self): …
Run Code Online (Sandbox Code Playgroud)

python deep-learning pytorch

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

“运行时错误:4 维权重 32 3 3 的预期 4 维输入,但得到大小为 [3, 224, 224] 的 3 维输入”?

我正在尝试使用预先训练的模型。这就是问题发生的地方

模型不是应该接收简单的彩色图像吗?为什么它需要 4 维输入?

RuntimeError                              Traceback (most recent call last)
<ipython-input-51-d7abe3ef1355> in <module>()
     33 
     34 # Forward pass the data through the model
---> 35 output = model(data)
     36 init_pred = output.max(1, keepdim=True)[1] # get the index of the max log-probability
     37 

5 frames
/usr/local/lib/python3.6/dist-packages/torch/nn/modules/conv.py in forward(self, input)
    336                             _pair(0), self.dilation, self.groups)
    337         return F.conv2d(input, self.weight, self.bias, self.stride,
--> 338                         self.padding, self.dilation, self.groups)
    339 
    340 

RuntimeError: Expected 4-dimensional input for 4-dimensional weight 32 3 3, but got 3-dimensional input of …
Run Code Online (Sandbox Code Playgroud)

machine-learning computer-vision conv-neural-network pytorch torchvision

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

为什么 Pytorch 官方使用 mean=[0.485, 0.456, 0.406] 和 std=[0.229, 0.224, 0.225] 来规范化图像?

在这个页面(https://pytorch.org/vision/stable/models.html)中,它说“所有预训练的模型都期望以相同的方式标准化输入图像,即小批量的 3 通道 RGB 图像形状 (3 x H x W),其中 H 和 W 预计至少为 224。图像必须加载到 [0, 1] 的范围内,然后使用mean = [0.485, 0.456, 0.406]std = [0.229, 0.224, 0.225]“进行归一化。

如果不是平时meanstd正常化是[0.5, 0.5, 0.5][0.5, 0.5, 0.5]?为什么要设置这么奇怪的值?

python normalize pytorch

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

PyTorch 中的早期停止

我尝试实现提前停止功能以避免我的神经网络模型过度拟合。我很确定逻辑是正确的,但由于某种原因,它不起作用。我希望当验证损失大于某些时期的训练损失时,早期停止函数返回 True。但它始终返回 False,即使验证损失变得比训练损失大得多。请问您能看出问题出在哪里吗?

早停功能

def early_stopping(train_loss, validation_loss, min_delta, tolerance):

    counter = 0
    if (validation_loss - train_loss) > min_delta:
        counter +=1
        if counter >= tolerance:
          return True
Run Code Online (Sandbox Code Playgroud)

在训练期间调用该函数

for i in range(epochs):
    
    print(f"Epoch {i+1}")
    epoch_train_loss, pred = train_one_epoch(model, train_dataloader, loss_func, optimiser, device)
    train_loss.append(epoch_train_loss)

    # validation 

    with torch.no_grad(): 
       epoch_validate_loss = validate_one_epoch(model, validate_dataloader, loss_func, device)
       validation_loss.append(epoch_validate_loss)
    
    # early stopping
    if early_stopping(epoch_train_loss, epoch_validate_loss, min_delta=10, tolerance = 20):
      print("We are at epoch:", i)
      break
Run Code Online (Sandbox Code Playgroud)

编辑:训练和验证损失: 在此输入图像描述 在此输入图像描述

编辑2:

def train_validate (model, train_dataloader, validate_dataloader, loss_func, optimiser, device, epochs): …
Run Code Online (Sandbox Code Playgroud)

python neural-network deep-learning pytorch early-stopping

29
推荐指数
2
解决办法
5万
查看次数

Pytorch重塑张量维度

例如,我有1维向量的维度(5).我想将其重塑为2D矩阵(1,5).

这是我如何用numpy做的

>>> import numpy as np
>>> a = np.array([1,2,3,4,5])
>>> a.shape
(5,)
>>> a = np.reshape(a, (1,5))
>>> a.shape
(1, 5)
>>> a
array([[1, 2, 3, 4, 5]])
>>> 
Run Code Online (Sandbox Code Playgroud)

但是我怎么能用Pytorch Tensor(和Variable)做到这一点.我不想切换回numpy并再次切换到Torch变量,因为它会丢失反向传播信息.

这就是我在Pytorch中所拥有的

>>> import torch
>>> from torch.autograd import Variable
>>> a = torch.Tensor([1,2,3,4,5])
>>> a

 1
 2
 3
 4
 5
[torch.FloatTensor of size 5]

>>> a.size()
(5L,)
>>> a_var = variable(a)
>>> a_var = Variable(a)
>>> a_var.size()
(5L,)
.....do some calculation in forward function
>>> a_var.size()
(5L,) …
Run Code Online (Sandbox Code Playgroud)

python numpy deep-learning pytorch tensor

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

PyTorch和Torch之间有什么关系?

有两个PyTorch存储库:

第一个显然需要Torch和lua并且是一个包装器,但第二个没有引用Torch项目,除了它的名字.

它与Lua Torch(http://torch.ch/)有什么关系?

torch pytorch

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

没有名为“Torch”的模块

我通过安装pytorch

conda install pytorch-cpu torchvision-cpu -c pytorch

我也试过

pip3 install https://download.pytorch.org/whl/cpu/torch-1.0.1-cp36-cp36m-win_amd64.whl

pip3 install torchvision
Run Code Online (Sandbox Code Playgroud)

两个都安装成功!

但是,它只适用于木星笔记本。每当我尝试从控制台执行脚本时,都会收到错误消息:没有名为“torch”的模块

我怎样才能解决这个问题?

python pip conda pytorch

27
推荐指数
4
解决办法
15万
查看次数