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
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
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
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)
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
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