Why doesn't converting the dtype of a Tensor fix "RuntimeError: expected scalar type Double but found Float"?
The important part of my code looks like this:
def forward(self, x):
        x = T.tensor(x).to(self.device)
        x = x.type(T.DoubleTensor)
        x = self.conv1(x)
        ...

Yet I still get the error expected scalar type Double but found Float on the last line of that snippet. The line x = x.type(T.DoubleTensor) should fix that, right? I've also tried x = x.double() and  x = T.tensor(x, dtype = T.double).to(self.device) for the earlier line, and I still get the error. I'm at a loss, what am I doing wrong?

PyTorch expects the input to a layer to have the same device and data type (dtype) as the parameters of the layer. For most layers, including conv layers, the default data type is torch.float32, i.e. a FloatTensor.
To fix your issue you can cast x to be the same type as the weight or bias parameters of the self.conv1 layer (assuming this is a nn.Conv*d layer).
def forward(self, x):
    x = T.tensor(x, device=self.device, dtype=self.conv1.weight.dtype)
    x = self.conv1(x)
    ...

Most likely self.conv1.weight.dtype will just be torch.float32. Unless you've explicitly changed your model parameter types using something like model.to(dtype=torch.float64) then you could equivalently just use
def forward(self, x):
    x = T.tensor(x, device=self.device, dtype=torch.float32)
    x = self.conv1(x)
    ...

