The inputs of your decoder must be the context (derivated from the encoder’s final hidden) that is used to initialize the hidden for your decoder, and the target sequence (sos+“the cat is black”). So you should have something lie this (I’m trying to use your notations):

def forward(self, input_btch, hidden_btch, target_btch):
    encO, encH = self.encoder(input_btch, hidden_btch)
    context = f(encH)
    decH = context
    decI = torch.cat(sos, target_btch)
    decO, _ = self.decoder(decI, decH)
    return decO