I’m going through the tutorial at style transfer 61.
One thing I can’t figure out is it seems every time the optimizer.step(closure) statement gets executed, the closure function is called 20 times. Can someone please explain why?
Steps to reproduce:
0. Run the ipython notebook ipython notebook 24until the last cell.

Add one line to print the run[0] variable in the closure() function:

def closure():
    # correct the values of updated input image
    input_param.data.clamp_(0, 1)

    optimizer.zero_grad()
    model(input_param)
    style_score = 0
    content_score = 0

    for sl in style_losses:
        style_score += sl.backward()
    for cl in content_losses:
        content_score += cl.backward()

    run[0] += 1
    print("run {}:".format(run))
    if run[0] % 50 == 0:
        print("run {}:".format(run))
        print('Style Loss : {:4f} Content Loss: {:4f}'.format(
            style_score.data[0], content_score.data[0]))
        print()

    return style_score + content_score


Run the following:

run = [0]
input_param, optimizer = get_input_param_optimizer(input_img)
optimizer.step(closure)
run [1]:
run [2]:
run [3]:
run [4]:
run [5]:
run [6]:
run [7]:
run [8]:
run [9]:
run [10]:
run [11]:
run [12]:
run [13]:
run [14]:
run [15]:
run [16]:
run [17]:
run [18]:
run [19]:
run [20]: