ó
Z[—Yc           @   s·   d  d l  Z  d  d l j Z d  d l Z d e  j j f d „  ƒ  YZ d e  j j f d „  ƒ  YZ d e  j j f d „  ƒ  YZ d e  j j f d	 „  ƒ  YZ	 d
 e  j j f d „  ƒ  YZ
 d S(   iÿÿÿÿNt   TransformerNetc           B   s   e  Z d  „  Z d „  Z RS(   c      	   C   s|  t  t |  ƒ j ƒ  t d d d d d d ƒ|  _ t d ƒ |  _ t d d d d d d ƒ|  _ t d ƒ |  _ t d d	 d d d d ƒ|  _	 t d	 ƒ |  _
 t d	 ƒ |  _ t d	 ƒ |  _ t d	 ƒ |  _ t d	 ƒ |  _ t d	 ƒ |  _ t d	 d d d d d d
 d ƒ|  _ t d ƒ |  _ t d d d d d d d
 d ƒ|  _ t d ƒ |  _ t d d d d d d ƒ|  _ t j ƒ  |  _ d  S(   Ni   i    t   kernel_sizei	   t   stridei   i@   i   i€   t   upsample(   t   superR    t   __init__t	   ConvLayert   conv1t   InstanceNormalizationt   in1t   conv2t   in2t   conv3t   in3t   ResidualBlockt   res1t   res2t   res3t   res4t   res5t   UpsampleConvLayert   deconv1t   in4t   deconv2t   in5t   deconv3t   nnt   ReLUt   relu(   t   self(    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR      s$    $$c         C   s	  | } |  j  |  j |  j | ƒ ƒ ƒ } |  j  |  j |  j | ƒ ƒ ƒ } |  j  |  j |  j | ƒ ƒ ƒ } |  j | ƒ } |  j | ƒ } |  j	 | ƒ } |  j
 | ƒ } |  j | ƒ } |  j  |  j |  j | ƒ ƒ ƒ } |  j  |  j |  j | ƒ ƒ ƒ } |  j | ƒ } | S(   N(   R   R	   R   R   R
   R   R   R   R   R   R   R   R   R   R   R   R   (   R   t   Xt   in_Xt   y(    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyt   forward#   s    !!!!!(   t   __name__t
   __module__R   R!   (    (    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR       s   	R   c           B   s   e  Z d  „  Z d „  Z RS(   c         C   s]   t  t |  ƒ j ƒ  t t j | d ƒ ƒ } t j | ƒ |  _ t j	 | | | | ƒ |  _
 d  S(   Ni   (   R   R   R   t   intt   npt   floorR   t   ReflectionPad2dt   reflection_padt   Conv2dt   conv2d(   R   t   in_channelst   out_channelsR   R   t   reflection_padding(    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR   4   s    c         C   s"   |  j  | ƒ } |  j | ƒ } | S(   N(   R(   R*   (   R   t   xt   out(    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR!   :   s    (   R"   R#   R   R!   (    (    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR   3   s   	R   c           B   s    e  Z d  Z d „  Z d „  Z RS(   s‘   ResidualBlock
    introduced in: https://arxiv.org/abs/1512.03385
    recommended architecture: http://torch.ch/blog/2016/02/04/resnets.html
    c         C   s€   t  t |  ƒ j ƒ  t | | d d d d ƒ|  _ t | ƒ |  _ t | | d d d d ƒ|  _ t | ƒ |  _ t	 j
 ƒ  |  _ d  S(   NR   i   R   i   (   R   R   R   R   R   R   R	   R
   R   R   R   R   (   R   t   channels(    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR   F   s    c         C   sM   | } |  j  |  j |  j | ƒ ƒ ƒ } |  j |  j | ƒ ƒ } | | } | S(   N(   R   R	   R   R   R
   (   R   R.   t   residualR/   (    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR!   N   s
    !
(   R"   R#   t   __doc__R   R!   (    (    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR   @   s   	R   c           B   s#   e  Z d  Z d d „ Z d „  Z RS(   sÃ   UpsampleConvLayer
    Upsamples the input and then does a convolution. This method gives better results
    compared to ConvTranspose2d.
    ref: http://distill.pub/2016/deconv-checkerboard/
    c         C   s‡   t  t |  ƒ j ƒ  | |  _ | r= t j j d | ƒ |  _ n  t t	 j
 | d ƒ ƒ } t j | ƒ |  _ t j | | | | ƒ |  _ d  S(   Nt   scale_factori   (   R   R   R   R   t   torchR   t   UpsamplingNearest2dt   upsample_layerR$   R%   R&   R'   R(   R)   R*   (   R   R+   R,   R   R   R   R-   (    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR   ]   s    	c         C   sC   | } |  j  r! |  j | ƒ } n  |  j | ƒ } |  j | ƒ } | S(   N(   R   R6   R(   R*   (   R   R.   t   x_inR/   (    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR!   f   s    	N(   R"   R#   R2   t   NoneR   R!   (    (    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR   V   s   	R   c           B   s,   e  Z d  Z d d „ Z d „  Z d „  Z RS(   sr   InstanceNormalization
    Improves convergence of neural-style.
    ref: https://arxiv.org/pdf/1607.08022.pdf
    g•Ö&è.>c         C   s`   t  t |  ƒ j ƒ  t j t j | ƒ ƒ |  _ t j t j | ƒ ƒ |  _ | |  _	 |  j
 ƒ  d  S(   N(   R   R   R   R   t	   ParameterR4   t   FloatTensort   scalet   shiftt   epst   _reset_parameters(   R   t   dimR=   (    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR   u   s
    	c         C   s$   |  j  j j ƒ  |  j j j ƒ  d  S(   N(   R;   t   datat   uniform_R<   t   zero_(   R   (    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR>   |   s    c   	      C   sE  | j  d ƒ | j  d ƒ } | j | j  d ƒ | j  d ƒ | ƒ } t j | d ƒ j d ƒ j d ƒ j | ƒ } t j | d ƒ j d ƒ j d ƒ j | ƒ | d t | ƒ } |  j j d ƒ j d ƒ j d ƒ } | j | ƒ } |  j	 j d ƒ j d ƒ j d ƒ } | j | ƒ } | | t j
 | |  j ƒ } | | | } | S(   Ni   i   i    i   (   t   sizet   viewR4   t   meant	   unsqueezet	   expand_ast   vart   floatR;   R<   t   sqrtR=   (	   R   R.   t   nt   tRE   RH   t   scale_broadcastt   shift_broadcastR/   (    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR!   €   s    '-?$$(   R"   R#   R2   R   R>   R!   (    (    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyR   o   s   	(   R4   t   torch.nnR   t   numpyR%   t   ModuleR    R   R   R   R   (    (    (    s`   /data/vision/torralba/deepscene/small-projects/fast-neural-style/neural_style/transformer_net.pyt   <module>   s   -