介绍:
我正在尝试让 CDCGAN(条件深度卷积生成对抗网络)处理 MNIST 数据集,考虑到我使用的库(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
已经确定这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 新用户解释原因。
特别是,我认为通过一个图形来说明图形并显示在此示例中断开连接是如何发生的会很有帮助:
Run Code Online (Sandbox Code Playgroud)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))
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示例.我不明白以下事项:
编辑:
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) 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) 我正在尝试使用预先训练的模型。这就是问题发生的地方
模型不是应该接收简单的彩色图像吗?为什么它需要 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
在这个页面(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]
“进行归一化。
如果不是平时mean
和std
正常化是[0.5, 0.5, 0.5]
和[0.5, 0.5, 0.5]
?为什么要设置这么奇怪的值?
我尝试实现提前停止功能以避免我的神经网络模型过度拟合。我很确定逻辑是正确的,但由于某种原因,它不起作用。我希望当验证损失大于某些时期的训练损失时,早期停止函数返回 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) 例如,我有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) 我通过安装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”的模块
我怎样才能解决这个问题?