M-CTC-T
此模型仅处于维护模式,因此我们不会接受任何更改其代码的新 PR。
如果您在运行此模型时遇到任何问题,请重新安装支持此模型的最后一个版本:v4.30.0。您可以通过运行以下命令来执行此操作:pip install -U transformers==4.30.0
。
概述
M-CTC-T 模型由 Loren Lugosch、Tatiana Likhomanenko、Gabriel Synnaeve 和 Ronan Collobert 在 Pseudo-Labeling For Massively Multilingual Speech Recognition 中提出。该模型是一个 10 亿参数的 transformer 编码器,带有一个覆盖 8065 个字符标签的 CTC 头和一个覆盖 60 个语言 ID 标签的语言识别头。它在 Common Voice(版本 6.1,2020 年 12 月发布)和 VoxPopuli 上进行训练。在 Common Voice 和 VoxPopuli 上训练后,该模型仅在 Common Voice 上进行训练。标签是未归一化的字符级转录(标点符号和大小写未删除)。该模型将来自 16Khz 音频信号的 Mel 滤波器组特征作为输入。
论文摘要如下
通过伪标签进行的半监督学习已成为最先进的单语语音识别系统的主要方法。在这项工作中,我们将伪标签扩展到包含 60 种语言的大规模多语言语音识别。我们提出了一种简单的伪标签方法,即使对于低资源语言也效果良好:训练一个监督式多语言模型,使用半监督学习在目标语言上对其进行微调,为该语言生成伪标签,并使用所有语言的伪标签(从头开始或通过微调)训练最终模型。在标记的 Common Voice 和未标记的 VoxPopuli 数据集上的实验表明,我们的方法可以产生一个在许多语言上具有更好性能的模型,并且可以很好地迁移到 LibriSpeech。
使用技巧
此模型的 PyTorch 版本仅在 torch 1.9 及更高版本中可用。
资源
MCTCTConfig
类 transformers.MCTCTConfig
< 源代码 >( vocab_size = 8065 hidden_size = 1536 num_hidden_layers = 36 intermediate_size = 6144 num_attention_heads = 4 attention_head_dim = 384 max_position_embeddings = 920 layer_norm_eps = 1e-05 layerdrop = 0.3 hidden_act = 'relu' initializer_range = 0.02 hidden_dropout_prob = 0.3 attention_probs_dropout_prob = 0.3 pad_token_id = 1 bos_token_id = 0 eos_token_id = 2 conv_glu_dim = 1 conv_dropout = 0.3 num_conv_layers = 1 conv_kernel = (7,) conv_stride = (3,) input_feat_per_channel = 80 input_channels = 1 conv_channels = None ctc_loss_reduction = 'sum' ctc_zero_infinity = False **kwargs )
参数
- vocab_size (
int
, optional, defaults to 8065) — M-CTC-T 模型的词汇表大小。定义了在调用 MCTCTModel 时可以通过inputs_ids
传递的不同标记的数量。 - hidden_size (
int
, optional, defaults to 1536) — 编码器层和池化器层的维度。 - num_hidden_layers (
int
, optional, defaults to 36) — Transformer 编码器中隐藏层的数量。 - intermediate_size (
int
, optional, defaults to 6144) — Transformer 编码器中“中间”(即,前馈)层的维度。 - num_attention_heads (
int
, optional, defaults to 4) — Transformer 编码器中每个注意力层的注意力头的数量。 - attention_head_dim (
int
, optional, defaults to 384) — Transformer 编码器中每个注意力层的每个注意力头的维度。 - max_position_embeddings (
int
, optional, defaults to 920) — 此模型可能使用的最大序列长度(在对数梅尔频谱图提取之后)。 - layer_norm_eps (
float
, optional, defaults to 1e-05) — 层归一化层使用的 epsilon 值。 - layerdrop (
float
, optional, defaults to 0.3) — 训练期间丢弃编码器层的概率。原始实现中使用了默认值 0.3。 - hidden_act (
str
或function
, optional, defaults to"relu"
) — 编码器和池化器中的非线性激活函数(函数或字符串)。如果为字符串,则支持"gelu"
、"relu"
、"selu"
和"gelu_new"
。 - initializer_range (
float
, optional, defaults to 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - hidden_dropout_prob (
float
, optional, defaults to 0.3) — 嵌入层、编码器和池化器中所有全连接层的 dropout 概率。 - attention_probs_dropout_prob (
float
, optional, defaults to 0.3) — 注意力概率的 dropout 比率。 - pad_token_id (
int
, optional, defaults to 1) — pad 标记的 tokenizer 索引。 - bos_token_id (
int
, optional, defaults to 0) — bos 标记的 tokenizer 索引。 - eos_token_id (
int
, optional, defaults to 2) — eos 标记的 tokenizer 索引。 - conv_glu_dim (
int
, optional, defaults to 1) — 应用 GLU 的Conv1dSubsampler
层输出的维度。虽然原始 Flashlight 代码使用值 2,但由于转置差异,此处将其调整为 1。 - conv_dropout (
int
, optional, defaults to 0.3) — 在训练期间随机丢弃Conv1dSubsampler
层的概率。 - num_conv_layers (
int
, optional, defaults to 1) — 应用 transformer 编码器层之前的卷积层数。 - conv_kernel (
Sequence[int]
, optional, defaults to(7,)
) — 在 transformer 层之前应用的 1D 卷积的核大小。len(conv_kernel)
必须等于num_conv_layers
。 - conv_stride (
Sequence[int]
, optional, defaults to(3,)
) — 在 transformer 层之前应用的 1D 卷积的步幅长度。len(conv_stride)
必须等于num_conv_layers
。 - input_feat_per_channel (
int
, 可选, 默认为 80) — Conv1D 层输入的通道的特征维度。 - input_channels (
int
, 可选, 默认为 1) — Conv1D 层输入的输入通道数。 - conv_channels (
List[int]
, 可选) — 中间 Conv1D 层的通道大小列表。 - ctc_loss_reduction (
str
, 可选, 默认为"sum"
) — 指定应用于torch.nn.CTCLoss
输出的归约方式。仅在训练 MCTCTForCTC 实例时相关。 - ctc_zero_infinity (
bool
, 可选, 默认为False
) — 是否将torch.nn.CTCLoss
的无穷大损失及其相关梯度置零。当输入太短而无法与目标对齐时,主要会发生无穷大损失。仅在训练 MCTCTForCTC 实例时相关。
这是用于存储 MCTCTModel 配置的配置类。它用于根据指定的参数实例化 M-CTC-T 模型,定义模型架构。使用默认值实例化配置将产生与 M-CTC-T speechbrain/m-ctc-t-large 架构类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请阅读 PretrainedConfig 的文档。
示例
>>> from transformers import MCTCTConfig, MCTCTModel
>>> # Initializing a M-CTC-T mctct-large style configuration
>>> configuration = MCTCTConfig()
>>> # Initializing a model (with random weights) from the mctct-large style configuration
>>> model = MCTCTModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
MCTCTFeatureExtractor
class transformers.MCTCTFeatureExtractor
< source >( feature_size = 80 sampling_rate = 16000 padding_value = 0.0 hop_length = 10 win_length = 25 win_function = 'hamming_window' frame_signal_scale = 32768.0 preemphasis_coeff = 0.97 mel_floor = 1.0 normalize_means = True normalize_vars = True return_attention_mask = False **kwargs )
参数
- feature_size (
int
, 默认为 80) — 提取特征的特征维度。这是梅尔频率的数量 - sampling_rate (
int
, 默认为 16000) — 音频文件应数字化的采样率,以赫兹 (Hz) 表示。 - padding_value (
float
, 默认为 0.0) — 用于填充填充值的值。 - hop_length (
int
, 默认为 10) — 窗口之间的音频样本数。在许多论文中也称为“shift”(移位)。 - win_length (
int
, 默认为 25) — 每个窗口的毫秒数 - win_function (
str
, 默认为"hamming_window"
) — 用于加窗的窗口函数名称,必须可通过torch.{win_function}
访问 - frame_signal_scale (
float
, 默认为 32768.0) — 在应用 DFT 之前,在创建帧时乘以的常数。 - preemphasis_coeff (
float
, 默认为 0.97) — 在 DFT 之前应用预加重时乘以的常数。 - mel_floor (
float
默认为 1.0) — 梅尔频率组的最小值。 - normalize_means (
bool
, 可选, 默认为True
) — 是否对提取的特征进行零均值归一化。 - normalize_vars (
bool
, 可选, 默认为True
) — 是否对提取的特征进行单位方差归一化。
构造 M-CTC-T 特征提取器。
此特征提取器继承自 SequenceFeatureExtractor,其中包含大多数主要方法。用户应参考此超类以获取有关这些方法的更多信息。此代码已从 Flashlight 的 C++ 代码改编而来。有关实现的更多信息,可以参考这个 notebook,它逐步引导用户完成实现。
__call__
< source >( raw_speech: Union padding: Union = False max_length: Optional = None truncation: bool = False pad_to_multiple_of: Optional = None return_attention_mask: Optional = None return_tensors: Union = None sampling_rate: Optional = None **kwargs )
参数
- raw_speech (
torch.Tensor
,np.ndarray
,List[float]
,List[torch.Tensor]
,List[np.ndarray]
,List[List[float]]
) — 要填充的序列或序列批次。每个序列可以是张量、numpy 数组、浮点值列表、张量列表、numpy 数组列表或浮点值列表的列表。必须是单声道音频,而不是立体声,即每个时间步单个浮点数。 - padding (
bool
,str
或 PaddingStrategy, 可选, 默认为False
) — 选择一种策略来填充返回的序列(根据模型的填充侧和填充索引):True
或'longest'
:填充到批次中最长的序列(如果仅提供单个序列,则不填充)。'max_length'
:填充到使用参数max_length
指定的最大长度,或者如果未提供该参数,则填充到模型可接受的最大输入长度。False
或'do_not_pad'
(默认):不填充(即,可以输出具有不同长度序列的批次)。
- max_length (
int
, 可选) — 返回列表的最大长度,以及可选的填充长度(见上文)。 - truncation (
bool
) — 激活截断,将长于 max_length 的输入序列剪切为 max_length。 - pad_to_multiple_of (
int
, optional) — 如果设置,将序列填充为提供值的倍数。这对于在计算能力
>= 7.5
(Volta) 的 NVIDIA 硬件上或在受益于序列长度为 128 的倍数的 TPU 上启用 Tensor Cores 的使用尤其有用。 - return_attention_mask (
bool
, optional) — 是否返回 attention mask。 如果保留为默认值,将根据特定 feature_extractor 的默认值返回 attention mask。 - return_tensors (
str
或 TensorType, optional) — 如果设置,将返回 tensors 而不是 python 整数列表。可接受的值为:'tf'
: 返回 TensorFlowtf.constant
对象。'pt'
: 返回 PyTorchtorch.Tensor
对象。'np'
: 返回 Numpynp.ndarray
对象。
- sampling_rate (
int
, optional) —raw_speech
输入被采样的采样率。 强烈建议在前向调用时传递sampling_rate
以防止静默错误。 - padding_value (
float
, defaults to 0.0) —
用于特征化并为模型准备一个或多个序列的主要方法。 它返回输入音频的 log-mel 频谱图,如原始 Flashlight MFSC 特征提取代码中所实现的那样。
MCTCTProcessor
class transformers.MCTCTProcessor
< source >( feature_extractor tokenizer )
参数
- feature_extractor (
MCTCTFeatureExtractor
) — MCTCTFeatureExtractor 的实例。 feature extractor 是必需的输入。 - tokenizer (
AutoTokenizer
) — AutoTokenizer 的实例。 tokenizer 是必需的输入。
构建一个 MCTCT 处理器,它将 MCTCT 特征提取器和 MCTCT 分词器包装到单个处理器中。
MCTCTProcessor 提供了 MCTCTFeatureExtractor 和 AutoTokenizer 的所有功能。 有关更多信息,请参阅 call() 和 decode()。
在正常模式下使用时,此方法将其所有参数转发到 MCTCTFeatureExtractor 的 call() 并返回其输出。 如果在 as_target_processor()
上下文中使用,此方法将其所有参数转发到 AutoTokenizer 的 __call__()
。 有关更多信息,请参阅上述两种方法的文档字符串。
from_pretrained
< source >( pretrained_model_name_or_path: Union cache_dir: Union = None force_download: bool = False local_files_only: bool = False token: Union = None revision: str = 'main' **kwargs )
参数
- pretrained_model_name_or_path (
str
或os.PathLike
) — 这可以是以下之一:- 一个字符串,托管在 huggingface.co 上的模型仓库内的预训练 feature_extractor 的模型 ID。
- 一个指向目录的路径,该目录包含使用 save_pretrained() 方法保存的 feature extractor 文件,例如,
./my_model_directory/
。 - 指向已保存的 feature extractor JSON 文件的路径或 URL,例如,
./my_model_directory/preprocessor_config.json
。 **kwargs — 传递给 from_pretrained() 和~tokenization_utils_base.PreTrainedTokenizer.from_pretrained
的其他关键字参数。
实例化与预训练模型关联的处理器。
此类方法只是调用 feature extractor from_pretrained()、图像处理器 ImageProcessingMixin 和分词器 ~tokenization_utils_base.PreTrainedTokenizer.from_pretrained
方法。 有关更多信息,请参阅上述方法的文档字符串。
save_pretrained
< source >( save_directory push_to_hub: bool = False **kwargs )
参数
- save_directory (
str
或os.PathLike
) — 将在其中保存 feature extractor JSON 文件和 tokenizer 文件的目录(如果目录不存在,将创建目录)。 - push_to_hub (
bool
, optional, defaults toFalse
) — 保存后是否将您的模型推送到 Hugging Face 模型中心。 您可以使用repo_id
指定要推送到的存储库(默认为您的命名空间中save_directory
的名称)。 - kwargs (
Dict[str, Any]
, optional) — 传递给 push_to_hub() 方法的其他关键字参数。
将此处理器(feature extractor、tokenizer...)的属性保存在指定目录中,以便可以使用 from_pretrained() 方法重新加载它。
此类方法只是调用 save_pretrained() 和 save_pretrained()。 有关更多信息,请参阅上述方法的文档字符串。
此方法将其所有参数转发到 AutoTokenizer 的 batch_decode()。 有关更多信息,请参阅此方法的文档字符串。
此方法将其所有参数转发到 AutoTokenizer 的 decode()。 有关更多信息,请参阅此方法的文档字符串。
MCTCTModel
class transformers.MCTCTModel
< source >( config )
参数
- config (MCTCTConfig) — 带有模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型关联的权重,仅加载配置。 查看 from_pretrained() 方法以加载模型权重。
裸机 M-CTC-T 模型转换器输出原始隐藏状态,顶部没有任何特定头部。 此模型是 PyTorch torch.nn.Module 子类。 将其用作常规 PyTorch 模块,并参阅 PyTorch 文档以了解与常规用法和行为相关的所有事项。
forward
< source >( input_features: Tensor attention_mask: Optional = None head_mask: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None return_dict: Optional = None ) → transformers.modeling_outputs.BaseModelOutput 或 tuple(torch.FloatTensor)
参数
- input_features (形状为
(batch_size, sequence_length)
的torch.LongTensor
) — 词汇表中输入序列 tokens 的索引。索引可以使用 Wav2Vec2CTCTokenizer 获得。 详情请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (形状为
(batch_size, sequence_length)
的torch.FloatTensor
, 可选) — 用于避免在 padding token 索引上执行 attention 的掩码。 掩码值在[0, 1]
中选择:- 1 表示 token 未被掩盖,
- 0 表示 token 已被掩盖。
- head_mask (形状为
(num_heads,)
或(num_layers, num_heads)
的torch.FloatTensor
, 可选) — 用于 nullify self-attention 模块中选定 head 的掩码。 掩码值在[0, 1]
中选择:- 1 表示 head 未被掩盖,
- 0 表示 head 已被掩盖。
- output_attentions (
bool
, 可选) — 是否返回所有 attention 层的 attentions tensors。 有关更多详细信息,请参阅返回的 tensors 下的attentions
。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的 hidden states。 有关更多详细信息,请参阅返回的 tensors 下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 而不是普通的 tuple。
返回值
transformers.modeling_outputs.BaseModelOutput 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.BaseModelOutput 或一个 torch.FloatTensor
的 tuple (如果传递了 return_dict=False
或者当 config.return_dict=False
时),其中包含各种元素,具体取决于配置 (MCTCTConfig) 和输入。
-
last_hidden_state (形状为
(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
) — 模型最后一层的输出端的 hidden-states 序列。 -
hidden_states (
tuple(torch.FloatTensor)
, 可选, 当传递了output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
的 Tuple (对于 embeddings 的输出,如果模型有 embedding 层,则有一个;对于每一层的输出,则有一个),形状为(batch_size, sequence_length, hidden_size)
。模型在每一层输出端的 Hidden-states,加上可选的初始 embedding 输出。
-
attentions (
tuple(torch.FloatTensor)
, 可选, 当传递了output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
的 Tuple (每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。attention softmax 之后的 Attention 权重,用于计算 self-attention heads 中的加权平均值。
MCTCTModel 的 forward 方法,覆盖了 __call__
特殊方法。
虽然 forward pass 的配方需要在该函数内定义,但之后应该调用 Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
示例
>>> from transformers import AutoProcessor, MCTCTModel
>>> from datasets import load_dataset
>>> import torch
>>> dataset = load_dataset("hf-internal-testing/librispeech_asr_demo", "clean", split="validation", trust_remote_code=True)
>>> dataset = dataset.sort("id")
>>> sampling_rate = dataset.features["audio"].sampling_rate
>>> processor = AutoProcessor.from_pretrained("speechbrain/m-ctc-t-large")
>>> model = MCTCTModel.from_pretrained("speechbrain/m-ctc-t-large")
>>> # audio file is decoded on the fly
>>> inputs = processor(dataset[0]["audio"]["array"], sampling_rate=sampling_rate, return_tensors="pt")
>>> with torch.no_grad():
... logits = model(**inputs).logits
>>> predicted_ids = torch.argmax(logits, dim=-1)
>>> # transcribe speech
>>> transcription = processor.batch_decode(predicted_ids)
>>> transcription[0]
[1, 195, 1536]
>>> inputs["labels"] = processor(text=dataset[0]["text"], return_tensors="pt").input_ids
>>> # compute loss
>>> loss = model(**inputs).loss
MCTCTForCTC
class transformers.MCTCTForCTC
< source >( config )
参数
- config (MCTCTConfig) — 带有模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型关联的权重,只会加载配置。 查看 from_pretrained() 方法来加载模型权重。
带有 language modeling
head 的 MCTCT 模型,用于 Connectionist Temporal Classification (CTC)。 此模型是 PyTorch torch.nn.Module 子类。 将其用作常规 PyTorch Module,并参考 PyTorch 文档以了解与常规用法和行为相关的所有事项。
forward
< source >( input_features: Tensor attention_mask: Optional = None head_mask: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None return_dict: Optional = None labels: Optional = None ) → transformers.modeling_outputs.CausalLMOutput 或 tuple(torch.FloatTensor)
参数
- input_features (形状为
({0})
的torch.LongTensor
) — 词汇表中输入序列 tokens 的索引。索引可以使用 Wav2Vec2CTCTokenizer 获得。 详情请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (形状为
({0})
的torch.FloatTensor
, 可选) — 用于避免在 padding token 索引上执行 attention 的掩码。 掩码值在[0, 1]
中选择:- 1 表示 token 未被掩盖,
- 0 表示 token 已被掩盖。
- head_mask (形状为
(num_heads,)
或(num_layers, num_heads)
的torch.FloatTensor
, 可选) — 用于 nullify self-attention 模块中选定 head 的掩码。 掩码值在[0, 1]
中选择:- 1 表示 head 未被掩盖,
- 0 表示 head 已被掩盖。
- output_attentions (
bool
, 可选) — 是否返回所有 attention 层的 attentions tensors。 有关更多详细信息,请参阅返回的 tensors 下的attentions
。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的 hidden states。 有关更多详细信息,请参阅返回的 tensors 下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 而不是普通的 tuple。 - labels (形状为
(batch_size, target_length)
的torch.LongTensor
, 可选) — 用于 connectionist temporal classification 的标签。 请注意,target_length
必须小于或等于输出 logits 的序列长度。 索引在[-100, 0, ..., config.vocab_size - 1]
中选择。 所有设置为-100
的标签都会被忽略(掩盖),损失仅针对[0, ..., config.vocab_size - 1]
中的标签计算。
返回值
transformers.modeling_outputs.CausalLMOutput 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.CausalLMOutput 或一个 torch.FloatTensor
的 tuple (如果传递了 return_dict=False
或者当 config.return_dict=False
时),其中包含各种元素,具体取决于配置 (MCTCTConfig) 和输入。
-
loss (形状为
(1,)
的torch.FloatTensor
, 可选, 当提供labels
时返回) — 语言建模损失(用于下一个 token 预测)。 -
logits (形状为
(batch_size, sequence_length, config.vocab_size)
的torch.FloatTensor
) — 语言建模 head 的预测分数(SoftMax 之前每个词汇表 token 的分数)。 -
hidden_states (
tuple(torch.FloatTensor)
, 可选, 当传递了output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
的 Tuple (对于 embeddings 的输出,如果模型有 embedding 层,则有一个;对于每一层的输出,则有一个),形状为(batch_size, sequence_length, hidden_size)
。模型在每一层输出端的 Hidden-states,加上可选的初始 embedding 输出。
-
attentions (
tuple(torch.FloatTensor)
, 可选, 当传递了output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
的 Tuple (每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。attention softmax 之后的 Attention 权重,用于计算 self-attention heads 中的加权平均值。
MCTCTForCTC 的 forward 方法,覆盖了 __call__
特殊方法。
虽然 forward pass 的配方需要在该函数内定义,但之后应该调用 Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
示例
>>> from transformers import AutoProcessor, MCTCTForCTC
>>> from datasets import load_dataset
>>> import torch
>>> dataset = load_dataset("hf-internal-testing/librispeech_asr_demo", "clean", split="validation", trust_remote_code=True)
>>> dataset = dataset.sort("id")
>>> sampling_rate = dataset.features["audio"].sampling_rate
>>> processor = AutoProcessor.from_pretrained("speechbrain/m-ctc-t-large")
>>> model = MCTCTForCTC.from_pretrained("speechbrain/m-ctc-t-large")
>>> # audio file is decoded on the fly
>>> inputs = processor(dataset[0]["audio"]["array"], sampling_rate=sampling_rate, return_tensors="pt")
>>> with torch.no_grad():
... logits = model(**inputs).logits
>>> predicted_ids = torch.argmax(logits, dim=-1)
>>> # transcribe speech
>>> transcription = processor.batch_decode(predicted_ids)
>>> transcription[0]
"Mr. Quilter is the apostle of the middle classes, and we're glad to welcome his gospel."
>>> inputs["labels"] = processor(text=dataset[0]["text"], return_tensors="pt").input_ids
>>> # compute loss
>>> loss = model(**inputs).loss
>>> round(loss.item(), 2)
1885.65