Some minor mistakes:

Change x1 = self.cnn.fc(image) to x1 = self.cnn(image).

self.cnn.fc.in_features will be undefined, as it’s not an nn.Identity module. You could flatten x1 after the cnn forward pass, print out the shape and define it in your model definition.

# Define the in_features of the linear layer with a random number, as we want to throw an error
def forward(self, image, data):
    x1 = self.cnn(x1)
    x1 = x1.view(x1.size(0), -1)
    print(x1.shape)
    x2 = data
    print(x2.shape)
    x = torch.cat((x1, x2), dim=1)
    x = self.fc(x) # will throw an error, but we got the shapes!
    return x

Use a single forward pass with your input tensors, look at the printed shapes, and define the in_features accordingly.