user3933614
user3933614

Reputation: 113

Indentation Error. I'm at a complete loss

I've manually spaced out the whole thing. Still, it will not work. Indentation error directly after the first line.

The code:

def train_epoch(model, data_loader, loss_fn, optimizer, device, scheduler, n_examples):
""" docstring? """
losses = []
for d in data_loader:
    input_ids = d['input_ids'].to(device)
    targets = d['targets'].to(device)
    outputs = model(input_ids = input_ids, labels = targets)
    loss = loss_fn(outputs, targets)
    losses.append( loss.item() )
    loss.backward()
    optimizer.step()
    scheduler.step()
    optimizer.zero_grad()
return np.mean(losses)

The error:

def train_epoch(model, data_loader, loss_fn, optimizer, device, scheduler, n_examples): ...

File "", line 2 ^ IndentationError: expected an indented block

What is going on? I don't see a problem anywhere.

Upvotes: -1

Views: 80

Answers (3)

user13824946
user13824946

Reputation:

for loop must be indented to the right to make it function's code to run or inside the function, else it will not be considered as function code. Also losses list must be inside for loop not before it nor at the same for loop level for this case.

def train_epoch(model, data_loader, loss_fn, optimizer, device, scheduler, n_examples):
   
      
      for d in data_loader:
        losses = []
        input_ids = d['input_ids'].to(device)
        targets = d['targets'].to(device)
        outputs = model(input_ids = input_ids, labels = targets)
        loss = loss_fn(outputs, targets)
        losses.append( loss.item() )
        loss.backward()
        optimizer.step()
        scheduler.step()
        optimizer.zero_grad()

        return np.mean(losses)
        
        

Upvotes: -1

Michał M
Michał M

Reputation: 59

It's because of the first line. The function's body has to be indented.

def train_epoch(model, data_loader, loss_fn, optimizer, device, scheduler, n_examples):
    """ docstring? """
    losses = []
    for d in data_loader:
        input_ids = d['input_ids'].to(device)
        targets = d['targets'].to(device)
        outputs = model(input_ids = input_ids, labels = targets)
        loss = loss_fn(outputs, targets)
        losses.append( loss.item() )
        loss.backward()
        optimizer.step()
        scheduler.step()
        optimizer.zero_grad()
    return np.mean(losses)

Upvotes: -1

Abhimanyu Shekhawat
Abhimanyu Shekhawat

Reputation: 186

def train_epoch(model, data_loader, loss_fn, optimizer, device, scheduler, n_examples):
    """
    docstring?
    """
    losses = []
    for d in data_loader:
        input_ids = d['input_ids'].to(device)
        targets = d['targets'].to(device)
        outputs = model(input_ids = input_ids, labels = targets)
        loss = loss_fn(outputs, targets)
        losses.append( loss.item() )
        loss.backward()
        optimizer.step()
        scheduler.step()
        optimizer.zero_grad()
    return np.mean(losses)

Please format it like this. Your code is not under the indentation block for your train_epoch() method.

Upvotes: 0

Related Questions