Performs a forward pass of the model with the input tensors
WARNING: If requires_grad=.true. then any association between the output_tensors and Fortran arrays is lost. The output_tensors will instead point directly to the tensor objects outputted from the model in Torch. This is required to track gradients through any intermediate tensors (such as model weights) during backpropagation.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(torch_model), | intent(in) | :: | model |
Model |
||
| type(torch_tensor), | intent(in), | dimension(:) | :: | input_tensors |
Array of Input tensors |
|
| type(torch_tensor), | intent(in), | dimension(:) | :: | output_tensors |
Returned output tensors |
|
| logical, | intent(in), | optional | :: | requires_grad |
Whether gradients need to be computed for the created tensor |
subroutine torch_model_forward(model, input_tensors, output_tensors, requires_grad) use, intrinsic :: iso_c_binding, only : c_bool, c_ptr, c_int, c_loc type(torch_model), intent(in) :: model !! Model type(torch_tensor), intent(in), dimension(:) :: input_tensors !! Array of Input tensors type(torch_tensor), intent(in), dimension(:) :: output_tensors !! Returned output tensors logical, optional, intent(in) :: requires_grad !! Whether gradients need to be computed for the created tensor logical :: requires_grad_value !! Whether gradients need to be computed for the created tensor integer(ftorch_int) :: i integer(c_int) :: n_inputs integer(c_int) :: n_outputs type(c_ptr), dimension(size(input_tensors)), target :: input_ptrs type(c_ptr), dimension(size(output_tensors)), target :: output_ptrs interface subroutine torch_jit_model_forward_c(model_c, input_tensors_c, n_inputs_c, & output_tensors_c, n_outputs_c, requires_grad_c) & bind(c, name = 'torch_jit_module_forward') use, intrinsic :: iso_c_binding, only : c_bool, c_ptr, c_int implicit none type(c_ptr), value, intent(in) :: model_c type(c_ptr), value, intent(in) :: input_tensors_c integer(c_int), value, intent(in) :: n_inputs_c type(c_ptr), value, intent(in) :: output_tensors_c integer(c_int), value, intent(in) :: n_outputs_c logical(c_bool), value, intent(in) :: requires_grad_c end subroutine torch_jit_model_forward_c end interface n_inputs = size(input_tensors) n_outputs = size(output_tensors) if (.not. present(requires_grad)) then requires_grad_value = .false. else requires_grad_value = requires_grad end if ! Assign array of pointers to the input tensors do i = 1, n_inputs input_ptrs(i) = input_tensors(i)%p end do ! Assign array of pointers to the output tensors do i = 1, n_outputs output_ptrs(i) = output_tensors(i)%p end do call torch_jit_model_forward_c(model%p, c_loc(input_ptrs), n_inputs, & c_loc(output_ptrs), n_outputs, & logical(requires_grad_value, c_bool)) end subroutine torch_model_forward