Skip to content
This repository has been archived by the owner on May 14, 2024. It is now read-only.

Got an error when using lazy. #33

Open
SinoKiwi opened this issue May 23, 2023 · 4 comments
Open

Got an error when using lazy. #33

SinoKiwi opened this issue May 23, 2023 · 4 comments

Comments

@SinoKiwi
Copy link

I'm doing a NMT task.I use my own data loading function rather than using torch dataset.I got an "int object doesn't has attribute 'size' " error.
Here's my data loading code:

def get_batches(sz, pad=0):
    for i in range(0, len(datatmp), sz):
        n=0
        srcdata = []
        trgdata = []
        for j in range(n, sz):
            srcdata.append(datatmp[i+j][0])
            trgdata.append(datatmp[i+j][1])
        a = randint(1, 2)
        src_max_seq_length=max([len(srcdata[i]) for i in range(len(srcdata))])
        trg_max_seq_length=max([len(trgdata[i]) for i in range(len(trgdata))])
        # pad src to src_max_seq_length
        for i in range(len(srcdata)):
            srcdata[i] = srcdata[i] + [pad for j in range(src_max_seq_length-len(srcdata[i]))]
        #pad trg to trg_max_seq_length
        for i in range(len(trgdata)):
            trgdata[i] = trgdata[i] + [pad for j in range(trg_max_seq_length-len(trgdata[i]))]

        sr = np.ndarray(shape=(sz, src_max_seq_length))
        tg = np.ndarray(shape=(sz, trg_max_seq_length))
        for i in range(len(srcdata)):
            for j in range(len(srcdata[i])):
                sr[i][j] = srcdata[i][j]
        for i in range(len(trgdata)):
            for j in range(len(trgdata[i])):
                tg[i][j] = trgdata[i][j]
        #srcdata = np.array(srcdata)
        #trgdata = np.array(trgdata)
        srcdata = torch.from_numpy(sr)
        trgdata = torch.from_numpy(tg)
        src = Variable(srcdata, requires_grad=False).long()
        trg = Variable(trgdata, requires_grad=False).long()
        yield Batch(src, trg, pad)#Batch is only a simple class
class Batch:
    "Object for holding a batch of data with mask during training."
    def __init__(self, src, trg=None, pad=0):
        self.src = src
        self.src_mask = (src != pad).unsqueeze(-2)
        if trg is not None:
            self.trg = trg[:, :-1]
            self.trg_y = trg[:, 1:]
            self.trg_mask = \
                self.make_std_mask(self.trg, pad)
            self.ntokens = (self.trg_y != pad).data.sum()
    
    @staticmethod
    def make_std_mask(tgt, pad):
        "Create a mask to hide padding and future words."
        tgt_mask = (tgt != pad).unsqueeze(-2)
        tgt_mask = tgt_mask & Variable(
            subsequent_mask(tgt.size(-1)).type_as(tgt_mask.data))
        return tgt_mask

ps:The code is adapted from 'Annotated Transformer'

@SinoKiwi
Copy link
Author

Oh,the code I used lazy is like this:

def get_batches(sz, pad=0):
    for i in range(0, len(datatmp), sz):
        n=0
        srcdata = []
        trgdata = []
        for j in range(n, sz):
            srcdata.append(datatmp[i+j][0])#appened is a list
            trgdata.append(datatmp[i+j][1])#identical to beneath
        a = randint(1, 2)
        src_max_seq_length=max([len(srcdata[i]) for i in range(len(srcdata))])
        trg_max_seq_length=max([len(trgdata[i]) for i in range(len(trgdata))])
        # pad src to src_max_seq_length
        for i in range(len(srcdata)):
            srcdata[i] = srcdata[i] + [pad for j in range(src_max_seq_length-len(srcdata[i]))]
        #pad trg to trg_max_seq_length
        for i in range(len(trgdata)):
            trgdata[i] = trgdata[i] + [pad for j in range(trg_max_seq_length-len(trgdata[i]))]

        sr = np.ndarray(shape=(sz, src_max_seq_length))
        tg = np.ndarray(shape=(sz, trg_max_seq_length))
        for i in range(len(srcdata)):
            for j in range(len(srcdata[i])):
                sr[i][j] = srcdata[i][j]
        for i in range(len(trgdata)):
            for j in range(len(trgdata[i])):
                tg[i][j] = trgdata[i][j]
        #srcdata = np.array(srcdata)
        #trgdata = np.array(trgdata)
        srcdata = torch.from_numpy(sr)
        trgdata = torch.from_numpy(tg)
        src = Variable(srcdata, requires_grad=False).long()
        trg = Variable(trgdata, requires_grad=False).long()
        (src, trg) = lazy(src,trg, batch=0)#Here
        yield Batch(src, trg, pad)

@rentruewang
Copy link
Owner

Hmm, sorry for the late response. It seems to me that you're using PyTorch 0.4.* right? I didn't test versions <1 so I'm not sure where the issue comes from. If I had to guess, it's perhaps because of the mismatch between the API of Tensor vs Variable.

@SinoKiwi
Copy link
Author

SinoKiwi commented Jun 4, 2023

I'm sorry but it has the same error when I use torch2.0.0 and just torch.from_numpy(not using Variable).
Here is the output:

Traceback (most recent call last):
  File "train.py", line 515, in <module>
    run_epoch(get_batches(4, BLANK_ID), model, 
  File "train.py", line 299, in run_epoch
    for i, batch in enumerate(tqdm(data_iter)):
  File "/usr/local/miniconda3/lib/python3.8/site-packages/tqdm/std.py", line 1178, in __iter__
    for obj in iterable:
  File "train.py", line 473, in get_batches
    yield Batch(src, trg, pad)
  File "train.py", line 275, in __init__
    self.src_mask = (src != pad).unsqueeze(-2)
  File "/usr/local/miniconda3/lib/python3.8/site-packages/koila/lazy.py", line 320, in __ne__
    return lazy_forward(Tensor.__ne__, prepasses.symmetric, self, other)
  File "/usr/local/miniconda3/lib/python3.8/site-packages/koila/lazy.py", line 504, in lazy_forward
    out = LazyTensor(LazyFunction(func, shape_func)(*args, **kwargs))
  File "/usr/local/miniconda3/lib/python3.8/site-packages/koila/lazy.py", line 51, in __call__
    prepass = self.prepass_func(*args, **kwargs)
  File "/usr/local/miniconda3/lib/python3.8/site-packages/koila/prepasses.py", line 142, in symmetric
    shape = shapes.coerce(input.size(), other.size(), broadcast=True, scalars=True)
AttributeError: 'int' object has no attribute 'size'

@rentruewang
Copy link
Owner

I see. Seems to be an oversight on my part where I didn't handle broadcasting mechanism with primitives. Thanks for the feedback!

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants