Unsure where tensor size mismatch error is coming from

Doing a neural style transfer project with PyTorch and getting this error, but not exactly sure where in the code it is being caused:

RuntimeError: The expanded size of the tensor (256) must match the existing size (32) at non-singleton dimension 2. at /opt/conda/conda-bld/pytorch_1503970438496/work/torch/lib/THC/generic/THCTensor.c:323

Here’s the code immediately preceding the error. If you think the source could be a problem with network architecture instead, I can post that as well for diagnostics.

transformer = TransformerNet()
mse_loss = torch.nn.MSELoss()
# l1_loss = torch.nn.L1Loss()
if torch.cuda.is_available():
    transformer.cuda()

CONTENT_WEIGHT = 1
STYLE_WEIGHT = 1e5
LOG_INTERVAL = 200
REGULARIZATION = 1e-7

LR = 1e-3
optimizer = Adam(transformer.parameters(), LR)
transformer.train()

for epoch in range(2):
    agg_content_loss = 0.
    agg_style_loss = 0.
    agg_reg_loss = 0.
    count = 0
    
    for batch_id, (x, _) in tqdm_notebook(enumerate(train_loader), total=len(train_loader)):
        n_batch = len(x)
        count += n_batch
        optimizer.zero_grad()
        x = Variable(x)
        if torch.cuda.is_available():
            x = x.cuda()

        y = transformer(x)
        xc = Variable(x.data, volatile=True)

        features_y = loss_network(y)
        features_xc = loss_network(xc)

        f_xc_c = Variable(features_xc[1].data, requires_grad=False)

        content_loss = CONTENT_WEIGHT * mse_loss(features_y[1], f_xc_c)

        reg_loss = REGULARIZATION * (
            torch.sum(torch.abs(y[:, :, :, :-1] - y[:, :, :, 1:])) + 
            torch.sum(torch.abs(y[:, :, :-1, :] - y[:, :, 1:, :])))

        style_loss = 0.
        for m in range(len(features_y)):
            gram_s = gram_style[m]
            gram_y = gram_matrix(features_y[m])
            style_loss += STYLE_WEIGHT * mse_loss(gram_y, gram_s.expand_as(gram_y))

        total_loss = content_loss + style_loss + reg_loss
        total_loss.backward()
        optimizer.step()

        agg_content_loss += content_loss.data[0]
        agg_style_loss += style_loss.data[0]
        agg_reg_loss += reg_loss.data[0]

        if (batch_id + 1) % LOG_INTERVAL == 0:
            mesg = "{} [{}/{}] content: {:.6f}  style: {:.6f}  reg: {:.6f}  total: {:.6f}".format(
                        time.ctime(), count, len(train_dataset),
                        agg_content_loss / LOG_INTERVAL,
                        agg_style_loss / LOG_INTERVAL,
                        agg_reg_loss / LOG_INTERVAL,
                        (agg_content_loss + agg_style_loss + agg_reg_loss) / LOG_INTERVAL
                    )
            print(mesg)
            agg_content_loss = 0
            agg_style_loss = 0
            agg_reg_loss = 0
            transformer.eval()
            y = transformer(x)
            save_debug_image(x.data, y.data, "debug/{}_{}.png".format(epoch, count))
            transformer.train()

Full error log below. If this isn’t enough diagnostic information can also post the code.


RuntimeError                              Traceback (most recent call last)
<ipython-input-46-76b6b94861f4> in <module>()
     20             x = x.cuda()
     21 
---> 22         y = transformer(x)
     23         xc = Variable(x.data, volatile=True)
     24 

~/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    222         for hook in self._forward_pre_hooks.values():
    223             hook(self, input)
--> 224         result = self.forward(*input, **kwargs)
    225         for hook in self._forward_hooks.values():
    226             hook_result = hook(self, input, result)

~/Documents/pytorch/fast-neural-style/transformer_net.py in forward(self, X)
     35     def forward(self, X):
     36         in_X = X
---> 37         y = self.relu(self.in1(self.conv1(in_X)))
     38         y = self.relu(self.in2(self.conv2(y)))
     39         y = self.relu(self.in3(self.conv3(y)))

~/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    222         for hook in self._forward_pre_hooks.values():
    223             hook(self, input)
--> 224         result = self.forward(*input, **kwargs)
    225         for hook in self._forward_hooks.values():
    226             hook_result = hook(self, input, result)

~/Documents/pytorch/fast-neural-style/transformer_net.py in forward(self, x)
    129         n = x.size(2) * x.size(3)
    130         t = x.view(x.size(0), x.size(1), n)
--> 131         mean = torch.mean(t, 2).unsqueeze(2).expand_as(x)
    132         # Calculate the biased var. torch.var returns unbiased var
    133         var = torch.var(t, 2).unsqueeze(2).expand_as(x) * ((n - 1) / float(n))

~/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/autograd/variable.py in expand_as(self, tensor)
    723 
    724     def expand_as(self, tensor):
--> 725         return Expand.apply(self, (tensor.size(),))
    726 
    727     def t(self):

~/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/autograd/_functions/tensor.py in forward(ctx, i, new_size)
    109     # tuple containing torch.Size or a list
    110     def forward(ctx, i, new_size):
--> 111         result = i.expand(*new_size)
    112         ctx.num_unsqueezed = result.dim() - i.dim()
    113         ctx.expanded_dims = [dim for dim, (expanded, original)

RuntimeError: The expanded size of the tensor (256) must match the existing size (32) at non-singleton dimension 2. at /opt/conda/conda-bld/pytorch_1503970438496/work/torch/lib/THC/generic/THCTensor.c:323

What are the sizes of x and t in transformer_net? Looks like the result of x.mean(…).unsqueeze(2) can’t be expanded to x

I have the same question…