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: посмотрите на другой ответ, используйте