deepfacelab中文网

 找回密码
 立即注册(仅限QQ邮箱)

【不水】2024/9/17直观感受一下重训的效果

[复制链接]

14

主题

2849

帖子

1万

积分

高级丹圣

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

积分
15365

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

发表于 2024-9-17 21:06:04 | 显示全部楼层
本帖最后由 wtxx8888 于 2024-9-17 21:14 编辑
奇奇怪怪的ID 发表于 2024-9-17 20:42
额...其实是因为我这个素材包有三分之二的素材是我老乡给的,然后本来也是针对亚洲的换脸,所以没必要浪 ...

好了,我也成了。终于读到LOSS表了,哇哈哈。
我用的Trainer.py里面 for loss_value in loss_history[-1]: 那句,直接读的不用双标。
因为我关掉FOR循环后,只用前面其他的代码,然后给我报了,双标是空白。。。

还把重训练的切片,改的跟正常训练一样,重训练也可以带上,真脸加GAN了。

终于完美了~~
回复 支持 反对

使用道具 举报

17

主题

148

帖子

1798

积分

初级丹圣

Rank: 8Rank: 8

积分
1798
 楼主| 发表于 2024-9-17 21:19:01 | 显示全部楼层
本帖最后由 奇奇怪怪的ID 于 2024-9-17 21:22 编辑
wtxx8888 发表于 2024-9-17 21:06
好了,我也成了。终于读到LOSS表了,哇哈哈。
我用的Trainer.py里面 for loss_value in loss_history[-1]: ...
for loss_value in loss_history[-1]确实可以读取最后一个元素


你说的gan贴上来看看,我还没有什么头绪
回复 支持 反对

使用道具 举报

14

主题

2849

帖子

1万

积分

高级丹圣

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

积分
15365

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

发表于 2024-9-17 21:21:16 | 显示全部楼层
奇奇怪怪的ID 发表于 2024-9-17 21:19
贴上来看看,我还没有什么头绪

也不算完美,也有不好的地方。
分不清,进没进循环重训练了,如果碰到循环那,点P刷新不了预览
要等循环完,才会换预览图。。。
回复 支持 反对

使用道具 举报

14

主题

2849

帖子

1万

积分

高级丹圣

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

积分
15365

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

发表于 2024-9-17 21:26:38 | 显示全部楼层
奇奇怪怪的ID 发表于 2024-9-17 21:19
for loss_value in loss_history[-1]确实可以读取最后一个元素

ModelBase文件

    #overridable 新增自定义
    def repeated_training(self,high_iter_time):
        # 读取当前时钟 并转成字符串
        time_str = time.strftime("[%H:%M:%S]")

        loss_history = self.get_loss_history()

        # 迭代器计数
        self.iter += 1

        # 判断时间,迭代数,运算耗时的组合列表
        if high_iter_time >= 10:
            loss_string = "{0}[#{1:06d}][{2:.5s}s]".format ( time_str, self.iter, '{:0.4f}'.format(high_iter_time) )
        else:
            loss_string = "{0}[#{1:06d}][{2:04d}ms]".format ( time_str, self.iter, int(high_iter_time*1000) )

        for loss_value in loss_history[-1]:
            loss_string += "[%.4f]" % (loss_value)

        # 将组合好的列表 显示在窗口里
        io.log_info (loss_string, end='\r')

    #overridable 自定义
    def train_one_iter(self):

        # iter_time = time.time()
        losses, iter_time = self.onTrainOneIter()
        # iter_time = time.time() - iter_time

        self.loss_history.append ( [float(loss[1]) for loss in losses] )

        if self.should_save_preview_history():
            plist = []

            if io.is_colab():
                previews = self.get_previews()
                for i in range(len(previews)):
                    name, bgr = previews
                    plist += [ (bgr, self.get_strpath_storage_for_file('preview_%s.jpg' % (name) ) ) ]

            if self.write_preview_history:
                previews = self.get_history_previews()
                for i in range(len(previews)):
                    name, bgr = previews
                    path = self.preview_history_path / name
                    plist += [ ( bgr, str ( path / ( f'{self.iter:07d}.jpg') ) ) ]
                    if not io.is_colab():
                        plist += [ ( bgr, str ( path / ( '_last.jpg' ) )) ]

            if len(plist) != 0:
                self.get_preview_history_writer().post(plist, self.loss_history, self.iter)

        self.iter += 1

        return self.iter, iter_time
回复 支持 反对

使用道具 举报

14

主题

2849

帖子

1万

积分

高级丹圣

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

积分
15365

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

发表于 2024-9-17 21:27:43 | 显示全部楼层
奇奇怪怪的ID 发表于 2024-9-17 21:19
for loss_value in loss_history[-1]确实可以读取最后一个元素

Model 文件

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

        # 记录当前的时间
        iter_time = time.time()

        # 生成下一组样本的数据
        ( (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)

        # 计算本次训练的运算耗时
        iter_time = time.time() - iter_time

        # 如果启用了重训练样本选项
        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 )  )
                self.last_src_samples_loss.append (  (warped_src, target_src, target_srcm, target_srcm_em, src_loss )  )
                self.last_dst_samples_loss.append (  (warped_dst, 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.repeated_training(iter_time)

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

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

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

                # 重新训练的次数
                for i in range(cycles):
                    # 记录当前时间
                    iter_time = time.time()

                    # 使用已选定的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)
                    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 i != cycles-1:
                        # 获取重训练样本的平均LOSS值
                        losses = ( ('src_loss', np.mean(src_loss) ), ('dst_loss', np.mean(dst_loss) ), )
                        # 计算本次训练的运算耗时
                        iter_time = time.time() - iter_time
                        # 将重训练样本的LOSS值,写入历史记录
                        self.loss_history.append ( [float(loss[1]) for loss in losses] )

                        # 更新数据,并输出显示
                        self.repeated_training(iter_time)
                    else:
                        # 计算本次训练的运算耗时
                        iter_time = time.time() - iter_time

                # 清空记录样本的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) ), ), iter_time
回复 支持 反对

使用道具 举报

14

主题

2849

帖子

1万

积分

高级丹圣

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

积分
15365

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

发表于 2024-9-17 21:38:24 | 显示全部楼层
奇奇怪怪的ID 发表于 2024-9-17 21:19
for loss_value in loss_history[-1]确实可以读取最后一个元素

就是多记录了W片,LOSS变第五组了,排序的3改4.
再加上W的赋值,就可以真脸及GAN了。
回复 支持 反对

使用道具 举报

17

主题

148

帖子

1798

积分

初级丹圣

Rank: 8Rank: 8

积分
1798
 楼主| 发表于 2024-9-17 21:38:40 | 显示全部楼层
wtxx8888 发表于 2024-9-17 21:27
Model 文件

    #override 自定义

啊...这...就是把真脸放到循环里啊,可以可以,我也抄作业
回复 支持 反对

使用道具 举报

14

主题

2849

帖子

1万

积分

高级丹圣

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

积分
15365

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

发表于 2024-9-17 21:39:57 | 显示全部楼层
奇奇怪怪的ID 发表于 2024-9-17 21:38
啊...这...就是把真脸放到循环里啊,可以可以,我也抄作业

本来想做成定义的呼叫,要带8个参数过去,还特么不如写两份,真脸加GAN得了。。。。
回复 支持 反对

使用道具 举报

14

主题

587

帖子

5867

积分

高级丹圣

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

积分
5867
发表于 2024-9-17 21:52:54 | 显示全部楼层
SO INTERESTING
回复 支持 反对

使用道具 举报

17

主题

148

帖子

1798

积分

初级丹圣

Rank: 8Rank: 8

积分
1798
 楼主| 发表于 2024-9-17 21:53:52 | 显示全部楼层
wtxx8888 发表于 2024-9-17 21:39
本来想做成定义的呼叫,要带8个参数过去,还特么不如写两份,真脸加GAN得了。。。。 ...

我要去了解一下眼嘴了,眼嘴的权重在训练中具体那个位置起到了作用,我还没找到
回复 支持 反对

使用道具 举报

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

GMT+8, 2024-10-25 03:31 , Processed in 0.089068 second(s), 8 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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