Skip to content

Commit d27bf09

Browse files
committed
Set default value for batch_size; tests pass in debug mode but segfault in optimized mode
1 parent 642b2f2 commit d27bf09

File tree

4 files changed

+23
-86
lines changed

4 files changed

+23
-86
lines changed

src/nf/nf_layer.f90

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ module nf_layer
3232
procedure :: set_params
3333
procedure :: init
3434
procedure :: print_info
35-
!procedure :: update
3635

3736
! Specific subroutines for different array ranks
3837
procedure, private :: backward_1d
@@ -154,20 +153,6 @@ module subroutine set_params(self, params)
154153
!! Parameters of this layer
155154
end subroutine set_params
156155

157-
!impure elemental module subroutine update(self, optimizer, batch_size)
158-
! !! Update the weights and biases on the layer using the stored
159-
! !! gradients (from backward passes), and flush those same stored
160-
! !! gradients to zero.
161-
! !! This changes the state of the layer.
162-
! !! Typically used only internally from the `network % update` method.
163-
! class(layer), intent(in out) :: self
164-
! !! Layer instance
165-
! class(optimizer_base_type), intent(in) :: optimizer
166-
! !! Optimizer instance to use
167-
! integer, intent(in), optional :: batch_size
168-
! !! Batch size (default 1)
169-
!end subroutine update
170-
171156
end interface
172157

173158
end module nf_layer

src/nf/nf_layer_submodule.f90

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -405,57 +405,4 @@ module subroutine set_params(self, params)
405405

406406
end subroutine set_params
407407

408-
409-
!impure elemental module subroutine update(self, optimizer, batch_size)
410-
! class(layer), intent(in out) :: self
411-
! class(optimizer_base_type), intent(in) :: optimizer
412-
! integer, intent(in), optional :: batch_size
413-
! integer :: batch_size_
414-
!
415-
! batch_size_ = 1
416-
! if (present(batch_size)) batch_size_ = batch_size
417-
!
418-
! select type (this_layer => self % p)
419-
! type is (dense_layer)
420-
!
421-
! ! Sum weight and bias gradients across images, if any
422-
! call co_sum(this_layer % dw)
423-
! call co_sum(this_layer % db)
424-
!
425-
! call optimizer % minimize( &
426-
! this_layer % weights, &
427-
! this_layer % dw / batch_size_ &
428-
! )
429-
! call optimizer % minimize( &
430-
! this_layer % biases, &
431-
! this_layer % db / batch_size_ &
432-
! )
433-
!
434-
! ! Reset gradients.
435-
! this_layer % dw = 0
436-
! this_layer % db = 0
437-
438-
! type is (conv2d_layer)
439-
440-
! ! Sum weight and bias gradients across images, if any
441-
! call co_sum(this_layer % dw)
442-
! call co_sum(this_layer % db)
443-
444-
! call optimizer % minimize( &
445-
! this_layer % kernel, &
446-
! this_layer % dw / batch_size_ &
447-
! )
448-
! call optimizer % minimize( &
449-
! this_layer % biases, &
450-
! this_layer % db / batch_size_ &
451-
! )
452-
453-
! ! Reset gradients.
454-
! this_layer % dw = 0
455-
! this_layer % db = 0
456-
457-
! end select
458-
459-
!end subroutine update
460-
461408
end submodule nf_layer_submodule

src/nf/nf_network_submodule.f90

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,7 @@ module subroutine update(self, optimizer, batch_size)
607607
class(optimizer_base_type), intent(in), optional :: optimizer
608608
integer, intent(in), optional :: batch_size
609609
class(optimizer_base_type), allocatable :: optimizer_
610+
integer :: batch_size_
610611
real, allocatable :: params(:)
611612
integer :: n
612613

@@ -623,14 +624,28 @@ module subroutine update(self, optimizer, batch_size)
623624
optimizer_ = sgd()
624625
end if
625626

626-
call optimizer_ % init(self % get_num_params())
627+
if (present(batch_size)) then
628+
batch_size_ = batch_size
629+
else
630+
batch_size_ = 1
631+
end if
627632

628-
!call self % layers % update(optimizer_, batch_size)
633+
call optimizer_ % init(self % get_num_params())
629634

630-
! TODO: Sync gradients across images if running in parallel.
635+
! Sum weight and bias gradients across images, if any
636+
do n = 2, size(self % layers)
637+
select type(this_layer => self % layers(n) % p)
638+
type is(dense_layer)
639+
call co_sum(this_layer % dw)
640+
call co_sum(this_layer % db)
641+
type is(conv2d_layer)
642+
call co_sum(this_layer % dw)
643+
call co_sum(this_layer % db)
644+
end select
645+
end do
631646

632647
params = self % get_params()
633-
call optimizer_ % minimize(params, self % get_gradients() / batch_size)
648+
call optimizer_ % minimize(params, self % get_gradients() / batch_size_)
634649
call self % set_params(params)
635650

636651
! Flush network gradients to zero.

src/nf/nf_optimizers.f90

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,23 +49,11 @@ end subroutine minimize
4949
procedure :: minimize => minimize_sgd
5050
end type sgd
5151

52-
!type :: gradients_dense
53-
! real, allocatable :: dw(:,:)
54-
! real, allocatable :: db(:)
55-
!end type gradients_dense
56-
57-
!type :: gradients_conv2d
58-
! real, allocatable :: dw(:,:,:,:)
59-
! real, allocatable :: db(:)
60-
!end type gradients_conv2d
61-
6252
type, extends(optimizer_base_type) :: rmsprop
6353
!! RMSProp optimizer
6454
real :: decay_rate = 0.9
6555
real :: epsilon = 1e-8
6656
real, allocatable :: rms_gradient(:)
67-
!type(gradients_dense), allocatable :: rms_dense(:)
68-
!type(gradients_conv2d), allocatable :: rms_conv2d(:)
6957
contains
7058
procedure :: init => init_rmsprop
7159
procedure :: minimize => minimize_rmsprop
@@ -92,10 +80,12 @@ pure subroutine minimize_sgd(self, param, gradient)
9280

9381
if (self % momentum > 0) then
9482
! Apply momentum update
95-
self % velocity = self % momentum * self % velocity - self % learning_rate * gradient
83+
self % velocity = self % momentum * self % velocity &
84+
- self % learning_rate * gradient
9685
if (self % nesterov) then
9786
! Apply Nesterov update
98-
param = param + self % momentum * self % velocity - self % learning_rate * gradient
87+
param = param + self % momentum * self % velocity &
88+
- self % learning_rate * gradient
9989
else
10090
param = param + self % velocity
10191
end if

0 commit comments

Comments
 (0)