Training the model from course 1 using different classifiers

After running the following code in lesson 1, how can I use the feature matrix and try out using other classifiers like Decision Tree and Random Forest using Scikit-Learn?

arch=resnet34
data = ImageClassifierData.from_paths(PATH, tfms=tfms_from_model(arch, sz))
learn = ConvLearner.pretrained(arch, data, precompute=True)
learn.fit(0.01, 2)

Do you mean the confusion matrix? You should be able to generate that from any list of predictions / actuals regardless of how they were generated.

If you want more information about visualizing decision trees / random forests, these topics are discussed in the machine learning course.

I meant to obtain the matrix that is being fed to the last layer containing the fully connected network. Then, instead of using a fully connected network, I wish to use a decision tree.

Oh so you want the activations at the final layer? Try this

def return_sequential(layer_num, model):
    return nn.Sequential(
        *list(model.children())[:layer_num]
        )

class get_activation_layer(nn.Module):
    def __init__(self, model):
        super().__init__()
        self.model = model
        self.layer_models = []
        for i in range(len(self.model)):
             self.layer_models.append(return_sequential(i, self.model))
    def forward(self, x):
        self.outputs = []
        for i in range(len(self.model)):
            self.outputs.append(self.layer_models[i](x))
        return self.outputs

Then

tmp_model = get_activation_layer(learn.model)
layer_outputs = tmp_model(V(i))

Where i is your input image as a tensor. Then layer_output will have the activation tensors at each layer.

2 Likes

Thanks, this is what I wanted.

Hey, I am getting an error saying i is uninitialized on the last line. Please help.

In layer_outputs = tmp_model(V(i)) ?

Sounds like the model doesn’t like how you loaded the image. Here’s how I do it:

trn_tfms, val_tfms = tfms_from_model(arch, sz)
i = val_tfms (open_image(fn))
i = i[None]
i = torch.from_numpy(i).cuda()
model.eval()
tmp_model = get_activation_layer(model)
layer_outputs = tmp_model(V(i))

What does it take as input and return as output?

open_image is from fast.ai. It opens an image with OpenCV and normalizes it.

What is V() and which library does it belong to?