Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Andrei-Claudiu Roibu
BrainMapper
Commits
7d97cff9
Commit
7d97cff9
authored
Apr 14, 2020
by
Andrei Roibu
Browse files
rewrote 3D network, fixed memory bleed issues
parent
a868b271
Changes
1
Hide whitespace changes
Inline
Side-by-side
BrainMapperUNet.py
View file @
7d97cff9
...
@@ -83,24 +83,47 @@ class BrainMapperUNet(nn.Module):
...
@@ -83,24 +83,47 @@ class BrainMapperUNet(nn.Module):
Y_encoder_1
,
Y_np1
,
pool_indices1
=
self
.
encoderBlock1
.
forward
(
X
)
Y_encoder_1
,
Y_np1
,
pool_indices1
=
self
.
encoderBlock1
.
forward
(
X
)
Y_encoder_2
,
Y_np2
,
pool_indices2
=
self
.
encoderBlock2
.
forward
(
Y_encoder_2
,
Y_np2
,
pool_indices2
=
self
.
encoderBlock2
.
forward
(
Y_encoder_1
)
Y_encoder_1
)
del
Y_encoder_1
Y_encoder_3
,
Y_np3
,
pool_indices3
=
self
.
encoderBlock3
.
forward
(
Y_encoder_3
,
Y_np3
,
pool_indices3
=
self
.
encoderBlock3
.
forward
(
Y_encoder_2
)
Y_encoder_2
)
del
Y_encoder_2
Y_encoder_4
,
Y_np4
,
pool_indices4
=
self
.
encoderBlock4
.
forward
(
Y_encoder_4
,
Y_np4
,
pool_indices4
=
self
.
encoderBlock4
.
forward
(
Y_encoder_3
)
Y_encoder_3
)
del
Y_encoder_3
Y_bottleNeck
=
self
.
bottleneck
.
forward
(
Y_encoder_4
)
Y_bottleNeck
=
self
.
bottleneck
.
forward
(
Y_encoder_4
)
del
Y_encoder_4
Y_decoder_1
=
self
.
decoderBlock1
.
forward
(
Y_decoder_1
=
self
.
decoderBlock1
.
forward
(
Y_bottleNeck
,
Y_np4
,
pool_indices4
)
Y_bottleNeck
,
Y_np4
,
pool_indices4
)
del
Y_bottleNeck
,
Y_np4
,
pool_indices4
Y_decoder_2
=
self
.
decoderBlock2
.
forward
(
Y_decoder_2
=
self
.
decoderBlock2
.
forward
(
Y_decoder_1
,
Y_np3
,
pool_indices3
)
Y_decoder_1
,
Y_np3
,
pool_indices3
)
del
Y_decoder_1
,
Y_np3
,
pool_indices3
Y_decoder_3
=
self
.
decoderBlock3
.
forward
(
Y_decoder_3
=
self
.
decoderBlock3
.
forward
(
Y_decoder_2
,
Y_np2
,
pool_indices2
)
Y_decoder_2
,
Y_np2
,
pool_indices2
)
del
Y_decoder_2
,
Y_np2
,
pool_indices2
Y_decoder_4
=
self
.
decoderBlock4
.
forwrad
(
Y_decoder_4
=
self
.
decoderBlock4
.
forwrad
(
Y_decoder_3
,
Y_np1
,
pool_indices1
)
Y_decoder_3
,
Y_np1
,
pool_indices1
)
del
Y_decoder_3
,
Y_np1
,
pool_indices1
probability_map
=
self
.
classifier
.
forward
(
Y_decoder_4
)
probability_map
=
self
.
classifier
.
forward
(
Y_decoder_4
)
del
Y_decoder_4
return
probability_map
return
probability_map
def
save
(
self
,
path
):
def
save
(
self
,
path
):
...
@@ -191,6 +214,189 @@ class BrainMapperUNet3D(nn.Module):
...
@@ -191,6 +214,189 @@ class BrainMapperUNet3D(nn.Module):
probability_map (torch.tensor): Output forward passed tensor through the U-net block
probability_map (torch.tensor): Output forward passed tensor through the U-net block
"""
"""
def
__init__
(
self
,
parameters
):
super
(
BrainMapperUNet3D
,
self
).
__init__
()
self
.
encoderBlock1
=
EncoderBlock3D
(
parameters
)
parameters
[
'input_channels'
]
=
parameters
[
'output_channels'
]
parameters
[
'output_channels'
]
=
parameters
[
'output_channels'
]
*
2
self
.
encoderBlock2
=
EncoderBlock3D
(
parameters
)
parameters
[
'input_channels'
]
=
parameters
[
'output_channels'
]
parameters
[
'output_channels'
]
=
parameters
[
'output_channels'
]
*
2
self
.
encoderBlock3
=
EncoderBlock3D
(
parameters
)
parameters
[
'input_channels'
]
=
parameters
[
'output_channels'
]
parameters
[
'output_channels'
]
=
parameters
[
'output_channels'
]
*
2
self
.
encoderBlock4
=
EncoderBlock3D
(
parameters
)
parameters
[
'input_channels'
]
=
parameters
[
'output_channels'
]
parameters
[
'output_channels'
]
=
parameters
[
'output_channels'
]
*
2
self
.
bottleneck
=
ConvolutionalBlock3D
(
parameters
)
parameters
[
'input_channels'
]
=
parameters
[
'output_channels'
]
parameters
[
'output_channels'
]
=
parameters
[
'output_channels'
]
//
2
self
.
decoderBlock1
=
DecoderBlock3D
(
parameters
)
parameters
[
'input_channels'
]
=
parameters
[
'output_channels'
]
parameters
[
'output_channels'
]
=
parameters
[
'output_channels'
]
//
2
self
.
decoderBlock2
=
DecoderBlock3D
(
parameters
)
parameters
[
'input_channels'
]
=
parameters
[
'output_channels'
]
parameters
[
'output_channels'
]
=
parameters
[
'output_channels'
]
//
2
self
.
decoderBlock3
=
DecoderBlock3D
(
parameters
)
parameters
[
'input_channels'
]
=
parameters
[
'output_channels'
]
parameters
[
'output_channels'
]
=
parameters
[
'output_channels'
]
//
2
self
.
decoderBlock4
=
DecoderBlock3D
(
parameters
)
parameters
[
'input_channels'
]
=
parameters
[
'output_channels'
]
self
.
classifier
=
ClassifierBlock3D
(
parameters
)
def
forward
(
self
,
X
):
"""Forward pass for 3D U-net
Function computing the forward pass through the 3D U-Net
The input to the function is the dMRI map
Args:
X (torch.tensor): Input dMRI map, shape = (N x C x D x H x W)
Returns:
probability_map (torch.tensor): Output forward passed tensor through the U-net block
"""
Y_encoder_1
,
Y_np1
,
pool_indices1
=
self
.
encoderBlock1
.
forward
(
X
)
Y_encoder_2
,
Y_np2
,
pool_indices2
=
self
.
encoderBlock2
.
forward
(
Y_encoder_1
)
del
Y_encoder_1
Y_encoder_3
,
Y_np3
,
pool_indices3
=
self
.
encoderBlock3
.
forward
(
Y_encoder_2
)
del
Y_encoder_2
Y_encoder_4
,
Y_np4
,
pool_indices4
=
self
.
encoderBlock4
.
forward
(
Y_encoder_3
)
del
Y_encoder_3
Y_bottleNeck
=
self
.
bottleneck
.
forward
(
Y_encoder_4
)
del
Y_encoder_4
Y_decoder_1
=
self
.
decoderBlock1
.
forward
(
Y_bottleNeck
,
Y_np4
,
pool_indices4
)
del
Y_bottleNeck
,
Y_np4
,
pool_indices4
Y_decoder_2
=
self
.
decoderBlock2
.
forward
(
Y_decoder_1
,
Y_np3
,
pool_indices3
)
del
Y_decoder_1
,
Y_np3
,
pool_indices3
Y_decoder_3
=
self
.
decoderBlock3
.
forward
(
Y_decoder_2
,
Y_np2
,
pool_indices2
)
del
Y_decoder_2
,
Y_np2
,
pool_indices2
Y_decoder_4
=
self
.
decoderBlock4
.
forwrad
(
Y_decoder_3
,
Y_np1
,
pool_indices1
)
del
Y_decoder_3
,
Y_np1
,
pool_indices1
probability_map
=
self
.
classifier
.
forward
(
Y_decoder_4
)
del
Y_decoder_4
return
probability_map
def
save
(
self
,
path
):
"""Model Saver
Function saving the model with all its parameters to a given path.
The path must end with a *.model argument.
Args:
path (str): Path string
"""
print
(
"Saving Model... {}"
.
format
(
path
))
torch
.
save
(
self
,
path
)
@
property
def
test_if_cuda
(
self
):
"""Cuda Test
This function tests if the model parameters are allocated to a CUDA enabled GPU.
Returns:
bool: Flag indicating True if the tensor is stored on the GPU and Flase otherwhise
"""
return
next
(
self
.
parameters
()).
is_cuda
def
predict
(
self
,
X
,
device
=
0
):
"""Post-training Output Prediction
This function predicts the output of the of the U-net post-training
Args:
X (torch.tensor): input dMRI volume
device (int/str): Device type used for training (int - GPU id, str- CPU)
Returns:
prediction (ndarray): predicted output after training
"""
self
.
eval
()
# PyToch module setting network to evaluation mode
if
type
(
X
)
is
np
.
ndarray
:
X
=
torch
.
tensor
(
X
,
requires_grad
=
False
).
type
(
torch
.
FloatTensor
)
elif
type
(
X
)
is
torch
.
Tensor
and
not
X
.
is_cuda
:
X
=
X
.
type
(
torch
.
FloatTensor
).
cuda
(
device
,
non_blocking
=
True
)
# .cuda() call transfers the densor from the CPU to the GPU if that is the case.
# Non-blocking argument lets the caller bypas synchronization when necessary
with
torch
.
no_grad
():
# Causes operations to have no gradients
output
=
self
.
forward
(
X
)
_
,
idx
=
torch
.
max
(
output
,
1
)
# We retrieve the tensor held by idx (.data), and map it to a cpu as an ndarray
idx
=
idx
.
data
.
cpu
().
numpy
()
prediction
=
np
.
squeeze
(
idx
)
del
X
,
output
,
idx
return
prediction
# DEPRECATED ARCHITECTURES!
class
BrainMapperUNet3D_Simple
(
nn
.
Module
):
"""Architecture class BrainMapper 3D U-net.
This class contains the pytorch implementation of the U-net architecture underpinning the BrainMapper project.
Args:
parameters (dict): Contains information relevant parameters
parameters = {
'kernel_heigth': 5
'kernel_width': 5
'kernel_depth': 5
'kernel_classification': 1
'input_channels': 1
'output_channels': 64
'convolution_stride': 1
'dropout': 0.2
'pool_kernel_size': 2
'pool_stride': 2
'up_mode': 'upconv'
'number_of_classes': 1
}
Returns:
probability_map (torch.tensor): Output forward passed tensor through the U-net block
"""
def
__init__
(
self
,
parameters
):
def
__init__
(
self
,
parameters
):
super
(
BrainMapperUNet3D
,
self
).
__init__
()
super
(
BrainMapperUNet3D
,
self
).
__init__
()
...
@@ -226,25 +432,50 @@ class BrainMapperUNet3D(nn.Module):
...
@@ -226,25 +432,50 @@ class BrainMapperUNet3D(nn.Module):
probability_map (torch.tensor): Output forward passed tensor through the U-net block
probability_map (torch.tensor): Output forward passed tensor through the U-net block
"""
"""
Y_encoder_1
,
Y_np1
,
pool_indices1
=
self
.
encoderBlock1
.
forward
(
X
)
Y_encoder_1
,
Y_np1
,
pool_indices1
=
self
.
encoderBlock1
.
forward
(
X
)
Y_encoder_2
,
Y_np2
,
pool_indices2
=
self
.
encoderBlock2
.
forward
(
Y_encoder_2
,
Y_np2
,
pool_indices2
=
self
.
encoderBlock2
.
forward
(
Y_encoder_1
)
Y_encoder_1
)
del
Y_encoder_1
Y_encoder_3
,
Y_np3
,
pool_indices3
=
self
.
encoderBlock3
.
forward
(
Y_encoder_3
,
Y_np3
,
pool_indices3
=
self
.
encoderBlock3
.
forward
(
Y_encoder_2
)
Y_encoder_2
)
del
Y_encoder_2
Y_encoder_4
,
Y_np4
,
pool_indices4
=
self
.
encoderBlock4
.
forward
(
Y_encoder_4
,
Y_np4
,
pool_indices4
=
self
.
encoderBlock4
.
forward
(
Y_encoder_3
)
Y_encoder_3
)
del
Y_encoder_3
Y_bottleNeck
=
self
.
bottleneck
.
forward
(
Y_encoder_4
)
Y_bottleNeck
=
self
.
bottleneck
.
forward
(
Y_encoder_4
)
del
Y_encoder_4
Y_decoder_1
=
self
.
decoderBlock1
.
forward
(
Y_decoder_1
=
self
.
decoderBlock1
.
forward
(
Y_bottleNeck
,
Y_np4
,
pool_indices4
)
Y_bottleNeck
,
Y_np4
,
pool_indices4
)
del
Y_bottleNeck
,
Y_np4
,
pool_indices4
Y_decoder_2
=
self
.
decoderBlock2
.
forward
(
Y_decoder_2
=
self
.
decoderBlock2
.
forward
(
Y_decoder_1
,
Y_np3
,
pool_indices3
)
Y_decoder_1
,
Y_np3
,
pool_indices3
)
del
Y_decoder_1
,
Y_np3
,
pool_indices3
Y_decoder_3
=
self
.
decoderBlock3
.
forward
(
Y_decoder_3
=
self
.
decoderBlock3
.
forward
(
Y_decoder_2
,
Y_np2
,
pool_indices2
)
Y_decoder_2
,
Y_np2
,
pool_indices2
)
del
Y_decoder_2
,
Y_np2
,
pool_indices2
Y_decoder_4
=
self
.
decoderBlock4
.
forwrad
(
Y_decoder_4
=
self
.
decoderBlock4
.
forwrad
(
Y_decoder_3
,
Y_np1
,
pool_indices1
)
Y_decoder_3
,
Y_np1
,
pool_indices1
)
del
Y_decoder_3
,
Y_np1
,
pool_indices1
probability_map
=
self
.
classifier
.
forward
(
Y_decoder_4
)
del
Y_decoder_4
probability_map
=
self
.
classifier
.
forward
(
Y_decoder_4
)
probability_map
=
self
.
classifier
.
forward
(
Y_decoder_4
)
return
probability_map
return
probability_map
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment