pytorch中使用numpy生成随机数每个epoch都一样

pytorch中使用numpy生成随机数每个epoch都一样

问题

最近在使用pytorch做实验的过程中发现,在dataset里面使用numpy生成随机数,每个epoch生成的随机数是一样的。
代码

import numpy as np
import torch
from torch.utils.data import Dataset
from torch.utils.data import DataLoader


class RandomDataset(Dataset):

    def __init__(self):
        pass

    def __getitem__(self, ind):
        return np.random.randint(100)

    def __len__(self):
        return 10


ds = RandomDataset()
ds = DataLoader(ds, 10, shuffle=False, num_workers=1)

total_epoch = 5
for epoch in range(total_epoch):
    for batch in ds:
        print(batch)

输出如下:

tensor([62, 66, 47, 55, 11, 90, 66, 64, 79, 62])
tensor([62, 66, 47, 55, 11, 90, 66, 64, 79, 62])
tensor([62, 66, 47, 55, 11, 90, 66, 64, 79, 62])
tensor([62, 66, 47, 55, 11, 90, 66, 64, 79, 62])
tensor([62, 66, 47, 55, 11, 90, 66, 64, 79, 62])

原因

通过google搜索发现github上有人提过这个问题 https://github.com/pytorch/pytorch/issues/5059

简单来说就是numpy的随机数生成在多进程的情况下存在问题。因为在DataLoader中设置了num_workers参数后,DataLoader内部会启动多进程来读数据。

解决途径

上面的连接给出了解决方法。
我采用的方法是不使用numpy生成随机数,而是使用pytorch的库生成随机数。

import numpy as np
import torch
from torch.utils.data import Dataset
from torch.utils.data import DataLoader


class RandomDataset(Dataset):

    def __init__(self):
        pass

    def __getitem__(self, ind):
        # return np.random.randint(100)
        return torch.randint(0, 100, (1,)).item()

    def __len__(self):
        return 10


ds = RandomDataset()
ds = DataLoader(ds, 10, shuffle=False, num_workers=1)

total_epoch = 5
for epoch in range(total_epoch):
    for batch in ds:
        print(batch)

输出结果

tensor([93, 87, 57, 2, 10, 1, 6, 8, 71, 8])
tensor([76, 57, 73, 97, 85, 20, 1, 11, 25, 27])
tensor([72, 69, 37, 26, 99, 71, 38, 79, 6, 96])
tensor([90, 6, 38, 27, 14, 36, 66, 54, 32, 39])
tensor([72, 18, 7, 36, 45, 8, 74, 33, 17, 15])

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
唐诗生成是一个典型的自然语言生成问题,可以使用RNN(循环神经网络)来解决。在PyTorch,可以使用torch.nn模块的RNN类来定义RNN模型。 下面是一个使用RNN生成唐诗的示例代码: ```python import torch import torch.nn as nn import numpy as np # 定义唐诗数据集 data = ['春眠不觉晓', '处处闻啼鸟', '夜来风雨声', '花落知多少'] # 构建字符表 charset = set(''.join(data)) char2idx = {char: idx for idx, char in enumerate(charset)} idx2char = {idx: char for idx, char in enumerate(charset)} # 构建训练数据 max_len = max([len(poem) for poem in data]) X = np.zeros((len(data), max_len, len(charset))) y = np.zeros((len(data), max_len, len(charset))) for i, poem in enumerate(data): for j, char in enumerate(poem): X[i, j, char2idx[char]] = 1 if j < len(poem) - 1: y[i, j, char2idx[poem[j+1]]] = 1 # 定义RNN模型 class RNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(RNN, self).__init__() self.hidden_size = hidden_size self.rnn = nn.RNN(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x, h0): out, hn = self.rnn(x, h0) out = self.fc(out) return out, hn # 定义超参数 input_size = len(charset) hidden_size = 64 output_size = len(charset) learning_rate = 0.01 num_epochs = 100 # 初始化模型和优化器 model = RNN(input_size, hidden_size, output_size) optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) # 训练模型 for epoch in range(num_epochs): loss = 0 h0 = torch.zeros(1, X.shape[0], hidden_size) for i in range(X.shape[1]): x = torch.from_numpy(X[:, i, :]).float() y_true = torch.from_numpy(y[:, i, :]).float() y_pred, h0 = model(x, h0) loss += nn.functional.binary_cross_entropy_with_logits(y_pred, y_true) optimizer.zero_grad() loss.backward() optimizer.step() if (epoch+1) % 10 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) # 使用模型生成唐诗 h0 = torch.zeros(1, 1, hidden_size) x = torch.zeros(1, 1, len(charset)) x[0, 0, char2idx['春']] = 1 out = '' for i in range(max_len): y_pred, h0 = model(x, h0) char_idx = y_pred.argmax().item() char = idx2char[char_idx] out += char x = torch.zeros(1, 1, len(charset)) x[0, 0, char_idx] = 1 print(out) ``` 这个示例代码,我们首先定义了唐诗数据集和字符表,并将唐诗转化为one-hot编码的训练数据。然后定义了一个RNN模型,包括一个RNN层和一个全连接层。在模型训练过程,我们使用二元交叉熵作为损失函数,并使用Adam优化器进行参数更新。最后使用训练好的模型生成一首唐诗。 需要注意的是,这个示例代码使用了RNN模型,实际上在生成唐诗时可以使用更加复杂的模型,比如LSTM或GRU,以提高生成质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值