Уточнение, требуемое для функции make_step в Google глубокой мечте script

От https://github.com/google/deepdream/blob/master/dream.ipynb

def objective_L2(dst):          # Our training objective. Google has since release a way to load
    dst.diff[:] = dst.data      # arbitrary objectives from other images. We'll go into this later.

def make_step(net, step_size=1.5, end='inception_4c/output', 
              jitter=32, clip=True, objective=objective_L2):
    '''Basic gradient ascent step.'''

    src = net.blobs['data'] # input image is stored in Net 'data' blob
    dst = net.blobs[end]

    ox, oy = np.random.randint(-jitter, jitter+1, 2)
    src.data[0] = np.roll(np.roll(src.data[0], ox, -1), oy, -2) # apply jitter shift

    net.forward(end=end)
    objective(dst)  # specify the optimization objective
    net.backward(start=end)
    g = src.diff[0]
    # apply normalized ascent step to the input image
    src.data[:] += step_size/np.abs(g).mean() * g

    src.data[0] = np.roll(np.roll(src.data[0], -ox, -1), -oy, -2) # unshift image

    if clip:
        bias = net.transformer.mean['data']
        src.data[:] = np.clip(src.data, -bias, 255-bias)

Если я правильно понимаю, что происходит, входное изображение в net.blobs['data'] вставляется в NN до слоя end. Однажды передний проход завершен до end, он вычисляет, как "выключить" blob в end от "что-то".

Вопросы

  • Что это за "что-то"? Это dst.data? Я прошел через отладчик и обнаружил, что dst.data был просто матрицей нулей сразу после назначения, а затем заполнен значениями после обратного прохода.

  • В любом случае, полагая, что он обнаруживает, как "выключить" результат прямого прохода, почему он пытается сделать обратное распространение? Я думал, что смысл глубокого сна заключается не в том, чтобы дальше обучать модель, а "морфировать" входное изображение во все, что представляет собой исходный слой модели.

  • Что именно делает src.data[:] += step_size/np.abs(g).mean() * g? Похоже, что применение какого-либо вычисления было сделано выше к исходному изображению. Является ли эта строка тем, что на самом деле "морфирует" изображение?

Ссылки, которые я уже прочитал

Мне было бы интересно, что означает автор принятого ответа

мы берем исходный слой blob и "улучшаем" сигналы в нем. Какие это значит, я не знаю. Может быть, они просто умножают значения на коэффициент, возможно, что-то еще.

В этом блоге комментарий автора рядом с src.data[:] += step_size/np.abs(g).mean() * g: "приблизитесь к нашим целевым данным". Я не слишком четко понимаю, что означает "целевые данные".

Ответы