Используя тензор потока / слим, я использую слой conv2d с регуляризацией l2 следующим образом:
net = slim.conv2d(inputs, n_filters, filter_size, weights_regularizer=slim.l2_regularizer(0.001), activation_fn=None)
Чтобы упорядочить общие потери с кросс-энтропией и потерями регуляризации, я написал следующий скрипт:
loss_cross = tf.nn.softmax_cross_entropy_with_logits_v2(logits=network, labels=net_output)
beta = 0.01
regularization_losses = tf.losses.get_regularization_losses()
losses = loss_cross + beta * regularization_losses
loss = tf.reduce_mean(losses)
opt = tf.train.AdamOptimizer(lr).minimize(0.0001, var_list=[var for var in tf.trainable_variables()])
, который я получаю сообщение об ошибке:
Traceback (most recent call last):
File "main_orgsettings_losses.py", line 288, in <module>
losses = loss_cross + beta * regularization_losses
TypeError: can't multiply sequence by non-int of type 'float'
Когда я удаляю beta
, я получаю ошибку:
InvalidArgumentError: Incompatible shapes: [1,512,512] vs. [1]
который [512,512] во входном размере, а [1] - единственный слой, который имеет регуляризацию.
Когда я добавляю регуляризацию к потере после redu_mean, например:
loss = tf.reduce_mean(losses) + regularization_losses
, это работает, но яЯ думаю, что это не то, что подразумевается как beta
не используется, и я думаю, что reguilarization_loss
следует добавить к losses
до tf.reduce_mean