我使用Keras和TensorFlow来实现一个深度神经网络。当我绘制损失和迭代次数时,每个epoch之后的损失都有一个显著的跳跃。实际上,每个小批的损失应该彼此不同,但是Keras计算了小批损失的移动平均值,这就是为什么我们得到了一条平滑的曲线,而不是任意的曲线。移动平均线的数组在每个epoch后重置,因此我们可以观察到损失的跳跃。
我想删除移动平均线的功能,而不是我想有原始损失值,这将为每个小批量变化。现在,我尝试减少损失函数,但它只适用于mini-batch中的例子。下面的代码对mini-batch中所有训练样例的损失求和。
tf.keras.losses.BinaryCrossentropy(reduction = 'sum')
我也试着写一个自定义的损失函数,但这也没有帮助。
Keras实际上显示的是移动平均线而不是" raw ";损失值。为了获取原始损失值,应该实现如下所示的回调:
class LossHistory(keras.callbacks.Callback):
def on_train_begin(self, logs={}):
#initialize a list at the begining of training
self.losses = []
def on_batch_end(self, batch, logs={}):
self.losses.append(logs.get('loss'))
mycallback = LossHistory()
然后在model.fit
model.fit(X, Y, epochs=epochs, batch_size=batch, shuffle=True, verbose = 0, callbacks=[mycallback])
print(mycallback.losses)
我用以下配置进行了测试
Keras 2.3.1
Tensorflow 2.1.0
Python 3.7.9
我想删除移动平均线的功能,而不是我想有原始损失值,将为每个小批量变化。
可以通过使用回调函数来达到,但是我再一次看了这个问题,你也试图优化实际损失值回到计算中。
当然,你可以在回调函数中应用,也可以直接使用,因为这个例子告诉了你基本的自定义优化器是如何工作的。
[示例]:
import os
from os.path import exists
import tensorflow as tf
import matplotlib.pyplot as plt
from skimage.transform import resize
import numpy as np
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Variables
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
learning_rate = 0.001
global_step = 0
tf.compat.v1.disable_eager_execution()
BATCH_SIZE = 1
IMG_SIZE = (32, 32)
history = [ ]
history_Y = [ ]
list_file = [ ]
list_label = [ ]
for file in os.listdir("F:\datasets\downloads\dark\train") :
image = plt.imread( "F:\datasets\downloads\dark\train\" + file )
image = resize(image, (32, 32))
image = np.reshape( image, (1, 32, 32, 3) )
list_file.append( image )
list_label.append(1)
optimizer = tf.compat.v1.train.ProximalAdagradOptimizer(
learning_rate,
initial_accumulator_value=0.1,
l1_regularization_strength=0.2,
l2_regularization_strength=0.1,
use_locking=False,
name='ProximalAdagrad'
)
var1 = tf.Variable(255.0)
var2 = tf.Variable(10.0)
X_var = tf.compat.v1.get_variable('X', dtype = tf.float32, initializer = tf.random.normal((1, 32, 32, 3)))
y_var = tf.compat.v1.get_variable('Y', dtype = tf.float32, initializer = tf.random.normal((1, 32, 32, 3)))
Z = tf.nn.l2_loss((var1 - X_var) ** 2 + (var2 - y_var) ** 2, name="loss")
cosine_loss = tf.keras.losses.CosineSimilarity(axis=1)
loss = tf.reduce_mean(input_tensor=tf.square(Z))
training_op = optimizer.minimize(cosine_loss(X_var, y_var))
previous_train_loss = 0
with tf.compat.v1.Session() as sess:
sess.run(tf.compat.v1.global_variables_initializer())
image = list_file[0]
X = image
Y = image
for i in range(1000):
global_step = global_step + 1
train_loss, temp = sess.run([loss, training_op], feed_dict={X_var:X, y_var:Y})
history.append( train_loss )
if global_step % 2 == 0 :
var2 = var2 - 0.001
if global_step % 4 == 0 and train_loss <= previous_train_loss :
var1 = var1 - var2 + 0.5
print( 'steps: ' + str(i) )
print( 'train_loss: ' + str(train_loss) )
previous_train_loss = train_loss
sess.close()
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
: Graph
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
history = history[:-1]
plt.plot(np.asarray(history))
plt.xlabel('Epoch')
plt.ylabel('loss')
plt.legend(loc='lower right')
plt.show()