How to load resnet in new fastai version

I am probably doing a very silly mistake. i can’t load my trained model . Here is the error:


FileNotFoundError: [Errno 2] No such file or directory: 'data/models/<function resnet18 at 0x7f2ca2cbdb70>.pth'

why is it a function. I have imported is as well
I am using the ensemble notebook that is on github

Thanks in advance

Hey, you probably just forgot quotes around resnet18. To receive more specific help you would need to describe how you got to that error.

having (resnet18) in quotes will throw this error:

RuntimeError: Error(s) in loading state_dict for Sequential:
	Missing key(s) in state_dict: "0.model.conv1.weight", "0.model.bn1.weight", "0.model.bn1.bias", "0.model.bn1.running_mean", "0.model.bn1.running_var", "0.model.layer1.0.conv1.weight", "0.model.layer1.0.bn1.weight", "0.model.layer1.0.bn1.bias", "0.model.layer1.0.bn1.running_mean", "0.model.layer1.0.bn1.running_var", "0.model.layer1.0.conv2.weight", "0.model.layer1.0.bn2.weight", "0.model.layer1.0.bn2.bias", "0.model.layer1.0.bn2.running_mean", "0.model.layer1.0.bn2.running_var", "0.model.layer1.1.conv1.weight", "0.model.layer1.1.bn1.weight", "0.model.layer1.1.bn1.bias", "0.model.layer1.1.bn1.running_mean", "0.model.layer1.1.bn1.running_var", "0.model.layer1.1.conv2.weight", "0.model.layer1.1.bn2.weight", "0.model.layer1.1.bn2.bias", "0.model.layer1.1.bn2.running_mean", "0.model.layer1.1.bn2.running_var", "0.model.layer2.0.conv1.weight", "0.model.layer2.0.bn1.weight", "0.model.layer2.0.bn1.bias", "0.model.layer2.0.bn1.running_mean", "0.model.layer2.0.bn1.running_var", "0.model.layer2.0.conv2.weight", "0.model.layer2.0.bn2.weight", "0.model.layer2.0.bn2.bias", "0.model.layer2.0.bn2.running_mean", "0.model.layer2.0.bn2.running_var", "0.model.layer2.0.downsample.0.weight", "0.model.layer2.0.downsample.1.weight", "0.model.layer2.0.downsample.1.bias", "0.model.layer2.0.downsample.1.running_mean", "0.model.layer2.0.downsample.1.running_var", "0.model.layer2.1.conv1.weight", "0.model.layer2.1.bn1.weight", "0.model.layer2.1.bn1.bias", "0.model.layer2.1.bn1.running_mean", "0.model.layer2.1.bn1.running_var", "0.model.layer2.1.conv2.weight", "0.model.layer2.1.bn2.weight", "0.model.layer2.1.bn2.bias", "0.model.layer2.1.bn2.running_mean", "0.model.layer2.1.bn2.running_var", "0.model.layer3.0.conv1.weight", "0.model.layer3.0.bn1.weight", "0.model.layer3.0.bn1.bias", "0.model.layer3.0.bn1.running_mean", "0.model.layer3.0.bn1.running_var", "0.model.layer3.0.conv2.weight", "0.model.layer3.0.bn2.weight", "0.model.layer3.0.bn2.bias", "0.model.layer3.0.bn2.running_mean", "0.model.layer3.0.bn2.running_var", "0.model.layer3.0.downsample.0.weight", "0.model.layer3.0.downsample.1.weight", "0.model.layer3.0.downsample.1.bias", "0.model.layer3.0.downsample.1.running_mean", "0.model.layer3.0.downsample.1.running_var", "0.model.layer3.1.conv1.weight", "0.model.layer3.1.bn1.weight", "0.model.layer3.1.bn1.bias", "0.model.layer3.1.bn1.running_mean", "0.model.layer3.1.bn1.running_var", "0.model.layer3.1.conv2.weight", "0.model.layer3.1.bn2.weight", "0.model.layer3.1.bn2.bias", "0.model.layer3.1.bn2.running_mean", "0.model.layer3.1.bn2.running_var", "0.model.layer4.0.conv1.weight", "0.model.layer4.0.bn1.weight", "0.model.layer4.0.bn1.bias", "0.model.layer4.0.bn1.running_mean", "0.model.layer4.0.bn1.running_var", "0.model.layer4.0.conv2.weight", "0.model.layer4.0.bn2.weight", "0.model.layer4.0.bn2.bias", "0.model.layer4.0.bn2.running_mean", "0.model.layer4.0.bn2.running_var", "0.model.layer4.0.downsample.0.weight", "0.model.layer4.0.downsample.1.weight", "0.model.layer4.0.downsample.1.bias", "0.model.layer4.0.downsample.1.running_mean", "0.model.layer4.0.downsample.1.running_var", "0.model.layer4.1.conv1.weight", "0.model.layer4.1.bn1.weight", "0.model.layer4.1.bn1.bias", "0.model.layer4.1.bn1.running_mean", "0.model.layer4.1.bn1.running_var", "0.model.layer4.1.conv2.weight", "0.model.layer4.1.bn2.weight", "0.model.layer4.1.bn2.bias", "0.model.layer4.1.bn2.running_mean", "0.model.layer4.1.bn2.running_var". 
	Unexpected key(s) in state_dict: "0.0.weight", "0.1.weight", "0.1.bias", "0.1.running_mean", "0.1.running_var", "0.1.num_batches_tracked", "0.4.0.conv1.weight", "0.4.0.bn1.weight", "0.4.0.bn1.bias", "0.4.0.bn1.running_mean", "0.4.0.bn1.running_var", "0.4.0.bn1.num_batches_tracked", "0.4.0.conv2.weight", "0.4.0.bn2.weight", "0.4.0.bn2.bias", "0.4.0.bn2.running_mean", "0.4.0.bn2.running_var", "0.4.0.bn2.num_batches_tracked", "0.4.1.conv1.weight", "0.4.1.bn1.weight", "0.4.1.bn1.bias", "0.4.1.bn1.running_mean", "0.4.1.bn1.running_var", "0.4.1.bn1.num_batches_tracked", "0.4.1.conv2.weight", "0.4.1.bn2.weight", "0.4.1.bn2.bias", "0.4.1.bn2.running_mean", "0.4.1.bn2.running_var", "0.4.1.bn2.num_batches_tracked", "0.5.0.conv1.weight", "0.5.0.bn1.weight", "0.5.0.bn1.bias", "0.5.0.bn1.running_mean", "0.5.0.bn1.running_var", "0.5.0.bn1.num_batches_tracked", "0.5.0.conv2.weight", "0.5.0.bn2.weight", "0.5.0.bn2.bias", "0.5.0.bn2.running_mean", "0.5.0.bn2.running_var", "0.5.0.bn2.num_batches_tracked", "0.5.0.downsample.0.weight", "0.5.0.downsample.1.weight", "0.5.0.downsample.1.bias", "0.5.0.downsample.1.running_mean", "0.5.0.downsample.1.running_var", "0.5.0.downsample.1.num_batches_tracked", "0.5.1.conv1.weight", "0.5.1.bn1.weight", "0.5.1.bn1.bias", "0.5.1.bn1.running_mean", "0.5.1.bn1.running_var", "0.5.1.bn1.num_batches_tracked", "0.5.1.conv2.weight", "0.5.1.bn2.weight", "0.5.1.bn2.bias", "0.5.1.bn2.running_mean", "0.5.1.bn2.running_var", "0.5.1.bn2.num_batches_tracked", "0.6.0.conv1.weight", "0.6.0.bn1.weight", "0.6.0.bn1.bias", "0.6.0.bn1.running_mean", "0.6.0.bn1.running_var", "0.6.0.bn1.num_batches_tracked", "0.6.0.conv2.weight", "0.6.0.bn2.weight", "0.6.0.bn2.bias", "0.6.0.bn2.running_mean", "0.6.0.bn2.running_var", "0.6.0.bn2.num_batches_tracked", "0.6.0.downsample.0.weight", "0.6.0.downsample.1.weight", "0.6.0.downsample.1.bias", "0.6.0.downsample.1.running_mean", "0.6.0.downsample.1.running_var", "0.6.0.downsample.1.num_batches_tracked", "0.6.1.conv1.weight", "0.6.1.bn1.weight", "0.6.1.bn1.bias", "0.6.1.bn1.running_mean", "0.6.1.bn1.running_var", "0.6.1.bn1.num_batches_tracked", "0.6.1.conv2.weight", "0.6.1.bn2.weight", "0.6.1.bn2.bias", "0.6.1.bn2.running_mean", "0.6.1.bn2.running_var", "0.6.1.bn2.num_batches_tracked", "0.7.0.conv1.weight", "0.7.0.bn1.weight", "0.7.0.bn1.bias", "0.7.0.bn1.running_mean", "0.7.0.bn1.running_var", "0.7.0.bn1.num_batches_tracked", "0.7.0.conv2.weight", "0.7.0.bn2.weight", "0.7.0.bn2.bias", "0.7.0.bn2.running_mean", "0.7.0.bn2.running_var", "0.7.0.bn2.num_batches_tracked", "0.7.0.downsample.0.weight", "0.7.0.downsample.1.weight", "0.7.0.downsample.1.bias", "0.7.0.downsample.1.running_mean", "0.7.0.downsample.1.running_var", "0.7.0.downsample.1.num_batches_tracked", "0.7.1.conv1.weight", "0.7.1.bn1.weight", "0.7.1.bn1.bias", "0.7.1.bn1.running_mean", "0.7.1.bn1.running_var", "0.7.1.bn1.num_batches_tracked", "0.7.1.conv2.weight", "0.7.1.bn2.weight", "0.7.1.bn2.bias", "0.7.1.bn2.running_mean", "0.7.1.bn2.running_var", "0.7.1.bn2.num_batches_tracked".

Here is part of my code:

def load(arch, size, item=Resize(480, method='squish'), accum=1):
    dls = ImageDataLoaders.from_folder(trn_path,valid_pct=0.2, item_tfms=item,
        batch_tfms=aug_transforms(size=size, min_scale=0.75), bs=100//accum)
    gradient_accumulation = GradientAccumulation(64) if accum else []
    learn = vision_learner(dls, arch, metrics=error_rate, 
    cbs=[gradient_accumulation])
    learn.load(f'{arch}',with_opt=True)
    return learn.tta(dl=dls.test_dl(tst_files))

models = {
    
     resnet18: {
        (Resize(640, method='squish'), 480),
    }}

tta_res = []

for arch,details in models.items():
    for item,size in details:
        print('---',arch)
        print(type(arch))
        print(size)
        print(item.name)
        tta_res.append(load(arch, size, item=item, accum=2)) #, epochs=1))

Thanks for your help @benkarr

resnet18 is a function, when you pass this to learn.load(f'{arch}', …) it tries to load your model from <function resnet18 at 0x7f2ca2cbdb70> (thats what you get if you run print(resnet18)) where you probably didn’t save it. When you use quotes around resnet18: vision_learner(…) creates a ‘timm’ model (instead of a fastai one) and the parameters you saved probably do not fit timms resnet18 schema…

To solve this you could add something to your models dict, like:

models = {
    resnet18: {
        path: 'path/to/model',
        tfms: (Resize(640, method='squish'), 480),
    }
}

and adjust your load function to load from models[arch].path.
Also: how did you save your trained model? If you used learn.export(path) you can load it with learn = load_learner(path) and don’t even need the specific architecture & transforms to recreate it :slight_smile: .

4 Likes

Thanks a lot for your help!

I saved both the pkl and pth with learn.save and learn.export. I ended up loading the model this way: learn.load(model_path + '/' + arch.__name__) .
Your explanation was very informative!

Cheers!

1 Like