Inception v3 pre-trained model

pedro: <p>I’m trying to train a pre-trained Inception v3 model for my task, which gives as input 178x178 images. It has 5 possible classes so I changed the fully-connected layer to have 5 output feature. My code is the following:</p>
<pre><code class="lang-auto">
# Pre-trained models
model = models.inception_v3(pretrained=True)

### ResNet or Inception
classifier_input = model.fc.in_features
num_labels = 5

# Replace default classifier with new classifier
model.fc = nn.Linear(classifier_input, num_labels)
model.cuda()
</code></pre>
<p>However, I’m getting the following error: RuntimeError: Calculated padded input size per channel: (2 x 2). Kernel size: (5 x 5). Kernel size can’t be greater than actual input size.</p>
<p>I’m not sure what’s the problem as I adopted a similar strategy when training a pre-trained VGG and ResNet.</p>

ptrblck: <p>Inception models expect an input of <code>299x299</code> spatial size, so your input might just bee too small for this architecture.</p>

pedro: <p>Changed the images size to <code>299x299</code> but now getting this error instead:</p>
<pre><code class="lang-auto">TypeError: max() received an invalid combination of arguments - got (InceptionOutputs, int), but expected one of:
 * (Tensor input)
 * (Tensor input, name dim, bool keepdim, tuple of Tensors out)
 * (Tensor input, Tensor other, Tensor out)
 * (Tensor input, int dim, bool keepdim, tuple of Tensors out)

</code></pre>

ptrblck: <p>The output of inception will now return an <code>InceptionOutput</code>, which will contain the <code>.logits</code> and <code>.aux_logits</code>, if specified.<br>
If you don’t need the <code>aus_logits</code>, just use <code>output.logits</code> in your further processing.</p>

pedro: <p>I tried doing this and have researched more but have not been successful.</p>
<p>My training code is the following:</p>
<pre><code class="lang-auto">def train_model(model, criterion, optimizer, scheduler, num_epochs=25):
    since = time.time()

    best_model_wts = copy.deepcopy(model.state_dict())
    best_acc = 0.0
    best_epoch = -1

    for epoch in range(num_epochs):
        print('Epoch {}/{}'.format(epoch, num_epochs - 1))
        print('-' * 10)

        # Each epoch has a training and validation phase
        for phase in ['train', 'val']:
            if phase == 'train':
                model.train()  # Set model to training mode
            else:
                model.eval()   # Set model to evaluate mode

            running_loss = 0.0
            running_corrects = 0

            # Iterate over data.
            for inputs, labels in dataloaders[phase]:
                if train_on_gpu:
                    inputs, labels = inputs.cuda(), labels.cuda()

                # zero the parameter gradients
                optimizer.zero_grad()

                # forward
                # track history if only in train
                with torch.set_grad_enabled(phase == 'train'):
                    outputs = model(inputs)
                    _, preds = torch.max(outputs, 1)
                    loss = criterion(outputs, labels)

                    # backward + optimize only if in training phase
                    if phase == 'train':
                        loss.backward()
                        optimizer.step()

                # statistics
                running_loss += loss.item() * inputs.size(0)
                running_corrects += torch.sum(preds == labels.data)
            if phase == 'train':
                scheduler.step()

            # deep copy the model
            if phase == 'val' and epoch_acc &gt; best_acc:
                best_acc = epoch_acc
                best_model_wts = copy.deepcopy(model.state_dict())
                best_epoch = epoch

        print()

    time_elapsed = time.time() - since
    print('Training complete in {:.0f}m {:.0f}s'.format(
        time_elapsed // 60, time_elapsed % 60))
    print('Best val Acc: {:4f}'.format(best_acc))
    print('Best epoch: {:4f}'.format(best_epoch))

    # load best model weights
    model.load_state_dict(best_model_wts)
    return model
</code></pre>
<p>And I specifically altered this line:</p>
<pre><code class="lang-auto">outputs = model(inputs)
</code></pre>
<p>to</p>
<pre><code class="lang-auto">outputs = model(inputs).logits
</code></pre>
<p>But still getting the same error…</p>

muammar: <p>Did you get to solve this problem?</p>

Hasith_Karunasekera: <p>This solution worked;</p>
<pre><code class="lang-auto">model = models.inception_v3(pretrained=True)
model.aux_logits = False 
</code></pre>
<p>Found the solution here;</p><aside class="quote" data-post="1" data-topic="40705">
  <div class="title">
    <div class="quote-controls"></div>
    <img loading="lazy" alt="" width="24" height="24" src="https://discuss.pytorch.org/user_avatar/discuss.pytorch.org/rajasekhar/48/10242_2.png" class="avatar">
    <a href="https://discuss.pytorch.org/t/why-auxiliary-logits-set-to-false-in-train-mode/40705">Why Auxiliary logits set to false in train mode?</a> <a class="badge-category__wrapper " href="/c/vision/5"><span data-category-id="5" data-drop-close="true" class="badge-category " title="Topics related to either pytorch/vision or vision research related topics"><span class="badge-category__name">vision</span></span></a>
  </div>
  <blockquote>
    I’m trying to train a classifier on 15k images over five categories using googlenet architecture. 
I followed the fine-tune tutorial (but used as pretrained=false just to train from scratch). 
But the training is only possible if i set the ‘aux logits as false’ 
‘’’ 
model.aux.logits=False 
‘’’ 
Can someone explain why I have to do this for training?
  </blockquote>
</aside>