import os
os.environ['CUDA_VISIBLE_DEVICES'] = "0"
from fastai.vision.all import *
from fastcore.parallel import *
path = Path()
trn_path = path/'train_images'
arch ='convnext_tiny_in22k'
df = pd.read_csv(path/'train.csv')
df
image_id label variety age
0 100330.jpg bacterial_leaf_blight ADT45 45
1 100365.jpg bacterial_leaf_blight ADT45 45
2 100382.jpg bacterial_leaf_blight ADT45 45
3 100632.jpg bacterial_leaf_blight ADT45 45
4 101918.jpg bacterial_leaf_blight ADT45 45
... ... ... ... ...
10402 107607.jpg tungro Zonal 55
10403 107811.jpg tungro Zonal 55
10404 108547.jpg tungro Zonal 55
10405 110245.jpg tungro Zonal 55
10406 110381.jpg tungro Zonal 55

10407 rows × 4 columns

dls = ImageDataLoaders.from_folder(
    trn_path, valid_pct=.2, seed=42, item_tfms=Resize(224),batch=aug_transforms(size=224, min_scale= 0.75),bs=32)   
learn = vision_learner(dls, arch, metrics=error_rate)
learn.fine_tune(1, 0.02)
epoch train_loss valid_loss error_rate time
0 1.392303 0.888152 0.271985 00:38
epoch train_loss valid_loss error_rate time
0 0.507126 0.295987 0.097069 01:55

Model and the summary

m = learn.model
m
Sequential(
  (0): TimmBody(
    (model): ConvNeXt(
      (stem): Sequential(
        (0): Conv2d(3, 96, kernel_size=(4, 4), stride=(4, 4))
        (1): LayerNorm2d((96,), eps=1e-06, elementwise_affine=True)
      )
      (stages): Sequential(
        (0): ConvNeXtStage(
          (downsample): Identity()
          (blocks): Sequential(
            (0): ConvNeXtBlock(
              (conv_dw): Conv2d(96, 96, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=96)
              (norm): LayerNorm((96,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=96, out_features=384, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=384, out_features=96, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (1): ConvNeXtBlock(
              (conv_dw): Conv2d(96, 96, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=96)
              (norm): LayerNorm((96,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=96, out_features=384, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=384, out_features=96, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (2): ConvNeXtBlock(
              (conv_dw): Conv2d(96, 96, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=96)
              (norm): LayerNorm((96,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=96, out_features=384, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=384, out_features=96, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
          )
        )
        (1): ConvNeXtStage(
          (downsample): Sequential(
            (0): LayerNorm2d((96,), eps=1e-06, elementwise_affine=True)
            (1): Conv2d(96, 192, kernel_size=(2, 2), stride=(2, 2))
          )
          (blocks): Sequential(
            (0): ConvNeXtBlock(
              (conv_dw): Conv2d(192, 192, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=192)
              (norm): LayerNorm((192,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=192, out_features=768, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=768, out_features=192, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (1): ConvNeXtBlock(
              (conv_dw): Conv2d(192, 192, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=192)
              (norm): LayerNorm((192,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=192, out_features=768, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=768, out_features=192, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (2): ConvNeXtBlock(
              (conv_dw): Conv2d(192, 192, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=192)
              (norm): LayerNorm((192,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=192, out_features=768, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=768, out_features=192, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
          )
        )
        (2): ConvNeXtStage(
          (downsample): Sequential(
            (0): LayerNorm2d((192,), eps=1e-06, elementwise_affine=True)
            (1): Conv2d(192, 384, kernel_size=(2, 2), stride=(2, 2))
          )
          (blocks): Sequential(
            (0): ConvNeXtBlock(
              (conv_dw): Conv2d(384, 384, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=384)
              (norm): LayerNorm((384,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=384, out_features=1536, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=1536, out_features=384, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (1): ConvNeXtBlock(
              (conv_dw): Conv2d(384, 384, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=384)
              (norm): LayerNorm((384,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=384, out_features=1536, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=1536, out_features=384, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (2): ConvNeXtBlock(
              (conv_dw): Conv2d(384, 384, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=384)
              (norm): LayerNorm((384,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=384, out_features=1536, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=1536, out_features=384, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (3): ConvNeXtBlock(
              (conv_dw): Conv2d(384, 384, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=384)
              (norm): LayerNorm((384,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=384, out_features=1536, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=1536, out_features=384, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (4): ConvNeXtBlock(
              (conv_dw): Conv2d(384, 384, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=384)
              (norm): LayerNorm((384,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=384, out_features=1536, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=1536, out_features=384, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (5): ConvNeXtBlock(
              (conv_dw): Conv2d(384, 384, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=384)
              (norm): LayerNorm((384,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=384, out_features=1536, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=1536, out_features=384, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (6): ConvNeXtBlock(
              (conv_dw): Conv2d(384, 384, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=384)
              (norm): LayerNorm((384,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=384, out_features=1536, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=1536, out_features=384, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (7): ConvNeXtBlock(
              (conv_dw): Conv2d(384, 384, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=384)
              (norm): LayerNorm((384,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=384, out_features=1536, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=1536, out_features=384, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (8): ConvNeXtBlock(
              (conv_dw): Conv2d(384, 384, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=384)
              (norm): LayerNorm((384,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=384, out_features=1536, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=1536, out_features=384, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
          )
        )
        (3): ConvNeXtStage(
          (downsample): Sequential(
            (0): LayerNorm2d((384,), eps=1e-06, elementwise_affine=True)
            (1): Conv2d(384, 768, kernel_size=(2, 2), stride=(2, 2))
          )
          (blocks): Sequential(
            (0): ConvNeXtBlock(
              (conv_dw): Conv2d(768, 768, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=768)
              (norm): LayerNorm((768,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=768, out_features=3072, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=3072, out_features=768, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (1): ConvNeXtBlock(
              (conv_dw): Conv2d(768, 768, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=768)
              (norm): LayerNorm((768,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=768, out_features=3072, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=3072, out_features=768, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
            (2): ConvNeXtBlock(
              (conv_dw): Conv2d(768, 768, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), groups=768)
              (norm): LayerNorm((768,), eps=1e-06, elementwise_affine=True)
              (mlp): Mlp(
                (fc1): Linear(in_features=768, out_features=3072, bias=True)
                (act): GELU()
                (drop1): Dropout(p=0.0, inplace=False)
                (fc2): Linear(in_features=3072, out_features=768, bias=True)
                (drop2): Dropout(p=0.0, inplace=False)
              )
              (drop_path): Identity()
            )
          )
        )
      )
      (norm_pre): Identity()
      (head): Sequential(
        (global_pool): SelectAdaptivePool2d (pool_type=avg, flatten=Identity())
        (norm): LayerNorm2d((768,), eps=1e-06, elementwise_affine=True)
        (flatten): Flatten(start_dim=1, end_dim=-1)
        (drop): Dropout(p=0.0, inplace=False)
        (fc): Identity()
      )
    )
  )
  (1): Sequential(
    (0): AdaptiveConcatPool2d(
      (ap): AdaptiveAvgPool2d(output_size=1)
      (mp): AdaptiveMaxPool2d(output_size=1)
    )
    (1): Flatten(full=False)
    (2): BatchNorm1d(1536, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (3): Dropout(p=0.25, inplace=False)
    (4): Linear(in_features=1536, out_features=512, bias=False)
    (5): ReLU(inplace=True)
    (6): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): Dropout(p=0.5, inplace=False)
    (8): Linear(in_features=512, out_features=10, bias=False)
  )
)
learn.summary()
Sequential (Input shape: 32 x 3 x 224 x 224)
============================================================================
Layer (type)         Output Shape         Param #    Trainable 
============================================================================
                     32 x 96 x 56 x 56   
Conv2d                                    4704       True      
LayerNorm2d                               192        True      
Identity                                                       
Conv2d                                    4800       True      
LayerNorm                                 192        True      
____________________________________________________________________________
                     32 x 56 x 56 x 384  
Linear                                    37248      True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 56 x 56 x 96   
Linear                                    36960      True      
Dropout                                                        
Identity                                                       
Conv2d                                    4800       True      
LayerNorm                                 192        True      
____________________________________________________________________________
                     32 x 56 x 56 x 384  
Linear                                    37248      True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 56 x 56 x 96   
Linear                                    36960      True      
Dropout                                                        
Identity                                                       
Conv2d                                    4800       True      
LayerNorm                                 192        True      
____________________________________________________________________________
                     32 x 56 x 56 x 384  
Linear                                    37248      True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 56 x 56 x 96   
Linear                                    36960      True      
Dropout                                                        
Identity                                                       
LayerNorm2d                               192        True      
____________________________________________________________________________
                     32 x 192 x 28 x 28  
Conv2d                                    73920      True      
Conv2d                                    9600       True      
LayerNorm                                 384        True      
____________________________________________________________________________
                     32 x 28 x 28 x 768  
Linear                                    148224     True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 28 x 28 x 192  
Linear                                    147648     True      
Dropout                                                        
Identity                                                       
Conv2d                                    9600       True      
LayerNorm                                 384        True      
____________________________________________________________________________
                     32 x 28 x 28 x 768  
Linear                                    148224     True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 28 x 28 x 192  
Linear                                    147648     True      
Dropout                                                        
Identity                                                       
Conv2d                                    9600       True      
LayerNorm                                 384        True      
____________________________________________________________________________
                     32 x 28 x 28 x 768  
Linear                                    148224     True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 28 x 28 x 192  
Linear                                    147648     True      
Dropout                                                        
Identity                                                       
LayerNorm2d                               384        True      
____________________________________________________________________________
                     32 x 384 x 14 x 14  
Conv2d                                    295296     True      
Conv2d                                    19200      True      
LayerNorm                                 768        True      
____________________________________________________________________________
                     32 x 14 x 14 x 1536 
Linear                                    591360     True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 14 x 14 x 384  
Linear                                    590208     True      
Dropout                                                        
Identity                                                       
Conv2d                                    19200      True      
LayerNorm                                 768        True      
____________________________________________________________________________
                     32 x 14 x 14 x 1536 
Linear                                    591360     True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 14 x 14 x 384  
Linear                                    590208     True      
Dropout                                                        
Identity                                                       
Conv2d                                    19200      True      
LayerNorm                                 768        True      
____________________________________________________________________________
                     32 x 14 x 14 x 1536 
Linear                                    591360     True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 14 x 14 x 384  
Linear                                    590208     True      
Dropout                                                        
Identity                                                       
Conv2d                                    19200      True      
LayerNorm                                 768        True      
____________________________________________________________________________
                     32 x 14 x 14 x 1536 
Linear                                    591360     True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 14 x 14 x 384  
Linear                                    590208     True      
Dropout                                                        
Identity                                                       
Conv2d                                    19200      True      
LayerNorm                                 768        True      
____________________________________________________________________________
                     32 x 14 x 14 x 1536 
Linear                                    591360     True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 14 x 14 x 384  
Linear                                    590208     True      
Dropout                                                        
Identity                                                       
Conv2d                                    19200      True      
LayerNorm                                 768        True      
____________________________________________________________________________
                     32 x 14 x 14 x 1536 
Linear                                    591360     True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 14 x 14 x 384  
Linear                                    590208     True      
Dropout                                                        
Identity                                                       
Conv2d                                    19200      True      
LayerNorm                                 768        True      
____________________________________________________________________________
                     32 x 14 x 14 x 1536 
Linear                                    591360     True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 14 x 14 x 384  
Linear                                    590208     True      
Dropout                                                        
Identity                                                       
Conv2d                                    19200      True      
LayerNorm                                 768        True      
____________________________________________________________________________
                     32 x 14 x 14 x 1536 
Linear                                    591360     True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 14 x 14 x 384  
Linear                                    590208     True      
Dropout                                                        
Identity                                                       
Conv2d                                    19200      True      
LayerNorm                                 768        True      
____________________________________________________________________________
                     32 x 14 x 14 x 1536 
Linear                                    591360     True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 14 x 14 x 384  
Linear                                    590208     True      
Dropout                                                        
Identity                                                       
LayerNorm2d                               768        True      
____________________________________________________________________________
                     32 x 768 x 7 x 7    
Conv2d                                    1180416    True      
Conv2d                                    38400      True      
LayerNorm                                 1536       True      
____________________________________________________________________________
                     32 x 7 x 7 x 3072   
Linear                                    2362368    True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 7 x 7 x 768    
Linear                                    2360064    True      
Dropout                                                        
Identity                                                       
Conv2d                                    38400      True      
LayerNorm                                 1536       True      
____________________________________________________________________________
                     32 x 7 x 7 x 3072   
Linear                                    2362368    True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 7 x 7 x 768    
Linear                                    2360064    True      
Dropout                                                        
Identity                                                       
Conv2d                                    38400      True      
LayerNorm                                 1536       True      
____________________________________________________________________________
                     32 x 7 x 7 x 3072   
Linear                                    2362368    True      
GELU                                                           
Dropout                                                        
____________________________________________________________________________
                     32 x 7 x 7 x 768    
Linear                                    2360064    True      
Dropout                                                        
Identity                                                       
Identity                                                       
____________________________________________________________________________
                     32 x 768 x 1 x 1    
AdaptiveAvgPool2d                                              
AdaptiveMaxPool2d                                              
____________________________________________________________________________
                     32 x 1536           
Flatten                                                        
BatchNorm1d                               3072       True      
Dropout                                                        
____________________________________________________________________________
                     32 x 512            
Linear                                    786432     True      
ReLU                                                           
BatchNorm1d                               1024       True      
Dropout                                                        
____________________________________________________________________________

Total params: 28,602,496
Total trainable params: 28,602,496
Total non-trainable params: 0

Optimizer used: <function Adam at 0x7fba154d2820>
Loss function: FlattenedLoss of CrossEntropyLoss()

Model unfrozen

Callbacks:
  - TrainEvalCallback
  - Recorder
  - ProgressCallback

What is in it?

h= m[1]
h
Sequential(
  (0): AdaptiveConcatPool2d(
    (ap): AdaptiveAvgPool2d(output_size=1)
    (mp): AdaptiveMaxPool2d(output_size=1)
  )
  (1): Flatten(full=False)
  (2): BatchNorm1d(1536, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (3): Dropout(p=0.25, inplace=False)
  (4): Linear(in_features=1536, out_features=512, bias=False)
  (5): ReLU(inplace=True)
  (6): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (7): Dropout(p=0.5, inplace=False)
  (8): Linear(in_features=512, out_features=10, bias=False)
)
ll =h[-1]
ll
Linear(in_features=512, out_features=10, bias=False)
ll.parameters()
<generator object Module.parameters at 0x7f3eb07f6510>
llp=list(ll.parameters())[0]
llp
Parameter containing:
tensor([[-0.0744,  0.0336,  0.0605,  ..., -0.0420,  0.0424, -0.0034],
        [-0.1795, -0.2076,  0.1650,  ..., -0.0621, -0.0006,  0.0082],
        [ 0.1246,  0.1805, -0.0646,  ...,  0.0427, -0.0914, -0.0676],
        ...,
        [-0.0006,  0.0500,  0.1109,  ..., -0.1318, -0.1138,  0.0212],
        [-0.0090,  0.0812, -0.0604,  ...,  0.1045,  0.2306,  0.1239],
        [-0.0352, -0.0684,  0.1508,  ...,  0.0299,  0.0247, -0.0539]],
       device='cuda:0', requires_grad=True)
llp.shape
torch.Size([10, 512])
ll
Linear(in_features=512, out_features=10, bias=False)
from copy import deepcopy
dls = ImageDataLoaders.from_folder(trn_path, valid_pct=.2, seed=42, item_tfms=Resize(224),batch=aug_transforms(size=224, min_scale= 0.75))   
learn = vision_learner(dls, arch)#, metrics=error_rate) # If you miss this part, you'll get an error! metrics=error_rate creates a problem 
learn2 = deepcopy(learn)
curr_loss=learn2.loss_func
def dtc_loss(preds,targs):
    rice_preds,dis_preds = preds    
    return curr_loss(dis_preds,targs)
    
class DiseaseAndTypeClassifier(nn.Module):
    def __init__(self,m):
        super().__init__()
        self.l1 = nn.Linear(in_features=512, out_features=10, bias=False) #rice type
        self.l2 = nn.Linear(in_features=512, out_features=10, bias=False) #disease
        del(m[1][-1]) #it removes the last layer
        self.m = m
    def forward (self,x):
        x = self.m(x)
        x1 = self.l1(x)
        x2 = self.l2(x)
        return x1,x2
        
dtc = DiseaseAndTypeClassifier(learn2.model)
learn2.model = dtc
learn2.loss_func=dtc_loss
preds,targs = learn2.get_preds(dl=learn2.dls.valid)
rice_preds, dis_preds = preds
rice_preds.shape,dis_preds.shape
(torch.Size([2081, 10]), torch.Size([2081, 10]))

need to check Fastai create head function