deepfacelab中文网

 找回密码
 立即注册(仅限QQ邮箱)
查看: 758|回复: 33

【统计】搞了个高loss重复次数的选项

[复制链接]

17

主题

148

帖子

1798

积分

初级丹圣

Rank: 8Rank: 8

积分
1798
 楼主| 发表于 2024-9-15 22:30:43 | 显示全部楼层 |阅读模式
星级打分
  • 1
  • 2
  • 3
  • 4
  • 5
平均分:NAN  参与人数:0  我的评分:未评
本帖最后由 奇奇怪怪的ID 于 2024-9-16 09:32 编辑

这些天搞了这么个玩意儿


1.周期性训练:

    作用是当你启动了周期性训练,满足你设置的周期后将这个周期内最高loss的一个批次样本提取出来重新训练一遍,
    有助于难练的素材得到更多的训练机会(这里注意!是难练的素材,不是错图)

    更新点:

        a)增加设置项,可以自定义周期内最高loss的一个批次样本提取出来重新训练的次数。

        b)原来开启周期性训练会导致周期训练时的迭代数不计入模型迭代次数里(迭代时间看似增加实则为两次迭代的时间总和),
           现在改为根据实际迭代正确的将次数写入模型。


image.png
image.png

2.训练过程的文件名及loss一一对应导出,并完善配套的分析方式(多种)、匹配loss值范围的素材自动挑选(就是根据所处范围移动到相应文件夹)、复位(复位到原来的素材文件夹aligned)



原始数据:

image.png


排除loss剧烈波动后的分析文件:


image.png

根据计算方式不同的输出:
计算方式有三种,最小值、平均值、最大值
image.png

根据计算方式的结果自动移动到相应的文件夹:

97e5af7d409a1f5bd574d955632bac27.png

最后就是一键复位,将删剩的素材复位到原来的文件夹

7c34d2dbbb1618c5d5928d20cf11df7d.png


额...发这个帖的意思是看下有多少人需要,低于20个人我就不费这个劲了,前段时间有个人一直催我要预览图显示loss值,本来想着小改动没必要单独发的,催烦了就先发了

单选投票, 共有 24 人参与投票

投票已经结束

87.50% (21)
4.17% (1)
8.33% (2)
您所在的用户组没有投票权限

评分

参与人数 3贡献 +3 收起 理由
taoxiaobao + 1 十分给力!
zrun3728 + 1 非常牛!
暗影萨满 + 1 十分给力!

查看全部评分

回复

使用道具 举报

14

主题

2849

帖子

1万

积分

高级丹圣

Rank: 13Rank: 13Rank: 13Rank: 13

积分
15365

真我风采勋章万事如意节日勋章

发表于 2024-9-15 22:45:01 | 显示全部楼层
本帖最后由 wtxx8888 于 2024-9-15 22:54 编辑

我今天也刚写了循环训练,修复迭代计数统计,测试多次训练的效果并不好,LOSS不降反升。
2024-09-15_224832.png


看到向上的弧度了没?我一开多次,LOSS就会升。

2024-09-15_225259.png


回复

使用道具 举报

17

主题

148

帖子

1798

积分

初级丹圣

Rank: 8Rank: 8

积分
1798
 楼主| 发表于 2024-9-15 22:54:20 | 显示全部楼层
wtxx8888 发表于 2024-9-15 22:45
我今天也刚写了循环训练,修复迭代计数统计,测试多次训练的效果并不好,LOSS不降反升。

...

怎么会,应该是高loss重复了n次有n个从高到低的迭代过程导致计算平均loss时控制台显示偏高吧


给你看下参与到循环训练的样本loss导出

762aeab9c25419c8273152321246b4a8.png

虽说有一点波动,但是都是稳步下降的

回复

使用道具 举报

14

主题

2849

帖子

1万

积分

高级丹圣

Rank: 13Rank: 13Rank: 13Rank: 13

积分
15365

真我风采勋章万事如意节日勋章

发表于 2024-9-15 22:55:42 | 显示全部楼层
奇奇怪怪的ID 发表于 2024-9-15 22:54
怎么会,应该是高loss重复了n次有n个从高到低的迭代过程导致计算平均loss时控制台显示偏高吧

我一开多次,必然升LOSS
回复

使用道具 举报

17

主题

148

帖子

1798

积分

初级丹圣

Rank: 8Rank: 8

积分
1798
 楼主| 发表于 2024-9-15 22:56:20 | 显示全部楼层
本帖最后由 奇奇怪怪的ID 于 2024-9-15 23:00 编辑
wtxx8888 发表于 2024-9-15 22:45
我今天也刚写了循环训练,修复迭代计数统计,测试多次训练的效果并不好,LOSS不降反升。

你有没有更新 loss_history

不过初期偏高也正常,比如以往你都是平均0.23,循环训练时挑的是最高0.37的一批样本,那么这批样本会重复输出0.375、0.372、0.369、0.363......类似的输出

你看我的循环三十次

image.png
回复

使用道具 举报

14

主题

2849

帖子

1万

积分

高级丹圣

Rank: 13Rank: 13Rank: 13Rank: 13

积分
15365

真我风采勋章万事如意节日勋章

发表于 2024-9-15 23:00:20 | 显示全部楼层
本帖最后由 wtxx8888 于 2024-9-15 23:01 编辑
奇奇怪怪的ID 发表于 2024-9-15 22:56
你有没有更新 loss_history

都更新了,现在都不会卡一下,就跟正常训练一样的顺。等有空,再测试测试吧。。。
2024-09-15_225616.png
回复

使用道具 举报

17

主题

148

帖子

1798

积分

初级丹圣

Rank: 8Rank: 8

积分
1798
 楼主| 发表于 2024-9-15 23:04:36 | 显示全部楼层
wtxx8888 发表于 2024-9-15 23:00
都更新了,现在都不会卡一下,就跟正常训练一样的顺。等有空,再测试测试吧。。。

...

我做好后,统计的有人需要的话,发给你整合一下,我两也碰撞一下,看能不能有个最优解
回复

使用道具 举报

14

主题

2849

帖子

1万

积分

高级丹圣

Rank: 13Rank: 13Rank: 13Rank: 13

积分
15365

真我风采勋章万事如意节日勋章

发表于 2024-9-16 00:16:47 | 显示全部楼层
本帖最后由 wtxx8888 于 2024-9-16 00:22 编辑
奇奇怪怪的ID 发表于 2024-9-15 23:04
我做好后,统计的有人需要的话,发给你整合一下,我两也碰撞一下,看能不能有个最优解 ...

大尺标看曲线,跟你一样的锯齿状态,但存盘平均值,一直是升的

2024-09-16_001527.png

我学C/C++的,python很多看不懂,可能代码写的不太好,等看看你的吧,哈哈~
回复

使用道具 举报

17

主题

148

帖子

1798

积分

初级丹圣

Rank: 8Rank: 8

积分
1798
 楼主| 发表于 2024-9-16 01:28:32 | 显示全部楼层
本帖最后由 奇奇怪怪的ID 于 2024-9-16 01:32 编辑
wtxx8888 发表于 2024-9-16 00:16
大尺标看曲线,跟你一样的锯齿状态,但存盘平均值,一直是升的

image.png 你试一下,我之前是self.loss_history.append((np.mean(src_loss), np.mean(dst_loss)))的,刚刚改成self.loss_history.append([np.mean(src_loss), np.mean(dst_loss)])
回复

使用道具 举报

14

主题

2849

帖子

1万

积分

高级丹圣

Rank: 13Rank: 13Rank: 13Rank: 13

积分
15365

真我风采勋章万事如意节日勋章

发表于 2024-9-16 11:31:35 | 显示全部楼层
本帖最后由 wtxx8888 于 2024-9-16 12:27 编辑
奇奇怪怪的ID 发表于 2024-9-16 01:28
你试一下,我之前是self.loss_history.append((np.mean(src_loss), np.mean(dst_loss)))的,刚刚改成self. ...

额,我是照扒ModelBase.py的代码。你这跟我开始的计数方式差不多,但我仔细想了想,这样简单的计数,是有BUG的。
意味着,最后两次的记录,是重训练的两次重复(循环时记录了,返回后又记录一遍),而不是一次正常,一次重训练。

另,真脸倒无所谓,只用warped_src,warped_dst。
但GAN训练,应该在重训练之前完成。
不然重训练会对部分变量,进行新的赋值,从而刷掉了GAN用的,除warped_src,warped_dst之外的变量。

这会造成GAN的BUG,不是同一套的数据,在训练GAN。。。


    def onTrainOneIter(self):
        if self.get_iter() == 0 and not self.pretrain and not self.pretrain_just_disabled:
            io.log_info('您正在从头开始训练模型。强烈建议使用预训练模型来加快训练速度并提高质量。.\n')

        # 生成下一组样本数据
        ( (warped_src, target_src, target_srcm, target_srcm_em), \
          (warped_dst, target_dst, target_dstm, target_dstm_em) ) = self.generate_next_samples()

        # 使用SRC和DST样本进行训练,并计算LOSS
        src_loss, dst_loss = self.src_dst_train (warped_src, target_src, target_srcm, target_srcm_em, warped_dst, target_dst, target_dstm, target_dstm_em)

        # 如果启用了真实人脸权重,且不是预训练模式
        if self.options['true_face_power'] != 0 and not self.pretrain:
            # 训练判别器
            self.D_train (warped_src, warped_dst)

        # 如果启用了GAN权重
        if self.gan_power != 0:
            # 训练带有SRC和DST的判别器
            self.D_src_dst_train (warped_src, target_src, target_srcm, target_srcm_em, warped_dst, target_dst, target_dstm, target_dstm_em)

        # 如果启用了重训练样本选项
        if self.options['retraining_samples']:
            bs = self.get_batch_size() # 获取批量大小
            lossi = self.options['high_loss_power'] # 获取高LOSS权重参数
            cycles = self.options['number_of_cycles'] # 获取高LOSS训练次数参数

            # 记录最近一批次的样本,及其LOSS
            for i in range(bs):
                self.last_src_samples_loss.append (  (target_src, target_srcm, target_srcm_em, src_loss )  )
                self.last_dst_samples_loss.append (  (target_dst, target_dstm, target_dstm_em, dst_loss )  )

            # 当记录的样本数量,达到设定的权重时
            if len(self.last_src_samples_loss) >= bs*lossi:
                # 获取正常训练样本的平均LOSS值
                losses = ( ('src_loss', np.mean(src_loss) ), ('dst_loss', np.mean(dst_loss) ), )
                # 将正常训练样本的LOSS值,写入历史记录
                self.loss_history.append ( [float(loss[1]) for loss in losses] )
                # 迭代器计数,记录正常的这次
                self.iter += 1

                # 根据LOSS,对样本进行排序
                src_samples_loss = sorted(self.last_src_samples_loss, key=operator.itemgetter(3), reverse=True)
                dst_samples_loss = sorted(self.last_dst_samples_loss, key=operator.itemgetter(3), reverse=True)

                # 选择LOSS最高的一批样本,用于重新训练
                target_src        = np.stack( [ x[0] for x in src_samples_loss[:bs] ] )
                target_srcm       = np.stack( [ x[1] for x in src_samples_loss[:bs] ] )
                target_srcm_em    = np.stack( [ x[2] for x in src_samples_loss[:bs] ] )

                target_dst        = np.stack( [ x[0] for x in dst_samples_loss[:bs] ] )
                target_dstm       = np.stack( [ x[1] for x in dst_samples_loss[:bs] ] )
                target_dstm_em    = np.stack( [ x[2] for x in dst_samples_loss[:bs] ] )

                # 重新训练的次数
                for i in range(cycles):
                    # 使用已选定的SRC和DST样本,重新进行训练,并计算LOSS
                    src_loss, dst_loss = self.src_dst_train (target_src, target_src, target_srcm, target_srcm_em, target_dst, target_dst, target_dstm, target_dstm_em)
                    # 判定是否为 最后一次 是0则交由返回进行记录 不是0则在循环内记录
                    if i != 0:
                        # 获取重训练样本的平均LOSS值
                        losses = ( ('src_loss', np.mean(src_loss) ), ('dst_loss', np.mean(dst_loss) ), )
                        # 将重训练样本的LOSS值,写入历史记录
                        self.loss_history.append ( [float(loss[1]) for loss in losses] )
                        # 迭代器计数,记录重训练的这次
                        self.iter += 1

                # 清空记录样本的LOSS列表
                self.last_src_samples_loss = []
                self.last_dst_samples_loss = []

        # 返回SRC的平均LOSS,和DST的平均LOSS
        return ( ('src_loss', np.mean(src_loss) ), ('dst_loss', np.mean(dst_loss) ), )  # 返回ModelBase.py 那边会写最后一次的记录
回复

使用道具 举报

QQ|Archiver|手机版|deepfacelab中文网 |网站地图

GMT+8, 2024-10-25 01:27 , Processed in 0.109072 second(s), 13 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表