Beispiel #1
0
def _train_step(model: tf.keras.Model, optimizer: tf.keras.optimizers.Adam,
                loss_metric: tf.keras.metrics.Mean, train_enc: Any,
                train_dec: Any, month_enc: Any, month_dec: Any,
                labels: Any) -> Tuple:
    """ 单个训练步

    :param model: 训练模型
    :param optimizer: 优化器
    :param loss_metric: 损失计算器
    :param train_enc: enc输入
    :param train_dec: dec输入
    :param month_enc: enc月份输入
    :param month_dec: dec月份输入
    :param labels: 标签
    :return: 训练指标
    """
    with tf.GradientTape() as tape:
        train_enc = tf.squeeze(train_enc, axis=0)
        train_dec = tf.squeeze(train_dec, axis=0)
        outputs = model(inputs=[train_enc, train_dec, month_enc, month_dec])
        treat_outputs = tf.squeeze(input=outputs[:, -24:, :], axis=-1)
        loss = tf.keras.losses.mean_squared_error(labels, treat_outputs)

        # acikill_metrics = eval_score(preds=outputs, label=labels)
    loss_metric(loss)
    variables = model.trainable_variables
    gradients = tape.gradient(target=loss, sources=variables)
    optimizer.apply_gradients(zip(gradients, variables))

    return {"train_loss": loss_metric.result()}, treat_outputs
Beispiel #2
0
def _train_step(model: tf.keras.Model, optimizer: tf.keras.optimizers.Adam,
                audio_feature: tf.Tensor, sentence: tf.Tensor,
                enc_hidden: tf.Tensor, dec_input: tf.Tensor):
    """
    训练步
    :param model: 模型
    :param sentence: sentence序列
    :param audio_feature: 音频特征序列
    :param enc_hidden: encoder初始化隐藏层
    :param optimizer 优化器
    :param dec_input: 解码器输入
    :return: batch损失和post_net输出
    """
    loss = 0
    with tf.GradientTape() as tape:
        for t in range(1, sentence.shape[1]):
            predictions, _ = model(audio_feature, enc_hidden, dec_input)
            loss += loss_func_mask(sentence[:, t], predictions)

            if sum(sentence[:, t]) == 0:
                break

            dec_input = tf.expand_dims(sentence[:, t], 1)
    batch_loss = (loss / int(sentence.shape[0]))
    variables = model.trainable_variables
    gradients = tape.gradient(loss, variables)
    optimizer.apply_gradients(zip(gradients, variables))
    return batch_loss
Beispiel #3
0
def _train_step(model: tf.keras.Model, optimizer: tf.keras.optimizers.Adam,
                sentence: tf.Tensor, length: tf.Tensor,
                audio_feature: tf.Tensor):
    """
    训练步
    :param model: 模型
    :param sentence: sentence序列
    :param audio_feature: 音频特征序列
    :param length: 样本长度序列
    :param optimizer 优化器
    :return: batch损失和post_net输出
    """
    with tf.GradientTape() as tape:
        predictions = model(audio_feature)
        input_length = compute_ctc_input_length(audio_feature.shape[1],
                                                predictions.shape[1],
                                                length[:, 1:])
        loss = tf.keras.backend.ctc_batch_cost(y_true=sentence,
                                               y_pred=predictions,
                                               input_length=input_length,
                                               label_length=length[:, 0:1])
    batch_loss = tf.reduce_mean(loss)
    gradients = tape.gradient(loss, model.trainable_variables)
    optimizer.apply_gradients(zip(gradients, model.trainable_variables))
    return batch_loss
Beispiel #4
0
def _train_step(model: tf.keras.Model, optimizer: tf.keras.optimizers.Adam,
                batch_size: Any, loss_metric: tf.keras.metrics.Mean,
                queries: Any, targets: Any) -> Tuple:
    """ 单个训练步

    :param model: 训练模型
    :param optimizer: 优化器
    :param batch_size: batch大小
    :param loss_metric: 损失计算器
    :param queries: 第一个查询句子
    :param targets: 第二个查询句子
    :return: 训练指标
    """
    with tf.GradientTape() as tape:
        outputs = model(inputs=queries)
        loss = tf.keras.losses.SparseCategoricalCrossentropy(
            reduction=tf.keras.losses.Reduction.NONE)(targets, outputs)
        mask = tf.cast(x=tf.math.not_equal(targets, 0), dtype=tf.float32)
        batch_loss = tf.reduce_sum(mask * loss) / batch_size
    loss_metric(batch_loss)
    variables = model.trainable_variables
    gradients = tape.gradient(target=batch_loss, sources=variables)
    optimizer.apply_gradients(zip(gradients, variables))

    return {
        "train_loss": loss_metric.result()
    }, tf.nn.softmax(logits=outputs[:, 0, 5:7], axis=-1)
Beispiel #5
0
    def _backpropagates_gradient(
        self,
        tape: tf.GradientTape,
        models: List[tf.keras.Model],
        loss: tf.float32,
        optimizer: tf.keras.optimizers.Adam,
    ) -> None:
        """ Backpropagates the gradient of the loss into the given networks"""

        trainable_variables = sum(
            [model.trainable_variables for model in models], [])
        gradients = tape.gradient(loss, trainable_variables)
        optimizer.apply_gradients(zip(gradients, trainable_variables))
def _train_step(model: tf.keras.Model, optimizer: tf.keras.optimizers.Adam,
                loss_metric: tf.keras.metrics.Mean, first_queries: Any, second_queries: Any, labels: Any) -> Tuple:
    """ 单个训练步

    :param model: 训练模型
    :param optimizer: 优化器
    :param loss_metric: 损失计算器
    :param first_queries: 第一个查询句子
    :param second_queries: 第二个查询句子
    :param labels: 标签
    :return: 训练指标
    """
    with tf.GradientTape() as tape:
        outputs = model(inputs=[first_queries, second_queries])
        loss = tf.keras.losses.SparseCategoricalCrossentropy()(labels, outputs)
    loss_metric(loss)
    variables = model.trainable_variables
    gradients = tape.gradient(target=loss, sources=variables)
    optimizer.apply_gradients(zip(gradients, variables))

    return {"train_loss": loss_metric.result()}, outputs
Beispiel #7
0
def _train_step(model: tf.keras.Model, optimizer: tf.keras.optimizers.Adam,
                input_ids: tf.Tensor, mel_gts: tf.Tensor,
                stop_token: tf.Tensor):
    """
    训练步
    :param input_ids: sentence序列
    :param mel_gts: ground-true的mel
    :param model: 模型
    :param optimizer 优化器
    :param stop_token: ground-true的stop_token
    :return: batch损失和postnet输出
    """
    loss = 0
    with tf.GradientTape() as tape:
        mel_outputs, mel_outputs_postnet, gate_outputs, alignments = model(
            input_ids, mel_gts)
        loss += _loss_function(mel_outputs, mel_outputs_postnet, mel_gts,
                               stop_token, gate_outputs)
    batch_loss = loss
    variables = model.trainable_variables
    gradients = tape.gradient(loss, variables)  # 计算损失对参数的梯度
    optimizer.apply_gradients(zip(gradients, variables))  # 优化器反向传播更新参数
    return batch_loss, mel_outputs_postnet