Since the last layer (self.fc_output) doesn’t use any activation function, its output values are unbound and can take negative as well as positive values.
If you would like to clip the output to a certain range, you could apply relu again on the last layer or use .clamp(min=0.0).