Tensorflow: как установить скорость обучения в масштабе журнала и некоторые вопросы Tensorflow

Я новичок в глубоком обучении и Tensorflow, и я пытаюсь реализовать алгоритм в этом статьи использование Tensorflow. В этой статье используется Matconvnet+Matlab для его реализации, и мне любопытно, имеет ли Tensorflow эквивалентные функции для достижения того же самого. В газете говорилось:--8-->

параметры сети были инициализированы с помощью метода Xavier [14]. Мы использовали регрессионную потерю по четырем вейвлет-поддиапазонам под штрафом l2 и предложенную сеть обучался с использованием стохастического градиентного спуска (SGD). Параметр регуляризации (λ)составил 0,0001, а импульс-0,9. Скорость обучения была установлена от 10-1 до 10-4, которая уменьшалась в логарифмической шкале в каждую эпоху.

в настоящей работе используется вейвлет-преобразование (WT) и метод остаточного обучения(где остаточное изображение = WT(HR) - WT (HR') и HR' используются для обучения). Метод Xavier предлагает инициализировать нормальное распределение переменных с помощью

stddev=sqrt(2/(filter_size*filter_size*num_filters)

Q1. Как инициализировать переменные? Является ли код ниже правильным?

weights = tf.Variable(tf.random_normal[img_size, img_size, 1, num_filters], stddev=stddev)

в этой статье не объясняется, как построить функцию потерь в деталях . Я не могу найти эквивалентную функцию Tensorflow для установки скорости обучения в масштабе журнала (только exponential_decay). Я понимаю!--4--> эквивалентно стохастическому градиентному спуску с импульсом.

Q2: возможно ли установить скорость обучения в журнале масштаб?

Q3: как создать функцию потери, описанную выше?

я последовал за этот сайт написать код ниже. Предположим, что функция model () возвращает сеть, упомянутую в этой статье, и lamda=0.0001,

inputs = tf.placeholder(tf.float32, shape=[None, patch_size, patch_size, num_channels])
labels = tf.placeholder(tf.float32, [None, patch_size, patch_size, num_channels])

# get the model output and weights for each conv
pred, weights = model()

# define loss function
loss = tf.nn.softmax_cross_entropy_with_logits_v2(labels=labels, logits=pred)

for weight in weights:
    regularizers += tf.nn.l2_loss(weight)

loss = tf.reduce_mean(loss + 0.0001 * regularizers)

learning_rate = tf.train.exponential_decay(???) # Not sure if we can have custom learning rate for log scale
optimizer = tf.train.MomentumOptimizer(learning_rate, momentum).minimize(loss, global_step)

Примечание: поскольку я новичок в глубоком обучении / Tensorflow, я копирую код здесь и там, поэтому, пожалуйста, не стесняйтесь исправлять его, если можете;)

3 ответов


другие ответы очень подробные и полезные. Вот пример кода, который использует заполнитель для снижения скорости обучения в масштабе журнала. HTH.

import tensorflow as tf

import numpy as np


# data simulation
N = 10000
D = 10
x = np.random.rand(N, D)
w = np.random.rand(D,1)
y = np.dot(x, w)

print y.shape

#modeling
batch_size = 100
tni = tf.truncated_normal_initializer()
X = tf.placeholder(tf.float32, [batch_size, D])
Y = tf.placeholder(tf.float32, [batch_size,1])
W = tf.get_variable("w", shape=[D,1], initializer=tni)
B = tf.zeros([1])

lr = tf.placeholder(tf.float32)

pred = tf.add(tf.matmul(X,W), B)
print pred.shape
mse = tf.reduce_sum(tf.losses.mean_squared_error(Y, pred))
opt = tf.train.MomentumOptimizer(lr, 0.9)

train_op = opt.minimize(mse)

learning_rate = 0.0001

do_train = True
acc_err = 0.0
sess = tf.Session()
sess.run(tf.global_variables_initializer())
while do_train:
  for i in range (100000):
     if i > 0 and i % N == 0:
       # epoch done, decrease learning rate by 2
       learning_rate /= 2
       print "Epoch completed. LR =", learning_rate

     idx = i/batch_size + i%batch_size
     f = {X:x[idx:idx+batch_size,:], Y:y[idx:idx+batch_size,:], lr: learning_rate}
     _, err = sess.run([train_op, mse], feed_dict = f)
     acc_err += err
     if i%5000 == 0:
       print "Average error = {}".format(acc_err/5000)
       acc_err = 0.0

Q1. Как инициализировать переменные? Является ли код ниже правильным?

используйте tf.get_variable или переключиться на slim (он делает инициализацию автоматически для вас). пример

Q2: можно ли установить скорость обучения в масштабе журнала?

вы можете, но вам это нужно? Это не первое, что вам нужно решить в этой сети. Пожалуйста, проверьте #3

однако, только для справки, используйте следующие обозначения.

learning_rate_node = tf.поезд.exponential_decay (learning_rate=0.001, decay_steps=10000, decay_rate=0.98, staircase=True)

оптимизатор = tf.поезд.AdamOptimizer (learning_rate=learning_rate_node).минимизировать (потери)

Q3: как создать функцию потерь, описанную выше?

сначала вы не написали преобразование "pred" в "image" в это сообщение(на основе бумаги вам нужно применить вычитание и IDWT для получения конечное изображение.)

здесь есть одна проблема, логиты должны быть рассчитаны на основе ваших данных метки. т. е. если вы будете использовать отмеченные данные как "y: Label", вам нужно написать

pred = model ()

pred = tf.matmul (pred, weights) + biases

logits = tf.НН.softmax (pred)

потеря = tf.reduce_mean(tf.АБС(логитов - этикетки))

это даст вам выход Y: метка, которая будет использоваться

Если помечены изображения набора данных несколько обработанных, в этом случае вы должны следовать этому один:

pred = model ()

pred = tf.matmul (изображение, вес) + смещения

logits = tf.НН.softmax (pred)

image = apply_IDWT ("X : input", logits) # это будет применяться IDWT (x_label - y_label)

потеря = tf.reduce_mean(tf.abs (image-labels))

Логитов-это выход сеть. Вы будете использовать этот результат для вычисления остальных. Вместо matmul, вы можете добавить слой conv2d здесь без пакетной нормализации и функции активации и установить количество выходных объектов как 4. Пример:

pred = model ()

pred = тонкий.conv2d (pred, 4, [3, 3], activation_fn=None, padding='SAME', scope='output')

logits = tf.НН.softmax (pred)

image = apply_IDWT ("X : input", logits) # это будет применить IDWT (x_label - y_label)

потеря = tf.reduce_mean(tf.АБС(логитов - этикетки))

эта функция потери передаст вам основные возможности тренировки. Однако это расстояние L1, и оно может страдать от некоторых проблем (Регистрация). Подумайте о следующей ситуации

Допустим у вас есть следующий массив как выходной [10, 10, 10, 0, 0] и вы пытаетесь достичь [10, 10, 10, 10, 10]. В этом случае ваш проигрыш равен 20 (10 + 10). Тем не менее, у вас есть 3/5 успех. Кроме того, это может указывать на некоторую избыточность.

в этом случае, думаю, следующий выходной [6, 6, 6, 6, 6]. Она до сих пор потери 20 (4 + 4 + 4 + 4 + 4). Однако всякий раз, когда вы применяете порог 5, Вы можете достичь успеха 5/5. Следовательно, это тот случай, который нам нужен.

Если вы используете L2 loss, для первого случая у вас будет 10^2 + 10^2 = 200 в качестве выхода потерь. Для второго случая, вы получите 4^2 * 5 = 80. Следовательно, оптимизатор попытается убежать от #1 как можно быстрее, чтобы достичь глобального успеха, а не полного успеха одних результатов и полного провала других. Вы можете применить функцию потери, как это для этого.

tf.reduce_mean(tf.НН.l2_loss (logits - image))

альтернативно, вы можете проверить для перекрестной функции потери энтропии. (он применяет softmax внутренне, не применяйте softmax дважды)

tf.reduce_mean(tf.НН.softmax_cross_entropy_with_logits (pred, image))


Q1. Как инициализировать переменные? Является ли код ниже правильным?

это правильно (хотя отсутствует открывающая скобка). Вы также можете заглянуть в tf.get_variable Если переменные будут использоваться повторно.

Q2: можно ли установить скорость обучения в масштабе журнала?

экспоненциальный спад уменьшает скорость обучения на каждом шаге. Я думаю, что вы хотите tf.train.piecewise_constant, и установить границы каждого эпоха.

EDIT: посмотрите на другой ответ, используйте