Skip to content

Commit 6104d40

Browse files
authored
Add files via upload
add lr_scheduler
1 parent 17b4a6e commit 6104d40

22 files changed

+63
-70
lines changed
539 Bytes
Binary file not shown.
5.2 KB
Binary file not shown.
9.09 KB
Binary file not shown.
5.58 KB
Binary file not shown.
1.91 KB
Binary file not shown.
20.3 KB
Binary file not shown.
22 KB
Binary file not shown.
22.4 KB
Binary file not shown.
1.96 KB
Binary file not shown.

model/losses.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import torch
44
from .lovasz import _lovasz_hinge, _lovasz_softmax
55
from typing import Optional, Union
6-
from torch.nn.modules.loss import _Loss
76

87

98
# binary loss
@@ -231,6 +230,9 @@ def forward(self, y_pred_logits, y_true):
231230

232231

233232
class LovaszLoss(nn.Module):
233+
"""
234+
mutil LovaszLoss
235+
"""
234236
def __init__(self, per_image=False, ignore=None):
235237
super(LovaszLoss, self).__init__()
236238
self.ignore = ignore

model/metric.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import numpy as np
12
from torch import Tensor
23
import torch
34
import torch.nn.functional as F
@@ -44,6 +45,24 @@ def multiclass_dice_coeff(input: Tensor, target: Tensor):
4445
return dice / (input.shape[1] - 1)
4546

4647

48+
def multiclass_dice_coeffv2(input: Tensor, target: Tensor):
49+
Batchsize, Channel = input.shape[0], input.shape[1]
50+
y_pred = input.float().contiguous().view(Batchsize, Channel, -1)
51+
y_true = target.long().contiguous().view(Batchsize, -1)
52+
y_true = F.one_hot(y_true, Channel) # N,H*W -> N,H*W, C
53+
y_true = y_true.permute(0, 2, 1) # H, C, H*W
54+
assert y_pred.size() == y_true.size()
55+
smooth = 1e-5
56+
eps = 1e-7
57+
# remove backgroud region
58+
y_pred_nobk = y_pred[:, 1:Channel, ...]
59+
y_true_nobk = y_true[:, 1:Channel, ...]
60+
intersection = torch.sum(y_true_nobk * y_pred_nobk, dim=(0, 2))
61+
denominator = torch.sum(y_true_nobk + y_pred_nobk, dim=(0, 2))
62+
gen_dice_coef = ((2. * intersection + smooth) / (denominator + smooth)).clamp_min(eps)
63+
return gen_dice_coef.mean()
64+
65+
4766
def multiclass_iou_coeff(input: Tensor, target: Tensor):
4867
assert input.size() == target.size()
4968
union = 0

model/modelResNet.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ def _accuracy_function(self, accuracyname, input, target):
7777
return calc_accuracy(input, target)
7878
else:
7979
input = torch.argmax(input, 1)
80-
target = torch.argmax(target, 1)
8180
return calc_accuracy(input, target)
8281

8382
def trainprocess(self, trainimage, trainmask, validationimage, validationmask, model_dir, epochs=50, lr=1e-3):
@@ -88,7 +87,8 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
8887
print(self.model)
8988
# 1、initialize loss function and optimizer
9089
lossFunc = self._loss_function(self.loss_name)
91-
opt = optim.Adam(self.model.parameters(), lr=lr)
90+
opt = optim.Adam(self.model.parameters(), lr=lr, weight_decay=1e-4)
91+
lr_scheduler = optim.lr_scheduler.ReduceLROnPlateau(opt, 'min', patience=2, verbose=True)
9292
# 2、load data train and validation dataset
9393
train_loader = self._dataloder(trainimage, trainmask, True)
9494
val_loader = self._dataloder(validationimage, validationmask)
@@ -154,6 +154,7 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
154154
avgValidationLoss = torch.mean(torch.stack(totalValidationLoss))
155155
avgTrainAccu = torch.mean(torch.stack(totalTrainAccu))
156156
avgValidationAccu = torch.mean(torch.stack(totalValiadtionAccu))
157+
lr_scheduler.step(avgValidationLoss)
157158
# 4.6、update our training history
158159
H["train_loss"].append(avgTrainLoss.cpu().detach().numpy())
159160
H["valdation_loss"].append(avgValidationLoss.cpu().detach().numpy())
@@ -286,7 +287,6 @@ def _accuracy_function(self, accuracyname, input, target):
286287
return calc_accuracy(input, target)
287288
else:
288289
input = torch.argmax(input, 1)
289-
target = torch.argmax(target, 1)
290290
return calc_accuracy(input, target)
291291

292292
def trainprocess(self, trainimage, trainmask, validationimage, validationmask, model_dir, epochs=50, lr=1e-3):
@@ -297,7 +297,8 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
297297
print(self.model)
298298
# 1、initialize loss function and optimizer
299299
lossFunc = self._loss_function(self.loss_name)
300-
opt = optim.Adam(self.model.parameters(), lr=lr)
300+
opt = optim.Adam(self.model.parameters(), lr=lr, weight_decay=1e-4)
301+
lr_scheduler = optim.lr_scheduler.ReduceLROnPlateau(opt, 'min', patience=2, verbose=True)
301302
# 2、load data train and validation dataset
302303
train_loader = self._dataloder(trainimage, trainmask, True)
303304
val_loader = self._dataloder(validationimage, validationmask)
@@ -323,8 +324,6 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
323324
# y should tensor with shape (N,C,W,H),
324325
# if have mutil label y should one-hot,if only one label,the C is one
325326
y = batch['label']
326-
# one-hot encoding
327-
y = F.one_hot(y, self.numclass)
328327
# send the input to the device
329328
x, y = x.to(self.device), y.to(self.device)
330329
# perform a forward pass and calculate the training loss and accu
@@ -351,8 +350,6 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
351350
x = batch['image']
352351
# y should tensor with shape (N,)
353352
y = batch['label']
354-
# one-hot encoding
355-
y = F.one_hot(y, self.numclass)
356353
# send the input to the device
357354
(x, y) = (x.to(self.device), y.to(self.device))
358355
# make the predictions and calculate the validation loss
@@ -368,6 +365,7 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
368365
avgValidationLoss = torch.mean(torch.stack(totalValidationLoss))
369366
avgTrainAccu = torch.mean(torch.stack(totalTrainAccu))
370367
avgValidationAccu = torch.mean(torch.stack(totalValiadtionAccu))
368+
lr_scheduler.step(avgValidationLoss)
371369
# 4.6、update our training history
372370
H["train_loss"].append(avgTrainLoss.cpu().detach().numpy())
373371
H["valdation_loss"].append(avgValidationLoss.cpu().detach().numpy())
@@ -502,7 +500,6 @@ def _accuracy_function(self, accuracyname, input, target):
502500
return calc_accuracy(input, target)
503501
else:
504502
input = torch.argmax(input, 1)
505-
target = torch.argmax(target, 1)
506503
return calc_accuracy(input, target)
507504

508505
def trainprocess(self, trainimage, trainmask, validationimage, validationmask, model_dir, epochs=50, lr=1e-3):
@@ -513,7 +510,8 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
513510
print(self.model)
514511
# 1、initialize loss function and optimizer
515512
lossFunc = self._loss_function(self.loss_name)
516-
opt = optim.Adam(self.model.parameters(), lr=lr)
513+
opt = optim.Adam(self.model.parameters(), lr=lr, weight_decay=1e-4)
514+
lr_scheduler = optim.lr_scheduler.ReduceLROnPlateau(opt, 'min', patience=2, verbose=True)
517515
# 2、load data train and validation dataset
518516
train_loader = self._dataloder(trainimage, trainmask, True)
519517
val_loader = self._dataloder(validationimage, validationmask)
@@ -579,6 +577,7 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
579577
avgValidationLoss = torch.mean(torch.stack(totalValidationLoss))
580578
avgTrainAccu = torch.mean(torch.stack(totalTrainAccu))
581579
avgValidationAccu = torch.mean(torch.stack(totalValiadtionAccu))
580+
lr_scheduler.step(avgValidationLoss)
582581
# 4.6、update our training history
583582
H["train_loss"].append(avgTrainLoss.cpu().detach().numpy())
584583
H["valdation_loss"].append(avgValidationLoss.cpu().detach().numpy())
@@ -711,7 +710,6 @@ def _accuracy_function(self, accuracyname, input, target):
711710
return calc_accuracy(input, target)
712711
else:
713712
input = torch.argmax(input, 1)
714-
target = torch.argmax(target, 1)
715713
return calc_accuracy(input, target)
716714

717715
def trainprocess(self, trainimage, trainmask, validationimage, validationmask, model_dir, epochs=50, lr=1e-3):
@@ -722,7 +720,8 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
722720
print(self.model)
723721
# 1、initialize loss function and optimizer
724722
lossFunc = self._loss_function(self.loss_name)
725-
opt = optim.Adam(self.model.parameters(), lr=lr)
723+
opt = optim.Adam(self.model.parameters(), lr=lr, weight_decay=1e-4)
724+
lr_scheduler = optim.lr_scheduler.ReduceLROnPlateau(opt, 'min', patience=2, verbose=True)
726725
# 2、load data train and validation dataset
727726
train_loader = self._dataloder(trainimage, trainmask, True)
728727
val_loader = self._dataloder(validationimage, validationmask)
@@ -748,7 +747,6 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
748747
# y should tensor with shape (N,C,W,H),
749748
# if have mutil label y should one-hot,if only one label,the C is one
750749
y = batch['label']
751-
y = F.one_hot(y, self.numclass)
752750
# send the input to the device
753751
x, y = x.to(self.device), y.to(self.device)
754752
# perform a forward pass and calculate the training loss and accu
@@ -775,7 +773,6 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
775773
x = batch['image']
776774
# y should tensor with shape (N,C,W,H)
777775
y = batch['label']
778-
y = F.one_hot(y, self.numclass)
779776
# send the input to the device
780777
(x, y) = (x.to(self.device), y.to(self.device))
781778
# make the predictions and calculate the validation loss
@@ -790,6 +787,7 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
790787
avgValidationLoss = torch.mean(torch.stack(totalValidationLoss))
791788
avgTrainAccu = torch.mean(torch.stack(totalTrainAccu))
792789
avgValidationAccu = torch.mean(torch.stack(totalValiadtionAccu))
790+
lr_scheduler.step(avgValidationLoss)
793791
# 4.6、update our training history
794792
H["train_loss"].append(avgTrainLoss.cpu().detach().numpy())
795793
H["valdation_loss"].append(avgValidationLoss.cpu().detach().numpy())

model/modelUnet.py

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
9999
showpixelvalue = showpixelvalue // (self.numclass - 1)
100100
# 1、initialize loss function and optimizer
101101
lossFunc = self._loss_function(self.loss_name)
102-
opt = optim.Adam(self.model.parameters(), lr=lr)
102+
opt = optim.Adam(self.model.parameters(), lr=lr, weight_decay=1e-4)
103+
lr_scheduler = optim.lr_scheduler.ReduceLROnPlateau(opt, 'min', patience=2, verbose=True)
103104
# 2、load data train and validation dataset
104105
train_loader = self._dataloder(trainimage, trainmask, True)
105106
val_loader = self._dataloder(validationimage, validationmask)
@@ -171,6 +172,7 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
171172
avgValidationLoss = torch.mean(torch.stack(totalValidationLoss))
172173
avgTrainAccu = torch.mean(torch.stack(totalTrainAccu))
173174
avgValidationAccu = torch.mean(torch.stack(totalValiadtionAccu))
175+
lr_scheduler.step(avgValidationLoss)
174176
# 4.6、update our training history
175177
H["train_loss"].append(avgTrainLoss.cpu().detach().numpy())
176178
H["valdation_loss"].append(avgValidationLoss.cpu().detach().numpy())
@@ -316,7 +318,8 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
316318
showpixelvalue = showpixelvalue // (self.numclass - 1)
317319
# 1、initialize loss function and optimizer
318320
lossFunc = self._loss_function(self.loss_name)
319-
opt = optim.Adam(self.model.parameters(), lr=lr)
321+
opt = optim.Adam(self.model.parameters(), lr=lr, weight_decay=1e-4)
322+
lr_scheduler = optim.lr_scheduler.ReduceLROnPlateau(opt, 'min', patience=2, verbose=True)
320323
# 2、load data train and validation dataset
321324
train_loader = self._dataloder(trainimage, trainmask, True)
322325
val_loader = self._dataloder(validationimage, validationmask)
@@ -342,13 +345,6 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
342345
# y should tensor with shape (N,C,W,H),
343346
# if have mutil label y should one-hot,if only one label,the C is one
344347
y = batch['label']
345-
# one-hot encoding
346-
# y tensor with shape (N,W,H)
347-
y = torch.squeeze(y, dim=1)
348-
# y tensor with shape (N,W,H,C)
349-
y = F.one_hot(y, self.numclass)
350-
# y tensor with shape (N,C,W,H)
351-
y = y.permute(0, 3, 1, 2)
352348
# send the input to the device
353349
x, y = x.to(self.device), y.to(self.device)
354350
# perform a forward pass and calculate the training loss and accu
@@ -376,13 +372,6 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
376372
x = batch['image']
377373
# y should tensor with shape (N,C,W,H)
378374
y = batch['label']
379-
# one-hot encoding
380-
# y tensor with shape (N,W,H)
381-
y = torch.squeeze(y, dim=1)
382-
# y tensor with shape (N,W,H,C)
383-
y = F.one_hot(y, self.numclass)
384-
# y tensor with shape (N,C,W,H)
385-
y = y.permute(0, 3, 1, 2)
386375
# send the input to the device
387376
(x, y) = (x.to(self.device), y.to(self.device))
388377
# make the predictions and calculate the validation loss
@@ -399,6 +388,7 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
399388
avgValidationLoss = torch.mean(torch.stack(totalValidationLoss))
400389
avgTrainAccu = torch.mean(torch.stack(totalTrainAccu))
401390
avgValidationAccu = torch.mean(torch.stack(totalValiadtionAccu))
391+
lr_scheduler.step(avgValidationLoss)
402392
# 4.6、update our training history
403393
H["train_loss"].append(avgTrainLoss.cpu().detach().numpy())
404394
H["valdation_loss"].append(avgValidationLoss.cpu().detach().numpy())
@@ -549,7 +539,8 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
549539
showpixelvalue = showpixelvalue // (self.numclass - 1)
550540
# 1、initialize loss function and optimizer
551541
lossFunc = self._loss_function(self.loss_name)
552-
opt = optim.Adam(self.model.parameters(), lr=lr)
542+
opt = optim.Adam(self.model.parameters(), lr=lr, weight_decay=1e-4)
543+
lr_scheduler = optim.lr_scheduler.ReduceLROnPlateau(opt, 'min', patience=2, verbose=True)
553544
# 2、load data train and validation dataset
554545
train_loader = self._dataloder(trainimage, trainmask, True)
555546
val_loader = self._dataloder(validationimage, validationmask)
@@ -621,6 +612,7 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
621612
avgValidationLoss = torch.mean(torch.stack(totalValidationLoss))
622613
avgTrainAccu = torch.mean(torch.stack(totalTrainAccu))
623614
avgValidationAccu = torch.mean(torch.stack(totalValiadtionAccu))
615+
lr_scheduler.step(avgValidationLoss)
624616
# 4.6、update our training history
625617
H["train_loss"].append(avgTrainLoss.cpu().detach().numpy())
626618
H["valdation_loss"].append(avgValidationLoss.cpu().detach().numpy())
@@ -780,7 +772,8 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
780772
showpixelvalue = showpixelvalue // (self.numclass - 1)
781773
# 1、initialize loss function and optimizer
782774
lossFunc = self._loss_function(self.loss_name)
783-
opt = optim.AdamW(self.model.parameters(), lr=lr, weight_decay=1e-4)
775+
opt = optim.Adam(self.model.parameters(), lr=lr, weight_decay=1e-4)
776+
lr_scheduler = optim.lr_scheduler.ReduceLROnPlateau(opt, 'min', patience=2, verbose=True)
784777
# 2、load data train and validation dataset
785778
train_loader = self._dataloder(trainimage, trainmask, True)
786779
val_loader = self._dataloder(validationimage, validationmask)
@@ -848,6 +841,7 @@ def trainprocess(self, trainimage, trainmask, validationimage, validationmask, m
848841
avgValidationLoss = torch.mean(torch.stack(totalValidationLoss))
849842
avgTrainAccu = torch.mean(torch.stack(totalTrainAccu))
850843
avgValidationAccu = torch.mean(torch.stack(totalValiadtionAccu))
844+
lr_scheduler.step(avgValidationLoss)
851845
# 4.6、update our training history
852846
H["train_loss"].append(avgTrainLoss.cpu().detach().numpy())
853847
H["valdation_loss"].append(avgValidationLoss.cpu().detach().numpy())

0 commit comments

Comments
 (0)