标签: custom-training

使用@tf.function 进行自定义张量流训练的内存泄漏

我正在尝试TF2/Keras按照官方 Keras 演练为 编写自己的训练循环。vanilla 版本的效果很好,但是当我尝试将@tf.function装饰器添加到我的训练步骤时,一些内存泄漏占用了我所有的内存并且我失去了对机器的控制,有谁知道发生了什么?

代码的重要部分如下所示:

@tf.function
def train_step(x, y):
    with tf.GradientTape() as tape:
        logits = siamese_network(x, training=True)
        loss_value = loss_fn(y, logits)
    grads = tape.gradient(loss_value, siamese_network.trainable_weights)
    optimizer.apply_gradients(zip(grads, siamese_network.trainable_weights))
    train_acc_metric.update_state(y, logits)
    return loss_value

@tf.function
def test_step(x, y):
    val_logits = siamese_network(x, training=False)
    val_acc_metric.update_state(y, val_logits)
    val_prec_metric.update_state(y_batch_val, val_logits)
    val_rec_metric.update_state(y_batch_val, val_logits)


for epoch in range(epochs):
        step_time = 0
        epoch_time = time.time()
        print("Start of {} epoch".format(epoch))
        for step, (x_batch_train, y_batch_train) in enumerate(train_ds):
            if step > steps_epoch:
                break
           
            loss_value = train_step(x_batch_train, y_batch_train)
        train_acc …
Run Code Online (Sandbox Code Playgroud)

python keras tensorflow custom-training

7
推荐指数
1
解决办法
436
查看次数

将神经网络的输出限制在任意范围内

我有一个自定义神经网络,我正在对数据进行训练,并试图将网络的输出值限制在两个任意常数之间:[lower_bound,upper_bound]. 是否有在损失函数中编码此约束的最佳实践?

下面我写了一个最小的工作示例,我在生成的数据上构建和训练神经网络。此外,我[lower_bound,upper_bound] = [-0.5,0.75]在被优化的损失函数中放置了输出应该介于两者之间的任意约束。但是我尝试使用一种相对粗略的方法来查找预测值超出边界的所有实例,然后简单地使这些项的损失函数成为一个大值(如果预测值在给定的范围内,则为零):

lower_bound = -0.5 #a guessed a priori lower bound on the output
upper_bound = 0.75 #a guessed a priori upper bound on the output
cond_v1_1 = tf.greater(self.v1_pred[:,0], upper_bound*tf.ones(tf.shape(self.v1_pred[:,0])))
cond_v1_2 = tf.greater(-1.0*self.v1_pred[:,0], lower_bound*tf.ones(tf.shape(self.v1_pred[:,0])))
self.red_v1 = tf.where(cond_v1_1, 100000.0*tf.ones(tf.shape(self.v1_pred[:,0])), 0.0*tf.zeros(tf.shape(self.v1_pred[:,0]))) 
self.red_v1 = tf.where(cond_v1_2, 100000.0*tf.ones(tf.shape(self.v1_pred[:,0])), self.red_v1) 
self.loss_cond = tf.reduce_sum(1.0*tf.square(self.red_v1))
Run Code Online (Sandbox Code Playgroud)

但是在训练神经网络时,是否有任何方法或损失函数可以更好地编码这种约束?也许优化器更容易处理和/或修改我的代码本身的更平滑的损失函数?任何关于惩罚/训练下面代码中神经网络的最佳实践的评论和进一步的想法都将不胜感激。


import numpy as np 
import tensorflow as tf

end_it = 1000 #number of iterations
frac_train = 1.0 #randomly sampled fraction of data to create training …
Run Code Online (Sandbox Code Playgroud)

constraints machine-learning tensorflow custom-training

6
推荐指数
1
解决办法
880
查看次数

具有多处理功能的 Tensorflow2.x 自定义数据生成器

我刚刚升级到tensorflow 2.3。我想制作自己的数据生成器用于训练。使用tensorflow 1.x,我这样做了:

def get_data_generator(test_flag):
  item_list = load_item_list(test_flag)
  print('data loaded')
  while True:
    X = []
    Y = []
    for _ in range(BATCH_SIZE):
      x, y = get_random_augmented_sample(item_list)
      X.append(x)
      Y.append(y)
    yield np.asarray(X), np.asarray(Y)

data_generator_train = get_data_generator(False)
data_generator_test = get_data_generator(True)
model.fit_generator(data_generator_train, validation_data=data_generator_test, 
                    epochs=10000, verbose=2,
                    use_multiprocessing=True,
                    workers=8,
                    validation_steps=100,
                    steps_per_epoch=500,
                    )
Run Code Online (Sandbox Code Playgroud)

这段代码在tensorflow 1.x 上运行良好。系统中创建了8个进程。处理器和显卡加载完美。“数据已加载”打印了 8 次。

使用tensorflow 2.3我收到警告:

警告:tensorflow:多处理可能与 TensorFlow 交互不良,导致不确定性死锁。对于高性能数据管道,建议使用 tf.data。

“数据已加载”打印一次(应该是8次)。GPU 没有得到充分利用。每个 epoch 都会有内存泄漏,因此训练会在几个 epoch 后停止。use_multiprocessing 标志没有帮助。

如何在tensorflow(keras) 2.x中制作一个可以轻松跨多个CPU进程并行化的生成器/迭代器?死锁和数据顺序并不重要。

data-generation keras tensorflow tf.keras custom-training

2
推荐指数
1
解决办法
4856
查看次数