MockingBird社区分享的模型训练版本不一致

之前的问题我自己解决了,就是在文本里少打了个空格。
现在到最后一步了,又出现一个问题,我用MockingBird社区分享的模型训练报错,提示我模型和代码版本不一致,我该怎么修改版本?
这是模型名字,名字可能就是版本:pretrained-11-7-21_75k.pt

还有,我想用GPU训练,但是现在默认是CPU训练

Microsoft Windows [版本 10.0.19045.2965]
(c) Microsoft Corporation。保留所有权利。

H:\MockingBird>python pre.py H:\制作数据集 -d aidatatang_200zh -n 7
Using data from:
    H:\制作数据集\aidatatang_200zh\corpus\train
aidatatang_200zh: 100%|████████████████████████████████████████████████████████████| 1/1 [00:48<00:00, 48.27s/speakers]
The dataset consists of 283 utterances, 70584 mel frames, 14084160 audio timesteps (0.24 hours).
Max input length (text chars): 226
Max mel frames length: 833
Max audio timesteps length: 166560
Embedding:   0%|                                                                       | 0/283 [00:00<?, ?utterances/s]Loaded encoder "pretrained.pt" trained to step 1594501
Embedding: 100%|█████████████████████████████████████████████████████████████| 283/283 [00:09<00:00, 29.04utterances/s]

H:\MockingBird>python synthesizer_train.py xiyuetest H:\制作数据集\SV2TTS\synthesizer
Arguments:
    run_id:          xiyuetest
    syn_dir:         H:\制作数据集\SV2TTS\synthesizer
    models_dir:      synthesizer/saved_models/
    save_every:      1000
    backup_every:    25000
    log_every:       200
    force_restart:   False
    hparams:

Checkpoint path: synthesizer\saved_models\xiyuetest\xiyuetest.pt
Loading training data from: H:\制作数据集\SV2TTS\synthesizer\train.txt
Using model: Tacotron
Using device: cpu

Initialising Tacotron Model...

Trainable Parameters: 32.869M

Loading weights at synthesizer\saved_models\xiyuetest\xiyuetest.pt
Tacotron weights loaded from step 75000
Using inputs from:
        H:\制作数据集\SV2TTS\synthesizer\train.txt
        H:\制作数据集\SV2TTS\synthesizer\mels
        H:\制作数据集\SV2TTS\synthesizer\embeds
Found 283 samples
+----------------+------------+---------------+------------------+
| Steps with r=2 | Batch Size | Learning Rate | Outputs/Step (r) |
+----------------+------------+---------------+------------------+
|   85k Steps    |     12     |     5e-06     |        2         |
+----------------+------------+---------------+------------------+

H:\MockingBird\synthesizer\synthesizer_dataset.py:84: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at ..\torch\csrc\utils\tensor_new.cpp:248.)
  embeds = torch.tensor(embeds)
H:\MockingBird\synthesizer\synthesizer_dataset.py:84: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at ..\torch\csrc\utils\tensor_new.cpp:248.)
  embeds = torch.tensor(embeds)
Traceback (most recent call last):
  File "H:\MockingBird\synthesizer_train.py", line 37, in <module>
    train(**vars(args))
  File "H:\MockingBird\synthesizer\train.py", line 208, in train
    optimizer.step()
  File "C:\Users\Administrator.DESKTOP-6GOULRD\AppData\Local\Programs\Python\Python310\lib\site-packages\torch\optim\optimizer.py", line 280, in wrapper
    out = func(*args, **kwargs)
  File "C:\Users\Administrator.DESKTOP-6GOULRD\AppData\Local\Programs\Python\Python310\lib\site-packages\torch\optim\optimizer.py", line 33, in _use_grad
    ret = func(self, *args, **kwargs)
  File "C:\Users\Administrator.DESKTOP-6GOULRD\AppData\Local\Programs\Python\Python310\lib\site-packages\torch\optim\adam.py", line 141, in step
    adam(
  File "C:\Users\Administrator.DESKTOP-6GOULRD\AppData\Local\Programs\Python\Python310\lib\site-packages\torch\optim\adam.py", line 281, in adam
    func(params,
  File "C:\Users\Administrator.DESKTOP-6GOULRD\AppData\Local\Programs\Python\Python310\lib\site-packages\torch\optim\adam.py", line 344, in _single_tensor_adam
    exp_avg.mul_(beta1).add_(grad, alpha=1 - beta1)
RuntimeError: The size of tensor a (1024) must match the size of tensor b (3) at non-singleton dimension 3

H:\MockingBird>

引用chatgpt部分指引作答:
根据你提供的信息,错误是在执行预处理脚本(pre.py)时出现的。错误信息表明在计算最大输入长度时出现了问题,因为max()函数的参数是一个空序列。

错误发生在preprocess.py文件的第88行,这是在计算文本的最大长度。根据代码,该错误是因为metadata列表为空导致的。metadata是从文件中读取的音频文件的元数据列表。

要解决这个问题,你可以检查以下几个方面:

1 确保你提供的音频文件路径(H:\制作数据集\aidatatang_200zh\corpus\train\xy)中的音频文件存在,并且文件名与transcript文件中的音频文件名一致。
2 确保你提供的文本文件路径(H:\制作数据集\aidatatang_200zh\transcript\aidatatang_200_zh_transcript.txt)中的文本文件存在,并且格式正确。
3 确保文本文件中的每一行都包含正确的格式,例如"文件名+空格+文本"。
4 检查aidatatang_200_zh_transcript.txt文件是否使用UTF-8编码保存。
如果仍然遇到问题,建议逐行调试代码并输出相关变量的值,以确定问题出现的具体位置和原因。这样有助于进一步排除问题并解决错误。

你可以把txt文档里的内容截图出来看看

把电脑关了,在纸上复原你的流程,或许能找出问题所在。或是找朋友讲述你的思路,一定有什么发现。
前几天我的回答被抄袭,我与50元失之交臂,今天这100多元肯定与我无关了。回答问题,完全是业余爱好,与钱无关

学编程要会调试,不要靠猜
先看报错信息,说max函数里面传入的是个空列表
那么说明len(m[5]) for m in metadata这个表达式返回的是空列表
进一步说明metadata本身是个空list
往前一步一步查,断点或者print,看到底从哪一步开始就跟你的预期不符了

这个问题是打印list 的最大值出现的问题,最后发现是打印的list 的为空了

修改了位置,本来list 的内容不是空的,
比如

这个错误通常是因为你传递给 max() 函数的参数为空序列,例如一个空列表或空元组。

你需要确保在调用 max() 函数时传递非空序列。如果你不确定序列是否为空,可以使用 if 语句检查它并在序列非空时再执行 max() 函数。

以下是一个示例代码:

复制
my_list = [1, 2, 3]
if my_list:
    max_value = max(my_list)
    print(max_value)
else:
    print("List is empty")
在上面的代码中,我们首先检查 my_list 是否为空,如果不为空,则调用 max() 函数获取最大值。否则,打印出列表为空的信息。

根据你的报错猜测 目前你在 H:\制作数据集\aidatatang_200zh\corpus\train\ 下放置一个空文件,导致preprocess_speaker_general返回no Words,我猜这里面应该需要填充训练数据,不太清楚你是从哪里拷贝的代码,需要更多信息来推测这个文件夹用途。最后导致metadata是个空列表,然后抛出了最后一个错误。

看代码逻辑,H:\制作数据集\aidatatang_200zh\transcript/aidatatang_200_zh_transcript.txt里应该放置一些配置,每一行按照key val这种形式,很明显你乱写了一些话放进去肯定不对。

python调试三板斧 https://ask.csdn.net/questions/7908322/54130133

从你给出的错误信息来看,这是一个维度不匹配的问题。在进行张量运算时,你尝试将两个维度不同的张量进行运算,这是不允许的。

问题发生在exp_avg.mul_(beta1).add_(grad, alpha=1 - beta1)这行代码上,exp_avg张量的大小是(1024),而grad张量的大小是(3),在第3个非单一维度上他们的大小不匹配。exp_avg和grad应该是对应同一个模型参数的梯度和梯度的移动平均值,因此他们应该有相同的维度。

关于你的问题,这是我能提供的一些建议:

  1. 检查你的模型定义和训练代码,确保在计算梯度时所有的维度都正确匹配。可能是模型定义中的某个层的输入或输出大小与实际数据不匹配,或者是在计算损失函数时使用的标签数据与模型输出的大小不匹配。
  2. 尝试更新你的PyTorch版本。在某些情况下,较旧的PyTorch版本可能会有一些已知的问题或者bug。
  3. 检查你的训练数据。可能存在某些异常的数据导致了模型输入输出的维度错误。

至于使用GPU进行训练,你需要在你的代码中指定使用GPU。在PyTorch中,你可以通过torch.device('cuda')来创建一个GPU设备对象,然后在创建tensor或者模型时,通过.to(device)方法将它们移动到GPU上。例如:

python

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = MyModel().to(device)

注意,只有当你的系统中安装了CUDA,并且PyTorch版本支持GPU时,上述代码才能正确运行。否则,你可能需要安装CUDA并更新你的PyTorch版本。

最后,模型和代码版本不一致的问题,可能是因为你的模型是用一个版本的代码训练出来的,而你现在使用的代码版本有所不同,导致模型参数的结构或者名称发生了改变。这种情况下,你需要找到与模型匹配的代码版本,或者手动调整代码以适应模型的参数结构。

  1. 检查MockingBird代码和预训练模型的版本号,确定哪个版本较高。
    预训练模型版本号在文件名中,为11-7-21。MockingBird的代码版本号可在代码文件头部或README找到。
  2. 如果代码版本较高,将预训练模型文件名从http://pretrained-11-7-21_75k.pt改为http://xn--pretrained-_75k-2d6xp54dz62f4d0be6xa.pt。
    然后重新加载此模型,进行训练尝试。如果训练成功,则说明版本问题已经解决。
  3. 如果预训练模型版本较高,应从网上下载最新版本的MockingBird代码。
    下载地址为:https://github.com/microsoft/MockingBird 。更新代码后,重新运行训练过程。
  4. 要使用GPU训练,需要在代码中添加以下设置:
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model = TheModelClass(*args, **kwargs).to(device)
    这会将模型和训练过程放在GPU上运行,如果有GPU,训练速度会大大提高。
  5. 还应检查Python版本是否为3.6+、所有的依赖库版本是否最新以及硬件环境是否正常。
    任何这些版本或环境不兼容都可能导致报错。