改变网格参数
if _ % 5 == 0 and _ < 50:
model.update_grid_from_samples(x_i)
if _ % 5 == 0 and _ < 50:
这是一个条件判断语句,其中_
通常是一个循环的迭代计数器(例如,for循环中的索引)。这个条件判断做了两件事:_% 5 == 0
:这个表达式检查迭代计数器_
是否是5的倍数。如果是,这意味着代码块将在每5次迭代时执行一次。and _ < 50
:这个表达式确保只有在迭代计数器_
小于50的情况下,代码块才会执行。结合起来,这个条件意味着代码块将在第0、5、10、15、…、45次迭代时执行,总共执行10次。
model.update_grid_from_samples(x_i)
:这一行代码调用了model
对象(可能是一个深度学习模型)的update_grid_from_samples
方法,并传递了一个参数x_i
。这个方法调用的目的可能是根据样本数据x_i
更新模型内部的某种网格表示。在深度学习解PDE的上下文中,这可能意味着在每次迭代时,模型都会利用新的样本数据来细化或调整用于近似PDE解的内部网格或参数。
简而言之,这段代码的作用是在深度学习模型训练的前50次迭代中,每隔5次迭代使用当前的样本数据更新模型的内部网格。这是深度学习求解PDE问题中的一个常见步骤,目的是让模型逐渐学习到PDE解的特征。
loss算了俩遍
toy
见注释(因为global)
def train():
optimizer = LBFGS(model.parameters(), lr=1, history_size=10, line_search_fn="strong_wolfe", tolerance_grad=1e-32, tolerance_change=1e-32, tolerance_ys=1e-32)
#进度条
pbar = tqdm(range(steps), desc='description', ncols=100)
for _ in pbar:
def closure():
global loss_interior, loss_bc
optimizer.zero_grad()
#内部损失
loss_interior=torch.mean((model(x_i) - target_fun(x_i))**2)
#边界损失
loss_bc=torch.mean((model(x_b) - target_fun(x_b))**2)
#加权和
loss = alpha * loss_interior + loss_bc
#反向传播
loss.backward()
return loss
if _ % 5 == 0 and _ < 50:
model.update_grid_from_samples(x_i)
#STEP
optimizer.step(closure)
loss = alpha * loss_interior + loss_bc#loss没有global声明,另外俩有
if _ % log == 0:
pbar.set_description(" loss: %.2e " % (loss))
train()