3 Nb!@stddlmZmZmZddlZddljZddljjZ GdddZ ddZ Gddde Z Gd d d e Z d d ZdS) )TupleDictOptionalNc @seZdZejejejejdddZejejejejdddZdejejejeje eje eje e ejffddd Z dejejejeje eje eje e ejffdd d Zd d ZdS)BaseAdversarialLoss) real_batch fake_batch generator discriminatorcCsdS)a Prepare for generator step :param real_batch: Tensor, a batch of real samples :param fake_batch: Tensor, a batch of samples produced by generator :param generator: :param discriminator: :return: None N)selfrrrr r r K/home/ec2-user/SageMaker/lama/saicinpainting/training/losses/adversarial.pypre_generator_step sz&BaseAdversarialLoss.pre_generator_stepcCsdS)a Prepare for discriminator step :param real_batch: Tensor, a batch of real samples :param fake_batch: Tensor, a batch of samples produced by generator :param generator: :param discriminator: :return: None Nr )r rrrr r r r pre_discriminator_stepsz*BaseAdversarialLoss.pre_discriminator_stepN)rrdiscr_real_preddiscr_fake_predmaskreturncCs tdS)a Calculate generator loss :param real_batch: Tensor, a batch of real samples :param fake_batch: Tensor, a batch of samples produced by generator :param discr_real_pred: Tensor, discriminator output for real_batch :param discr_fake_pred: Tensor, discriminator output for fake_batch :param mask: Tensor, actual mask, which was at input of generator when making fake_batch :return: total generator loss along with some values that might be interesting to log N)NotImplemented)r rrrrrr r r generator_losss z"BaseAdversarialLoss.generator_losscCs tdS)a+ Calculate discriminator loss and call .backward() on it :param real_batch: Tensor, a batch of real samples :param fake_batch: Tensor, a batch of samples produced by generator :param discr_real_pred: Tensor, discriminator output for real_batch :param discr_fake_pred: Tensor, discriminator output for fake_batch :param mask: Tensor, actual mask, which was at input of generator when making fake_batch :return: total discriminator loss along with some values that might be interesting to log N)r)r rrrrrr r r discriminator_loss.s z&BaseAdversarialLoss.discriminator_losscCsn|dk s t|js(||jddks(t||jddkrj|jrj|jdkrXtj||}ntj|||jd}|S)Nmaxpool)sizemoder)AssertionErrorallow_scale_maskshapemask_scale_modeFadaptive_max_pool2d interpolate)r rrr r r interpolate_mask=s  z$BaseAdversarialLoss.interpolate_mask)N)N)__name__ __module__ __qualname__torchTensornnModuler rrrrstrrrr"r r r r rs  "" rcCsVtjrHtjj|j|ddd}|j|jddjddddj}nd}d|_ |S) NT)outputsinputs create_graphrr)dimF) r&is_grad_enabledautogradgradsumviewrnormmean requires_grad)rrZ grad_real grad_penaltyr r r make_r1_gpGs &r:c @seZdZdddZdejejejejeejeeejffd d d Z ejeje j e j d ddZ dejejejejeejeeejffd ddZ d S)NonSaturatingWithR1r.FnearestrTc CsP||_||_|s| st|s(| s(t||_||_||_||_||_||_dS)N) gp_coefweightruse_unmasked_for_genuse_unmasked_for_discrmask_as_fake_targetrrextra_mask_weight_for_gen) r r>r?rBrrrCr@rAr r r __init__RszNonSaturatingWithR1.__init__N)rrrrrcCsttj| }|jr|jdks$|j r`|j||jdd}|jsJ||}nd||j}||}|j|jt fS)Nrrr.r) rsoftplusrBrCr@r"rr7r?dict)r rrrrr fake_loss pixel_weightsr r r res  z"NonSaturatingWithR1.generator_loss)rrrr cCs d|_dS)NT)r8)r rrrr r r r rusz*NonSaturatingWithR1.pre_discriminator_stepc Cstj| }t|||j}tj|}|j s4|jrp|j||jdd}||}|jrp|d|tj| }|||} t|j |j |d} | j | fS)Nrr.)discr_real_outdiscr_fake_out discr_real_gpr) rrEr:r>rArBr"rrFr7) r rrrrrZ real_lossr9rGsum_discr_lossmetricsr r r rys   z&NonSaturatingWithR1.discriminator_loss)r<r.FFr=rTT)N)N)r#r$r%rDr&r'rrr*rr(r)rrr r r r r;Qs " r;c@seZdZddZejeejeeejffdddZ ejeje j e j dddZ ejejejeejeeejffd d d Z d S) BCELosscCs||_tj|_dS)N)r?r(BCEWithLogitsLossbce_loss)r r?r r r rDszBCELoss.__init__)rrcCs0tj|jj|j}|j|||j}|tfS)N)r&zerosrtodevicerPr?rF)r r real_mask_gtrGr r r rszBCELoss.generator_loss)rrrr cCs d|_dS)NT)r8)r rrrr r r r rszBCELoss.pre_discriminator_step)rrrrcCsNtj|jj|j}|j|||j||d}t|j|jdd}||fS)Nrr)rIrJrK)r&rQrrRrSrPrFr7)r rrrrTrLrMr r r rs zBCELoss.discriminator_lossN)r#r$r%rDr&r'rrr*rr(r)rrr r r r rNs&rNcKs6|dkrtf|S|dkr$tf|Std|dS)Nr1ZbcezUnknown adversarial loss kind )r;rN ValueError)kindkwargsr r r make_discrim_losss   rY)typingrrrr&torch.nnr(torch.nn.functional functionalrrr:r;rNrYr r r r s  ? @