在Flux种训练了一个不存在的概念#Wonderman

shadow:

这是一篇RunDiffusion发布的训练Wonderman的Lora经验总结,花了100个小时做了个验证,成功在Flux中训练了一个原本不存在的概念,训练的Lora表现非常出色。我们可以重点关注优化训练数据集所提到的方法。

接下来一起看下作者的经验总结:

5b4ea95f990c30bb8940174ee711b25b.png


Wonderman - By RunDiffusion.com

Proof of Concept Goals

概念验证目标

对于这个概念验证(POC),我们需要验证以下内容:

- 这个概念不能存在于Flux数据集中

- 这个概念需要存在,但仍允许创造性的灵活性

- 这个概念需要在90%的准确度范围内与主题相似

- 主题不能“接管”模型

我们使用了能找到的最低质量的数据。选择了1947年的Wonderman!Wonderman 已经是公开版权,所以可以自由分享。

3a2117f9101805bfa040407a8d9aefc5.png

先测试Flux,没有加Lora的Flux 认为“Wonderman”是“Superman”

0a94fd207e7c25d0acf56b7139d885da.png

或者是其他的超级英雄形象。

总之,Flux就是不认得Wonderman 

da973ac80a2bba984c719e3e2a1c4ce2.png

准备训练的数据集

可以看到,作者准备的数据集质量有点低:低分辨率、裁剪过的、形状奇怪的、像素化的。最差的数据集,这并没有难倒作者!

数据清理策略

为了修复数据,我们需要:

- 修补背景、签名和文字等问题区域

- 向外扩展图像

- 放大图像,至少达到1024x1024以上

- 创建多样化的变体以增加数据量并提供多样化的数据

208c51d666d1b3ccca9c8f4a314dfef5.png

通过这些技术,我们能够将数据集扩展到13张。

为数据添加文本描述

我们不完全了解Flux偏好的文本描述风格。我们知道这个模型对完整的描述性句子反应良好,所以我们采用了这种方式。

以下是一些图像及其文本描述示例:

48d2bf869ab85a461d98bcdbfccd2113.png

一个复古的《Wonderman》漫画封面。封面上有三个主要角色:穿绿色服装、胸前有大写字母“W”的Wonderman,穿黄色和黑色服装的女性,以及穿棕色服装的小人物。Wonderman和女性似乎处于动态姿势,暗示着动作或战斗。Wonderman手持一件细长锋利的物品,可能是一种武器。女性表情自信,目光看向观众。背景是绿色和黄色的混合,有一些抽象的设计。

.

284176e65dbd1195c31dd50249cd0867.png

神奇侠,一个男性超级英雄角色。他穿着绿色和红色的服装,胸前有一个大写字母“W”的徽章。神奇侠身材健壮,棕色头发,戴着黑色眼罩。他自信地站着,双手放在身体两侧。照片。

训练数据

作者的所有任务都是在配备RTX 4090 64GB 上执行的。请注意,32GB RAM是不够的,因为在缓存潜变量时可能会遇到显存不足错误。

作者使用了RunDiffusion.com来测试创建的LoRA,启动5个服务器并使用5个检查点来确定最佳收敛的一个。

训练工具使用了Ostris的ai-toolkit

默认配置为Rank 16,学习率为4e-4

在2200到2600步时看到了良好的收敛。即使是一些进入4000步范围的检查点也表现得相当不错。如果目标是更精细的细节,你可能需要将rank调整到32并降低学习率。如果这样做,你还需要运行更多的步数。

训练风格:使用简单的文本描述和清晰的示例来保持一致的风格是至关重要的。

训练概念:你可以选择描述性文本以避免干扰现有的标记,或者选择可能会干扰的通用文本,这取决于你的意图。这个选择应该是有意为之的。

为数据添加描述性文本从未如此重要。

0f3c43293b45e9fc05ad9d7784ca2a06.png

你可以在单一的卡通概念上训练一个LoRA,同时仍能生成照片级真实的人物。你甚至可以为前景的卡通和背景的真实场景添加描述性文本!

训练LoRA的总时间大约是2到2.5小时。费用上的花费大约是1到2美元,甚至会更便宜。现在来看看结果吧!

500步

一开始在500步时,你会得到一些相似的结果。这主要是基线Flux。如果你正在训练一个已经存在的概念,那么即使在仅仅500步时你也会看到一些收敛。

42a164a6fff57d9481eeae2604036455.png

Prompt:  一个《神奇侠》的复古漫画封面,展示了三个角色在一个动态的动作场景中。中央人物是神奇侠,表情自信,穿着绿色衬衫,系着黄色腰带,戴着红色手套。在他左边是一个表情担忧的女人,穿着黄色上衣和红色裙子。在右边有一个长着尖牙和利爪的怪物,似乎正在攻击这个男人。背景简洁,主要是蓝色,底部有一丝风景。文字“WONDER COMICS”和“第11期”表明这是一个系列中的一部分。

1250步

这里会开始有些分裂。要有耐心。它正在学习。

de3d13a52718f7b122970ea2d784c40a.png

Prompt: 一个标题为《神奇侠漫画》的复古漫画封面。中央人物是神奇侠,他似乎处于战斗姿态,正向一个张着大嘴、露出尖牙的巨大威胁生物猛扑。在主要角色的下方,有一个穿着黄色连衣裙的女人,手里拿着一个小装置,可能是枪。她似乎很惊慌。在背景中,有一座未来感十足的塔楼,塔顶上站着几个人物。整体色调鲜艳,以黄色、绿色和紫色为主。


1750步

嘿!我们有进展了!此时,作为提示的文本描述应该能很好地展示我们的主题,但真正的测试是脱离文本描述,看看我们的主题是否依然存在。

aef7bd7511d635a671b8ea758a76764b.png

Prompt: 神奇侠身穿绿红相间的服装,胸前有一个大大的“W”徽章,英勇地站立着。

2500步

他在那儿!我们现在可以更自由地提示,让Wonderman做其他事情。请记住,我们仍然会受到训练内容的限制,但至少我们有了一个很好的起点!

74570f8ee2a0641e31b7856a9008e850.png

Prompt:

漫画风格插图:Wonderman在月球上逃离外星人。中心人物是Wonderman,一个男性超级英雄角色。他穿着绿色和红色的服装,胸前有一个大的“W”标志,穿着到膝盖的黑色靴子。Wonderman戴着黑色眼罩。

9b568bebf6cd74c96fc67605c1503eca.png

f473bdd2fd2fb58af5bc9553c872c74d.png

结论

这个概念验证为使用Flux工作提供了宝贵的经验。每个训练项目都有自己独特的挑战和复杂性。虽然Flux易于训练,但在开始之前需要明确定义目标。 

作者在审查示例数据时,发现还需要额外的清理数据集。

这些问题影响了最终模型,导致了一些意外结果。例如,当提示“Wonderman”时,由于与“Superman”之间的相似性,模型偶尔会生成“超人”的元素,导致很多生成结果中出现了“披风”。

另一个问题是出现了多色紧身裤,有些样本显示为红色,而其他样本显示为绿色。此外,模型再次生成了紫色短裤,这直接是训练数据的结果。

作者相信,通过进一步的精炼和调整数据集,可以解决这些问题。解决这些不一致性将提高模型输出的准确性和质量。

65da02085717ebae0884cde24dd44b2f.png

62c2b82ef43595706f37181d60346f36.jpeg

原文链接:

https://hf-mirror.com/RunDiffusion/Wonderman-Flux-POC

好的,以下是在Julia中不使用Flux编写一个含有一层隐含层的神经网络的示例代码: ```julia # 定义sigmoid函数 sigmoid(x) = 1 / (1 + exp(-x)) # 定义神经网络模型 struct NeuralNetwork W1 W2 b1 b2 end # 定义模型的前向传播函数 function predict(model, x) z1 = model.W1 * x .+ model.b1 a1 = sigmoid.(z1) z2 = model.W2 * a1 .+ model.b2 y = softmax(z2) return y end # 定义损失函数 function loss(y_pred, y_true) return -sum(y_true .* log.(y_pred)) end # 定义优化器 function update!(model, lr, grads) model.W1 -= lr * grads[1] model.W2 -= lr * grads[2] model.b1 -= lr * grads[3] model.b2 -= lr * grads[4] end # 定义训练函数 function train(model, x, y_true, lr) # 前向传播 y_pred = predict(model, x) # 计算损失 loss_value = loss(y_pred, y_true) # 反向传播 grads = gradients(loss_value, params(model)) # 更新参数 update!(model, lr, grads) return loss_value end # 测试模型 function test(model, x, y_true) y_pred = predict(model, x) accuracy = sum(argmax(y_pred, dim=1) .== argmax(y_true, dim=1)) / size(y_true, 2) return accuracy end # 初始化模型 function init_model(input_size, hidden_size, output_size) W1 = randn(hidden_size, input_size) W2 = randn(output_size, hidden_size) b1 = zeros(hidden_size, 1) b2 = zeros(output_size, 1) model = NeuralNetwork(W1, W2, b1, b2) return model end # 定义训练数据 x_train = rand(4, 1000) y_train = rand(3, 1000) # 初始化模型 model = init_model(4, 5, 3) # 训练模型 for i in 1:1000 loss_value = train(model, x_train, y_train, 0.1) if i % 100 == 0 @show loss_value end end # 测试模型 x_test = rand(4, 100) y_test = rand(3, 100) accuracy = test(model, x_test, y_test) @show accuracy ``` 在这个示例中,我们手动定义了模型的参数和前向传播函数,并使用自己实现的梯度计算和优化器来进行训练。虽然这方法比使用Flux更加麻烦,但也更加灵活,可以更好地理解神经网络的内部运作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值