Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Overbill1683
Stable Diffusion Webui
提交
283249d2
S
Stable Diffusion Webui
项目概览
Overbill1683
/
Stable Diffusion Webui
10 个月 前同步成功
通知
1735
Star
81
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
分析
仓库
DevOps
项目成员
Pages
S
Stable Diffusion Webui
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Pages
分析
分析
仓库分析
DevOps
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
提交
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
283249d2
编写于
11月 04, 2022
作者:
A
aria1th
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
apply
上级
179702ad
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
49 addition
and
5 deletion
+49
-5
modules/hypernetworks/hypernetwork.py
modules/hypernetworks/hypernetwork.py
+49
-5
未找到文件。
modules/hypernetworks/hypernetwork.py
浏览文件 @
283249d2
...
...
@@ -22,6 +22,8 @@ from collections import defaultdict, deque
from
statistics
import
stdev
,
mean
optimizer_dict
=
{
optim_name
:
cls_obj
for
optim_name
,
cls_obj
in
inspect
.
getmembers
(
torch
.
optim
,
inspect
.
isclass
)
if
optim_name
!=
"Optimizer"
}
class
HypernetworkModule
(
torch
.
nn
.
Module
):
multiplier
=
1.0
activation_dict
=
{
...
...
@@ -142,6 +144,8 @@ class Hypernetwork:
self
.
use_dropout
=
use_dropout
self
.
activate_output
=
activate_output
self
.
last_layer_dropout
=
kwargs
[
'last_layer_dropout'
]
if
'last_layer_dropout'
in
kwargs
else
True
self
.
optimizer_name
=
None
self
.
optimizer_state_dict
=
None
for
size
in
enable_sizes
or
[]:
self
.
layers
[
size
]
=
(
...
...
@@ -163,6 +167,7 @@ class Hypernetwork:
def
save
(
self
,
filename
):
state_dict
=
{}
optimizer_saved_dict
=
{}
for
k
,
v
in
self
.
layers
.
items
():
state_dict
[
k
]
=
(
v
[
0
].
state_dict
(),
v
[
1
].
state_dict
())
...
...
@@ -178,8 +183,15 @@ class Hypernetwork:
state_dict
[
'sd_checkpoint_name'
]
=
self
.
sd_checkpoint_name
state_dict
[
'activate_output'
]
=
self
.
activate_output
state_dict
[
'last_layer_dropout'
]
=
self
.
last_layer_dropout
if
self
.
optimizer_name
is
not
None
:
optimizer_saved_dict
[
'optimizer_name'
]
=
self
.
optimizer_name
torch
.
save
(
state_dict
,
filename
)
if
self
.
optimizer_state_dict
:
optimizer_saved_dict
[
'hash'
]
=
sd_models
.
model_hash
(
filename
)
optimizer_saved_dict
[
'optimizer_state_dict'
]
=
self
.
optimizer_state_dict
torch
.
save
(
optimizer_saved_dict
,
filename
+
'.optim'
)
def
load
(
self
,
filename
):
self
.
filename
=
filename
...
...
@@ -202,6 +214,18 @@ class Hypernetwork:
print
(
f
"Activate last layer is set to
{
self
.
activate_output
}
"
)
self
.
last_layer_dropout
=
state_dict
.
get
(
'last_layer_dropout'
,
False
)
optimizer_saved_dict
=
torch
.
load
(
self
.
filename
+
'.optim'
,
map_location
=
'cpu'
)
if
os
.
path
.
exists
(
self
.
filename
+
'.optim'
)
else
{}
self
.
optimizer_name
=
optimizer_saved_dict
.
get
(
'optimizer_name'
,
'AdamW'
)
print
(
f
"Optimizer name is
{
self
.
optimizer_name
}
"
)
if
sd_models
.
model_hash
(
filename
)
==
optimizer_saved_dict
.
get
(
'hash'
,
None
):
self
.
optimizer_state_dict
=
optimizer_saved_dict
.
get
(
'optimizer_state_dict'
,
None
)
else
:
self
.
optimizer_state_dict
=
None
if
self
.
optimizer_state_dict
:
print
(
"Loaded existing optimizer from checkpoint"
)
else
:
print
(
"No saved optimizer exists in checkpoint"
)
for
size
,
sd
in
state_dict
.
items
():
if
type
(
size
)
==
int
:
self
.
layers
[
size
]
=
(
...
...
@@ -223,7 +247,7 @@ def list_hypernetworks(path):
name
=
os
.
path
.
splitext
(
os
.
path
.
basename
(
filename
))[
0
]
# Prevent a hypothetical "None.pt" from being listed.
if
name
!=
"None"
:
res
[
name
]
=
filename
res
[
name
+
f
"(
{
sd_models
.
model_hash
(
filename
)
}
)"
]
=
filename
return
res
...
...
@@ -369,6 +393,7 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
else
:
hypernetwork_dir
=
None
hypernetwork_name
=
hypernetwork_name
.
rsplit
(
'('
,
1
)[
0
]
if
create_image_every
>
0
:
images_dir
=
os
.
path
.
join
(
log_directory
,
"images"
)
os
.
makedirs
(
images_dir
,
exist_ok
=
True
)
...
...
@@ -404,8 +429,19 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
weights
=
hypernetwork
.
weights
()
for
weight
in
weights
:
weight
.
requires_grad
=
True
# if optimizer == "AdamW": or else Adam / AdamW / SGD, etc...
optimizer
=
torch
.
optim
.
AdamW
(
weights
,
lr
=
scheduler
.
learn_rate
)
# Here we use optimizer from saved HN, or we can specify as UI option.
if
(
optimizer_name
:
=
hypernetwork
.
optimizer_name
)
in
optimizer_dict
:
optimizer
=
optimizer_dict
[
hypernetwork
.
optimizer_name
](
params
=
weights
,
lr
=
scheduler
.
learn_rate
)
else
:
print
(
f
"Optimizer type
{
optimizer_name
}
is not defined!"
)
optimizer
=
torch
.
optim
.
AdamW
(
params
=
weights
,
lr
=
scheduler
.
learn_rate
)
optimizer_name
=
'AdamW'
if
hypernetwork
.
optimizer_state_dict
:
# This line must be changed if Optimizer type can be different from saved optimizer.
try
:
optimizer
.
load_state_dict
(
hypernetwork
.
optimizer_state_dict
)
except
RuntimeError
as
e
:
print
(
"Cannot resume from saved optimizer!"
)
print
(
e
)
steps_without_grad
=
0
...
...
@@ -467,7 +503,11 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
# Before saving, change name to match current checkpoint.
hypernetwork_name_every
=
f
'
{
hypernetwork_name
}
-
{
steps_done
}
'
last_saved_file
=
os
.
path
.
join
(
hypernetwork_dir
,
f
'
{
hypernetwork_name_every
}
.pt'
)
hypernetwork
.
optimizer_name
=
optimizer_name
if
shared
.
opts
.
save_optimizer_state
:
hypernetwork
.
optimizer_state_dict
=
optimizer
.
state_dict
()
save_hypernetwork
(
hypernetwork
,
checkpoint
,
hypernetwork_name
,
last_saved_file
)
hypernetwork
.
optimizer_state_dict
=
None
# dereference it after saving, to save memory.
textual_inversion
.
write_loss
(
log_directory
,
"hypernetwork_loss.csv"
,
hypernetwork
.
step
,
len
(
ds
),
{
"loss"
:
f
"
{
previous_mean_loss
:.
7
f
}
"
,
...
...
@@ -530,8 +570,12 @@ Last saved image: {html.escape(last_saved_image)}<br/>
report_statistics
(
loss_dict
)
filename
=
os
.
path
.
join
(
shared
.
cmd_opts
.
hypernetwork_dir
,
f
'
{
hypernetwork_name
}
.pt'
)
hypernetwork
.
optimizer_name
=
optimizer_name
if
shared
.
opts
.
save_optimizer_state
:
hypernetwork
.
optimizer_state_dict
=
optimizer
.
state_dict
()
save_hypernetwork
(
hypernetwork
,
checkpoint
,
hypernetwork_name
,
filename
)
del
optimizer
hypernetwork
.
optimizer_state_dict
=
None
# dereference it after saving, to save memory.
return
hypernetwork
,
filename
def
save_hypernetwork
(
hypernetwork
,
checkpoint
,
hypernetwork_name
,
filename
):
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录