Walleclipse / Deep_Speaker-speaker_recognition_system

Keras implementation of ‘’Deep Speaker: an End-to-End Neural Speaker Embedding System‘’ (speaker recognition)
245 stars 81 forks source link

关于分类和验证的问题 #55

Closed Fansgithub2019 closed 3 years ago

Fansgithub2019 commented 4 years ago

感谢您分享这么优秀的代码,想请教您的是预训练接了softmax层能够进行说话人的分类,没有Triplet Loss,train.py训练出来的模型只能用于说话人验证吗?如果我想用train.py训练带Triplet Loss,并且能够进行说话人分类,是不是在train.py中用Dense定义一层softmax接上,但是model.compile()编译的Triplet Loss没有参数保存,无法保存在h5模型里是么? 期待您的解答。

Walleclipse commented 4 years ago

你好,

  1. train.py训练出来的模型主要用于说话人验证,因为该问题就是训练集的人和测试集的人是不一样的,无法识别,有关用途可以查看 issue21.
  2. 说话人分类要求测试集中的人必须在训练集中出现过,不然无法分类。直接通过 pretraining.py 跑出来的模型就是说话人分类的模型,你可以直接用这个进行说话人分类。你想进行说话人分类就不能用Triplet Loss,需要用 categorical_crossentropy。
  3. model.compile()编译的Triplet Loss没有参数保存,无法保存在h5模型?这一点我没有太理解。一般情况下loss是不需要保存在h5模里的,每次运行重新加载。
LittleMaWen commented 4 years ago

您好,您的意思是分类和验证使用的是不同的模型么? train.py训练,test_model.py测试得到的是说话人验证,验证所使用的训练集和测试集是完全不同的人。 如果先使用pretraining.py预训练了,再进行train.py, test_model.py就是说话人分类,要求训练集和测试集有所重叠?

Fansgithub2019 commented 4 years ago

你好,

  1. train.py训练出来的模型主要用于说话人验证,因为该问题就是训练集的人和测试集的人是不一样的,无法识别,有关用途可以查看 issue21.
  2. 说话人分类要求测试集中的人必须在训练集中出现过,不然无法分类。直接通过 pretraining.py 跑出来的模型就是说话人分类的模型,你可以直接用这个进行说话人分类。你想进行说话人分类就不能用Triplet Loss,需要用 categorical_crossentropy。
  3. model.compile()编译的Triplet Loss没有参数保存,无法保存在h5模型?这一点我没有太理解。一般情况下loss是不需要保存在h5模里的,每次运行重新加载。

感谢您的答复,说话人分类和说话人验证是两个不同的模型, 测试时一个运用损失,另一个通过打分,有着不同的目的,但是两者训练好的模型不能直接互用? 还有一点疑惑的是在test_model.py的代码里 第127行 embed = model.predict_onbatch(x) 在if gru_model is not None:下面是用来获取gru_model对数据的嵌入的吧,这个model是不是用的gru_model?

ZengHorace commented 4 years ago

您好,您的意思是分类和验证使用的是不同的模型么? train.py训练,test_model.py测试得到的是说话人验证,验证所使用的训练集和测试集是完全不同的人。 如果先使用pretraining.py预训练了,再进行train.py, test_model.py就是说话人分类,要求训练集和测试集有所重叠?

pretraining.py得到的是分类模型:将说话者分类为特定身份;train.py得到的是验证模型:即确定一对话语是否属于同一个人

Walleclipse commented 4 years ago

您好,您的意思是分类和验证使用的是不同的模型么? train.py训练,test_model.py测试得到的是说话人验证,验证所使用的训练集和测试集是完全不同的人。 如果先使用pretraining.py预训练了,再进行train.py, test_model.py就是说话人分类,要求训练集和测试集有所重叠?

  1. 分类和验证所使用的模型的前面embedding部分是一样的,只是分类模型多出来了最后的分类层。
  2. pretraining.py 所使用的训练集和测试集的说话者重叠,不然无法分类。而真正的 train.py训练,test_model.py测试的数据是 不能有 训练集和测试集的说话者重叠 的。 所以你实际上用的时候 把数据分层两部分 第一部分是 train.py训练用的,第二部分是test_model.py测试用的。然后在 pretraining.py 的时候 再从 第一部分训练集中抽出一点当测试就行了。
Walleclipse commented 4 years ago

感谢您的答复,说话人分类和说话人验证是两个不同的模型, 测试时一个运用损失,另一个通过打分,有着不同的目的,但是两者训练好的模型不能直接互用? 还有一点疑惑的是在test_model.py的代码里 第127行 embed = model.predict_onbatch(x) 在if gru_model is not None:下面是用来获取gru_model对数据的嵌入的吧,这个model是不是用的gru_model?

  1. 不能说是两个不同的模型. 应该说是 说话人分类的模型 = 说话人验证的模型 + 分类层。 所以两者是相关的。两者目的不一样,不能直接互用。但是可以稍微改一下互用,也就是从 说话人分类的模型去掉最后一个 分类层 就是说话人验证的模型。
  2. gru_modelconstants.py 里设置 True或者 False。如果是 True就利用 gru模型进行语音的嵌入(embedding), 也就是说用于说话人识别。
yy835055664 commented 4 years ago

非常感谢你,分享这么好的代码: 有如下几个问题想问你一下 1.预训练大致需要训练多少steps? 2.预训练是把训练数据中每个说话人分成两部分,一部分进行pretrain.py,另一部分用于test_model.py,这样就可以进行分类了吧?

Walleclipse commented 4 years ago

你好,

  1. 我在预训练的时候 大概运行了 80000 steps
  2. 这个repo的预训练只是 softmax 分类问题, 如 pretraining.py所示。 而softmax 分类的时候,大部train set里的数据用于训练,少部分train set 数据用于验证这个softmax 分类模型。 预训练结束后,我会用完整的train set 用triplet loss 训练(如 train.py所示),validation set 同于验证。
yy835055664 commented 4 years ago

测试时用的是model***.h5文件,请问bestmodel.h5文件是什么?不能用这个文件进行测试吗?------------------ 原始邮件 ------------------ 发件人: "Abuduweili"notifications@github.com 发送时间: 2020年4月27日(星期一) 上午10:17 收件人: "Walleclipse/Deep_Speaker-speaker_recognition_system"Deep_Speaker-speaker_recognition_system@noreply.github.com; 抄送: "yy835055664"835055664@qq.com;"Comment"comment@noreply.github.com; 主题: Re: [Walleclipse/Deep_Speaker-speaker_recognition_system] 关于分类和验证的问题 (#55)

你好,

我在预训练的时候 大概运行了 80000 steps

这个repo的预训练只是 softmax 分类问题, 如 pretraining.py 所示。 而softmax 分类的时候,大部train set里的数据用于训练,少部分train set 数据用于验证这个softmax 分类模型。 预训练结束后,我会用完整的train set 用triplet loss 训练(如 train.py 所示),validation set 同于验证。

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

Walleclipse commented 4 years ago

你好,可以用 checkpoints/model_17200_0.54980.h5 进行测试。 bestmodel.h5 是我自己训练的时候的一个模型,这个并没有上传到该repo上。