-
-
Notifications
You must be signed in to change notification settings - Fork 507
/
train_config.yaml
175 lines (168 loc) · 6.58 KB
/
train_config.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# Sample configuration file for training a 3D U-Net on a task of predicting the nuclei in 3D stack from the lightsheet
# microscope. Training done with Binary Cross-Entropy.
# Training and validation data can be downloaded from: https://osf.io/thxzn/
# model configuration
model:
# model class, e.g. UNet3D, ResidualUNet3D
name: UNet3D
# number of input channels to the model
in_channels: 1
# number of output channels
out_channels: 1
# determines the order of operators in a single layer (gcr - GroupNorm+Conv3d+ReLU)
layer_order: gcr
# number of features at each level of the U-Net
f_maps: [32, 64, 128, 256]
# number of groups in the groupnorm
num_groups: 8
# apply element-wise nn.Sigmoid after the final 1x1 convolution, otherwise apply nn.Softmax
# this is only relevant during inference, during training the network outputs logits and it is up to the loss function
# to normalize with Sigmoid or Softmax
final_sigmoid: true
# if True applies the final normalization layer (sigmoid or softmax), otherwise the networks returns the output from the final convolution layer; use False for regression problems, e.g. de-noising
is_segmentation: true
# trainer configuration
trainer:
# path to the checkpoint directory
checkpoint_dir: CHECKPOINT_DIR
# path to latest checkpoint; if provided the training will be resumed from that checkpoint
resume: null
# path to the best_checkpoint.pytorch; to be used for fine-tuning the model with additional ground truth
# make sure to decrease the learning rate in the optimizer config accordingly
pre_trained: null
# how many iterations between validations
validate_after_iters: 1000
# how many iterations between tensorboard logging
log_after_iters: 100
# max number of epochs
max_num_epochs: 200
# max number of iterations
max_num_iterations: 60000
# model with higher eval score is considered better
eval_score_higher_is_better: True
# loss function configuration
loss:
# use BCE loss for training
name: BCEWithLogitsLoss
# skip last channel in the target containing the labeled nuclei instances
skip_last_target: true
# optimizer configuration
optimizer:
# initial learning rate
learning_rate: 0.0002
# weight decay
weight_decay: 0.00001
# evaluation metric
eval_metric:
# use average precision metric
name: BlobsAveragePrecision
# values on which the nuclei probability maps will be thresholded for AP computation
thresholds: [0.4, 0.5, 0.6, 0.7, 0.8]
metric: 'ap'
# learning rate scheduler configuration
lr_scheduler:
# reduce learning rate when evaluation metric plateaus
name: ReduceLROnPlateau
# use 'max' if eval_score_higher_is_better=True, 'min' otherwise
mode: max
# factor by which learning rate will be reduced
factor: 0.2
# number of *validation runs* with no improvement after which learning rate will be reduced
patience: 8
# data loaders configuration
loaders:
# class of the HDF5 dataset, currently StandardHDF5Dataset and LazyHDF5Dataset are supported.
# When using LazyHDF5Dataset make sure to set `num_workers = 1`, due to a bug in h5py which corrupts the data
# when reading from multiple threads.
dataset: StandardHDF5Dataset
# batch dimension; if number of GPUs is N > 1, then a batch_size of N * batch_size will automatically be taken for DataParallel
batch_size: 1
# how many subprocesses to use for data loading
num_workers: 8
# path to the raw data within the H5
raw_internal_path: raw
# path to the the label data within the H5
label_internal_path: label
# path to the pixel-wise weight map withing the H5 if present
weight_internal_path: null
# configuration of the train loader
train:
# paths to the training datasets
file_paths:
- TRAIN_DIR
# SliceBuilder configuration, i.e. how to iterate over the input volume patch-by-patch
slice_builder:
name: FilterSliceBuilder
# train patch size given to the network (adapt to fit in your GPU mem, generally the bigger patch the better)
patch_shape: [80, 170, 170]
# train stride between patches
stride_shape: [20, 40, 40]
# minimum volume of the labels in the patch
threshold: 0.01
# probability of accepting patches which do not fulfil the threshold criterion
slack_acceptance: 0.01
transformer:
raw:
# subtract mean and divide by std dev
- name: Standardize
# randomly flips the volume in one of the axis
- name: RandomFlip
# randomly rotates the volume with 90 deg across a randomly chosen plane
- name: RandomRotate90
- name: RandomRotate
# rotate only in ZY plane due to anisotropy
axes: [[2, 1]]
# rotates by choosing random angle from [-30, 30] deg
angle_spectrum: 30
mode: reflect
- name: ElasticDeformation
spline_order: 3
- name: ToTensor
expand_dims: true
label:
- name: RandomFlip
- name: RandomRotate90
- name: RandomRotate
# rotate only in ZY plane due to anisotropy
axes: [[2, 1]]
angle_spectrum: 30
mode: reflect
- name: ElasticDeformation
spline_order: 0
# convert target volume to binary mask
- name: BlobsToMask
# append ground truth labels in the last channel of the target for evaluation metric computation
append_label: true
# if 'true' appends boundary mask as a 2nd channel of the target; boundaries are computed using the 'find_boundaries()' function from skimage
# learning the boundaries as a 2nd objective sometimes helps with the nuclei mask prediction
boundary: false
- name: ToTensor
expand_dims: false
# configuration of the val loader
val:
# paths to the val datasets
file_paths:
- VAL_DIR
# SliceBuilder configuration, i.e. how to iterate over the input volume patch-by-patch
slice_builder:
name: FilterSliceBuilder
# train patch size given to the network (adapt to fit in your GPU mem, generally the bigger patch the better)
patch_shape: [80, 170, 170]
# train stride between patches
stride_shape: [80, 170, 170]
# minimum volume of the labels in the patch
threshold: 0.01
# probability of accepting patches which do not fulfil the threshold criterion
slack_acceptance: 0.01
# data augmentation
transformer:
raw:
- name: Standardize
- name: ToTensor
expand_dims: true
label:
- name: BlobsToMask
append_label: true
boundary: false
- name: ToTensor
expand_dims: false