|
|
| import time |
| import numpy as np |
| import matplotlib.pyplot as plt |
| import matplotlib.gridspec as gridspec |
| import torch |
| import torch.nn as nn |
| from utils.data import DataWithNoisyAndMaxDist |
| from models.BRNNDist import BRNN as Model, Loss, FocalLoss |
| plt.switch_backend('agg') |
| plt.rcParams['figure.figsize'] = (16, 12) |
| plt.rcParams['figure.dpi'] = 150 |
|
|
| def main(args): |
| model_name = f"ckpt/BRNNdist/BRNNDist.TW6144.v5.pt" |
| data_tool = DataWithNoisyAndMaxDist(stride=1, n_length=6144, padlen=256, noise_prob = 0.4, std = 0.1) |
| |
| device = torch.device("cuda:1") |
| model = Model() |
| try : |
| model.load_state_dict(torch.load(model_name, map_location=device)) |
| except: |
| pass |
| model.to(device) |
| model.train() |
| if hasattr(model, "encoder"): model.encoder.eval() |
| if hasattr(model, "rnns"): model.rnns.eval() |
| if hasattr(model, "dist_head"): model.dist_head.eval() |
| for p in model.parameters(): |
| p.requires_grad = False |
| for p in model.decoder.parameters(): |
| p.requires_grad = True |
| lossfn = Loss() |
| |
| |
| class_w = torch.tensor([0.520, 0.512, 1.968], device=device) |
| focal = FocalLoss(alpha=class_w, gamma=1.5).to(device) |
| acc_time = 0 |
| outloss = open(f"logdir/loss/BRNN-dist/BRNNDist.TW6144.v5.txt", "a") |
| |
| optim = torch.optim.AdamW(model.decoder.parameters(), lr=1e-4, weight_decay=1e-4) |
|
|
| for step in range(100000): |
| st = time.perf_counter() |
| a1, a2, a3 = data_tool.batch_data(32) |
| |
| |
| |
| |
| |
| |
| wave = torch.tensor(a1, dtype=torch.float).to(device) |
| wave = wave.permute(0, 2, 1) |
| d = torch.tensor(a2, dtype=torch.float32).to(device) |
| d = d.permute(0, 2, 1) |
| labeldist = torch.tensor(a3, dtype=torch.long).to(device) |
| oc, od, odp = model(wave) |
| |
| loss = lossfn(oc, d) |
| loss.backward() |
| if loss.isnan(): |
| print("NAN error") |
| optim.zero_grad() |
| continue |
| optim.step() |
| optim.zero_grad() |
| ls = loss.detach().cpu().numpy() |
| ed = time.perf_counter() |
| outloss.write(f"{step},{ed - st},{ls}\n") |
| outloss.flush() |
| acc_time += ed - st |
| if step % 100 == 0: |
| d = a2[0] |
| labeldist = a3[0] |
| p = oc.detach().cpu().numpy()[0] |
| out = odp.argmax(axis=1) |
| pred = out[0] |
| torch.save(model.state_dict(), model_name) |
| gs = gridspec.GridSpec(3, 1,hspace=0.3) |
| fig = plt.figure(figsize=(16, 16), dpi=100) |
| for i in range(3): |
| ax = fig.add_subplot(gs[i, 0]) |
| if i == 0:ax.set_title(f"Label:{labeldist},Logits:{pred}", ha="left", va="bottom", x=0.00, y=1.01) |
| if i == 1: |
| ax.set_title("Pg", ha="left", va="bottom", x=0.00, y=1.01) |
| if i == 2:ax.set_title("Sg", ha="left", va="bottom", x=0.00, y=1.01) |
| |
| |
| ax.plot(d[:, i], alpha=0.5, c="b") |
| ax.plot(p[i, :], alpha=0.9, c="r") |
| w = a1[0, :, i%3] |
| ax.plot(w, alpha=0.3, c="k") |
| |
| plt.savefig("logdir/trainfig/BRNN-dist/BRNNDist.TW6144.v5.png") |
| print(f"训练用时:{acc_time:6.1f}, 迭代次数:{step+1}, Loss:{ls:6.1f}") |
| print("done!") |
|
|
| import argparse |
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser(description="拾取连续波形") |
| parser.add_argument('-d', '--dist', default=200, type=int, help="输入连续波形") |
| parser.add_argument('-o', '--output', default="result/t1", help="输出文件名") |
| parser.add_argument('-m', '--model', default="lppn.model", help="模型文件lppnmodel") |
| args = parser.parse_args() |
| main(args) |
|
|
|
|
|
|
|
|
|
|