U
    0J<b<                     @   s   e  Zd ZddlZddlZejjZ	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddl
mZ ddlZddlZddlmZ ddlmZ ddlmZ ej e! Z"ddlZddlZdd Z#dd
dZ$dd Z%dddZ&G dd dZ'dd Z(dd Z)dd Z*dd Z+dddZ,dd  Z-dd"d#Z.dd$d%Z/d&d' Z0d(d) Z1G d*d+ d+Z2d,d- Z3G d.d/ d/Z4d0d1 Z5G d2d3 d3Z6dd5d6Z7d7d8 Z8e  Zd Zej9:d9d:fd;d<Z;dd=d>Z<d?d@ Z=edA dBfedC< edD dEfedF< ddGdHZ>dIdJ Z?dKdL Z@G dMdN dNejjAjBZCdOdP ZDG dQdR dRejjZEe"jdS dTfe"jdU< dVdW ZFddYdZZGG d[d\ d\ZHd]d^ ZIdd`daZJdbdc ZKddde ZLG dfdg dgZMddjdkZNG dldm dmZOdndo ZPdpdq ZQdrds ZRddtduZSG dvdw dwejjTjUZVe"jdx dyfe"jdz< d{d| ZWd}d~ ZXdddZYdd ZZdd Z[dd Z\dddZ]G dd dejjTjUZ^G dd dejjTjUZ_G dd dejjZ`G dd de"j^ZadddZbG dd dejjcjdZedd ZfdddZgdd ZhdddZidd ZjG dd dejjTjUZkG dd dejjTjUZlG dd de"j_ZmG dd dejjTjUZndd Zodd ZpG dd dejjTjUZqG dd dejjTjUZrG dd dejjTjUZsG dd dejjTjUZtG dd de"j^Zudd ZvdddZwdd Zxe"jd dfe"jd< dddńZydddȄZzdddʄZ{G dd̄ d̃Z|dd΄ Z}ddЄ Z~dd҄ ZddԄ Zddք Ze"jd dfe"jd< ddۄ ZejZejZejZejZejZejZejZejZejZejZejZejjZejjZejZejZejZejZejZejZejZejZejZejZejZejZejZddۄ ZdS )z,http://d2l-data.s3-accelerate.amazonaws.com/    N)defaultdict)display)pyplot)backend_inlinec                   C   s   t d dS )zWUse the svg format to display a plot in Jupyter.

    Defined in :numref:`sec_calculus`svgN)r   set_matplotlib_formats r   r   =/home/d2l-worker/workspace/d2l-en-release/./d2l/tensorflow.pyuse_svg_display%   s    r
   g      @      @c                 C   s   t   | tjjd< dS )zJSet the figure size for matplotlib.

    Defined in :numref:`sec_calculus`zfigure.figsizeN)r
   d2lpltrcParamsfigsizer   r   r	   set_figsize+   s    r   c                 C   sV   |  | | | | | | | | | | | |rJ| | |   dS )zCSet the axes for matplotlib.

    Defined in :numref:`sec_calculus`N)
set_xlabel
set_ylabel
set_xscale
set_yscaleset_xlimset_ylimlegendgrid)axesxlabelylabelxlimylimxscaleyscaler   r   r   r	   set_axes2   s    






r"   linear-zm--zg-.zr:c              	   C   s   |dkrg }t |
 |r|ntj }dd }|| r<| g} |dkrZg gt|  |  } }n||rh|g}t| t|kr| t| } |  t| ||	D ].\}}}t|r|||| q||| qt|||||||| dS )z8Plot data points.

    Defined in :numref:`sec_calculus`Nc                 S   s.   t | dr| jdkp,t| to,t | d d S )Nndim   r   __len__)hasattrr&   
isinstancelistXr   r   r	   has_one_axisM   s    zplot.<locals>.has_one_axis)	r   r   r   gcalenclazipplotr"   )r-   Yr   r   r   r   r   r    r!   fmtsr   r   r.   xyfmtr   r   r	   r3   @   s&    r3   c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )TimerzRecord multiple running times.c                 C   s   g | _ |   dS )z(Defined in :numref:`subsec_linear_model`N)timesstartselfr   r   r	   __init__c   s    zTimer.__init__c                 C   s   t   | _dS )zStart the timer.N)timetikr<   r   r   r	   r;   h   s    zTimer.startc                 C   s    | j t | j  | j d S )z-Stop the timer and record the time in a list.)r:   appendr?   r@   r<   r   r   r	   stopl   s    z
Timer.stopc                 C   s   t | jt| j S )zReturn the average time.)sumr:   r0   r<   r   r   r	   avgq   s    z	Timer.avgc                 C   s
   t | jS )zReturn the sum of time.)rD   r:   r<   r   r   r	   rD   u   s    z	Timer.sumc                 C   s   t | j  S )zReturn the accumulated time.)nparrayr:   cumsumtolistr<   r   r   r	   rH   y   s    zTimer.cumsumN)
__name__
__module____qualname____doc__r>   r;   rC   rE   rD   rH   r   r   r   r	   r9   a   s   r9   c                 C   sj   t || jd f}|tjj|jd7 }t |t| d| }|tjj|jdd7 }t |d}||fS )zIGenerate y = Xw + b + noise.

    Defined in :numref:`sec_linear_scratch`r   shaperA   r'   {Gz?)rO   stddev)r   zerosrO   tfrandomnormalmatmulreshape)wbnum_examplesr-   r7   r   r   r	   synthetic_data}   s    r\   c                 C   s   t | || S )zIThe linear regression model.

    Defined in :numref:`sec_linear_scratch`)r   rW   )r-   rY   rZ   r   r   r	   linreg   s    r]   c                 C   s   | t || j d d S )z:Squared loss.

    Defined in :numref:`sec_linear_scratch`   )r   rX   rO   )y_hatr7   r   r   r	   squared_loss   s    r`   c                 C   s*   t | |D ]\}}||| |  q
dS )zSMinibatch stochastic gradient descent.

    Defined in :numref:`sec_linear_scratch`N)r2   Z
assign_sub)paramsgradslr
batch_sizeparamgradr   r   r	   sgd   s    rg   Tc                 C   s,   t jj| }|r|jdd}||}|S )zRConstruct a TensorFlow data iterator.

    Defined in :numref:`sec_linear_concise`  )buffer_size)rT   dataDatasetfrom_tensor_slicesshufflebatch)data_arraysrd   is_traindatasetr   r   r	   
load_array   s
    
rr   c              
      s*   ddddddddd	d
g
  fdd| D S )z]Return text labels for the Fashion-MNIST dataset.

    Defined in :numref:`sec_fashion_mnist`zt-shirttrouserpulloverdresscoatsandalshirtsneakerbagz
ankle bootc                    s   g | ]} t | qS r   )int.0itext_labelsr   r	   
<listcomp>   s     z,get_fashion_mnist_labels.<locals>.<listcomp>r   )labelsr   r   r	   get_fashion_mnist_labels   s    
    r         ?c                 C   s   || || f}t jj|||d\}}| }tt|| D ]N\}\}	}
|	t |
 |	j	 
d |	j 
d |r<|	||  q<|S )zBPlot a list of images.

    Defined in :numref:`sec_fashion_mnist`r   F)r   r   subplotsflatten	enumerater2   imshownumpyr   	get_xaxisset_visible	get_yaxis	set_title)imgsnum_rowsnum_colstitlesscaler   _r   r~   aximgr   r   r	   show_images   s    r   c                    sp   t jjj \}}dd } fdd}t jj|| | 	t
|d |t jj|| | |fS )zlDownload the Fashion-MNIST dataset and then load it into memory.

    Defined in :numref:`sec_fashion_mnist`c                 S   s    t j| ddd t j|ddfS )N   axis   int32dtype)rT   expand_dimscastr-   r7   r   r   r	   <lambda>   s   z)load_data_fashion_mnist.<locals>.<lambda>c                    s    rt j|   n| |fS N)rT   imageZresize_with_padr   resizer   r	   r      s     r   )rT   kerasdatasetsZfashion_mnistZ	load_datarj   rk   rl   rn   rm   r0   map)rd   r   mnist_train
mnist_testprocess	resize_fnr   r   r	   load_data_fashion_mnist   s     
r   c                 C   sT   t | jdkr*| jd dkr*tj| dd} t| |j|k}ttt||jS )zXCompute the number of correct predictions.

    Defined in :numref:`sec_softmax_scratch`r'   r   )r0   rO   r   argmaxastyper   float
reduce_sum)r_   r7   cmpr   r   r	   accuracy   s    r   c                 C   sB   t d}|D ]$\}}|t| ||t| q|d |d  S )z\Compute the accuracy for a model on a dataset.

    Defined in :numref:`sec_softmax_scratch`r^   r   r'   )Accumulatoraddr   r   size)net	data_itermetricr-   r7   r   r   r	   evaluate_accuracy   s    r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )r   z)For accumulating sums over `n` variables.c                 C   s   dg| | _ dS )(Defined in :numref:`sec_softmax_scratch`        Nrj   )r=   nr   r   r	   r>      s    zAccumulator.__init__c                 G   s   dd t | j|D | _d S )Nc                 S   s   g | ]\}}|t | qS r   )r   )r}   arZ   r   r   r	   r      s     z#Accumulator.add.<locals>.<listcomp>)r2   rj   r=   argsr   r   r	   r      s    zAccumulator.addc                 C   s   dgt | j | _d S )Nr   )r0   rj   r<   r   r   r	   reset   s    zAccumulator.resetc                 C   s
   | j | S r   r   )r=   idxr   r   r	   __getitem__   s    zAccumulator.__getitem__N)rJ   rK   rL   rM   r>   r   r   r   r   r   r   r	   r      s
   r   c              
   C   s  t d}|D ]\}}t 4}| |}t|tjjjrB|||}	n
|||}	W 5 Q R X t|tjjjr| j	}
|
|	|
}|t||
 n||jd |
|	|j t|tjjjr|	tt| nt|	}||t||t| q|d |d  |d |d  fS )zUThe training loop defined in Chapter 3.

    Defined in :numref:`sec_softmax_scratch`r   r   r^   r'   )r   rT   GradientTaper*   r   lossesLoss
optimizers	Optimizertrainable_variablesgradientapply_gradientsr2   rO   ra   r   r   r   r   r   )r   
train_iterlossupdaterr   r-   r7   taper_   lra   rb   Zl_sumr   r   r	   train_epoch_ch3   s(    
 r   c                   @   s"   e Zd ZdZdddZd	d
 ZdS )AnimatorzFor plotting data in animation.Nr#   r$   r'   r   c                    sz    dkrg  t   t jj|	|
|d\__|	|
 dkrDjg_ fdd_dd|  ___	dS )r   Nr   r'   c                
      s   t jd  S Nr   )r   r"   r   r   r   r=   r   r   r    r   r   r!   r   r	   r     s          z#Animator.__init__.<locals>.<lambda>)
r   r
   r   r   figr   config_axesr-   r4   r5   )r=   r   r   r   r   r   r    r!   r5   nrowsncolsr   r   r   r	   r>     s    
zAnimator.__init__c                 C   s  t |ds|g}t|}t |ds,|g| }| jsFdd t|D | _| js`dd t|D | _tt||D ]<\}\}}|d k	rn|d k	rn| j| | | j| | qn| jd 	  t| j| j| j
D ]\}}}| jd ||| q|   t| j tjdd d S )Nr(   c                 S   s   g | ]}g qS r   r   r}   r   r   r   r	   r   '  s     z Animator.add.<locals>.<listcomp>c                 S   s   g | ]}g qS r   r   r   r   r   r	   r   )  s     r   T)wait)r)   r0   r-   ranger4   r   r2   rB   r   r1   r5   r3   r   r   r   clear_output)r=   r6   r7   r   r~   r   rZ   r8   r   r   r	   r     s&    


zAnimator.add)NNNNNr#   r#   r$   r'   r'   r   )rJ   rK   rL   rM   r>   r   r   r   r   r	   r     s               
r   c                 C   s   t dd|gddgdddgd}t|D ]2}t| |||}t| |}	||d ||	f  q&|\}
}|
d	k srt|
|dkr|d
kst||	dkr|	d
kst|	dS )zSTrain a model (defined in Chapter 3).

    Defined in :numref:`sec_softmax_scratch`epochr'   g333333?g?
train loss	train acctest acc)r   r   r   r         ?gffffff?N)r   r   r   r   r   AssertionError)r   r   	test_iterr   
num_epochsr   animatorr   train_metricstest_acc
train_loss	train_accr   r   r	   	train_ch35  s    
r   c                   @   s    e Zd ZdZdd Zdd ZdS )UpdaterzrFor updating parameters using minibatch stochastic gradient descent.

    Defined in :numref:`sec_softmax_scratch`c                 C   s   || _ || _d S r   )ra   rc   )r=   ra   rc   r   r   r	   r>   H  s    zUpdater.__init__c                 C   s   t | j|| j| d S r   )r   rg   ra   rc   )r=   rd   rb   r   r   r	   __call__L  s    zUpdater.__call__N)rJ   rK   rL   rM   r>   r   r   r   r   r	   r   D  s   r      c                 C   s|   |D ]\}} qqt |}t t j| |dd}dd t||D }t jt |d| |ddfd||d| d dS )	zTPredict labels (defined in Chapter 3).

    Defined in :numref:`sec_softmax_scratch`r'   r   c                 S   s   g | ]\}}|d  | qS )
r   )r}   truepredr   r   r	   r   W  s     zpredict_ch3.<locals>.<listcomp>r      )r   N)r   r   r   r2   r   rX   )r   r   r   r-   r7   truespredsr   r   r   r	   predict_ch3O  s    
   
r   c                 C   sN   t d}|D ].\}}|| ||}|t |t | q|d |d  S )z`Evaluate the loss of a model on the given dataset.

    Defined in :numref:`sec_model_selection`r^   r   r'   )r   r   r   r   r   )r   r   r   r   r-   r7   r   r   r   r	   evaluate_loss[  s
    
r   z..rj   c           	   	   C   s   | t kst|  dt  dt |  \}}tj|dd tj||dd }tj|rt	 }t
|d"}|d}|s~q|| qnW 5 Q R X | |kr|S td	| d
| d tj|ddd}t
|d}||j W 5 Q R X |S )zmDownload a file inserted into DATA_HUB, return the local filename.

    Defined in :numref:`sec_kaggle_house`z does not exist in .T)exist_ok/rA   rbi   zDownloading z from z...)streamverifywb)DATA_HUBr   osmakedirspathjoinsplitexistshashlibsha1openreadupdate	hexdigestprintrequestsgetwritecontent)	name	cache_dirurl	sha1_hashfnamer  frj   rr   r   r	   downloadh  s$    
r  c                 C   s|   t | }tj|}tj|\}}|dkr:t|d}n"|dkrPt|d}nds\t	d|
| |rxtj||S |S )zODownload and extract a zip/tar file.

    Defined in :numref:`sec_kaggle_house`z.zipr  )z.tarz.gzFz$Only zip/tar files can be extracted.)r  r   r  dirnamesplitextzipfileZipFiletarfiler  r   
extractallr  )r  folderr  base_dirdata_dirextfpr   r   r	   download_extract  s    
r#  c                  C   s   t D ]} t|  qdS )zNDownload all files in the DATA_HUB.

    Defined in :numref:`sec_kaggle_house`N)r   r  )r  r   r   r	   download_all  s    r$  zkaggle_house_pred_train.csv(585e9cc93e70b39160e7921475f9bcd7d31219cekaggle_house_trainzkaggle_house_pred_test.csv(fa19780a7b011d9b009e8bff8e99922a8ee2eb90kaggle_house_testc                 C   s4   t tjjd| d kr*td|  S tdS )zVReturn gpu(i) if exists, otherwise return cpu().

    Defined in :numref:`sec_use_gpu`GPUr'   /GPU:/CPU:0)r0   rT   configexperimentallist_physical_devicesdevice)r~   r   r   r	   try_gpu  s    r0  c                  C   s8   t tjjd} dd t| D }|r,|S tdgS )z^Return all available GPUs, or [cpu(),] if no GPU exists.

    Defined in :numref:`sec_use_gpu`r)  c                 S   s   g | ]}t d | qS )r*  )rT   r/  r|   r   r   r	   r     s     z try_all_gpus.<locals>.<listcomp>r+  )r0   rT   r,  r-  r.  r   r/  )num_gpusdevicesr   r   r	   try_all_gpus  s    r3  c                 C   s   |j \}}tt| j d | d | j d | d f}t|j d D ]L}t|j d D ]8}|||f t| ||| ||| f |  qZqH|S )zCompute 2D cross-correlation.r   r'   )rO   rT   VariablerS   r   assignr   )r-   KhrY   r4   r~   jr   r   r	   corr2d  s    
0
r9  c                   @   s*   e Zd ZdZdd Zd	ddZdd ZdS )
TrainCallbackzSA callback to visiualize the training progress.

    Defined in :numref:`sec_lenet`c                 C   sH   t  | _t jdd|gdddgd| _|| _|| _|| _|| _|| _	d S )Nr   r'   r   r   r   )r   r   r   )
r   r9   timerr   r   r   r   r   r   device_name)r=   r   r   r   r   r<  r   r   r	   r>     s    
   zTrainCallback.__init__Nc                 C   s   | j   d S r   )r;  r;   )r=   r   logsr   r   r	   on_epoch_begin  s    zTrainCallback.on_epoch_beginc                 C   s   | j   | jj| jdddd }|d |d |f}| j|d | || jd krtt	| j
d jd }|tjj| j
  }td|d dd	|d dd
|d d t|| j   ddt| j  d S )Nr   T)verboseZreturn_dictr   r   r'   loss .3fz, train acc z, test acc r^   .1fz examples/sec on )r;  rC   r   evaluater   r   r   r   nextiterr   rO   rT   rj   r-  cardinalityr   r  rE   strr<  )r=   r   r=  r   metricsrd   r[   r   r   r	   on_epoch_end  s"    
  

,zTrainCallback.on_epoch_end)N)rJ   rK   rL   rM   r>   r>  rI  r   r   r   r	   r:    s   

r:  c              	   C   s   |j }tj|}| > tjjj|d}tjjj	dd}	|  }
|
j
||	dgd W 5 Q R X t|
||||}|
j||d|gd |
S )zTTrain a model with a GPU (defined in Chapter 6).

    Defined in :numref:`sec_lenet`learning_rateTfrom_logitsr   )	optimizerr   rH  r   )epochsr?  	callbacks)_device_namerT   
distributeZOneDeviceStrategyscoper   r   SGDr   SparseCategoricalCrossentropycompiler:  fit)Znet_fnr   r   r   rc   r/  r<  strategyrN  r   r   callbackr   r   r	   	train_ch6  s    

rZ  c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )	ResidualzThe Residual block of ResNet.Fr'   c                    sx   t    tjjj|dd|d| _tjjj|ddd| _d | _|rXtjjj|d|d| _tjj	 | _
tjj	 | _d S )Nsamer   )paddingkernel_sizestrides)r^  r]  r'   )r^  r_  )superr>   rT   r   layersConv2Dconv1conv2conv3BatchNormalizationbn1bn2)r=   num_channelsuse_1x1convr_  	__class__r   r	   r>     s*    
       zResidual.__init__c                 C   sT   t jj| | |}| | |}| jd k	r>| |}||7 }t jj|S r   )	rT   r   activationsrelurg  rc  rh  rd  re  )r=   r-   r4   r   r   r	   call  s    

zResidual.call)Fr'   rJ   rK   rL   rM   r>   ro  __classcell__r   r   rk  r	   r[    s   r[  ztimemachine.txt(090b5e7e70c295757f55df93cb0a180b9691891atime_machinec               	   C   s2   t tdd} |  }W 5 Q R X dd |D S )ziLoad the time machine dataset into a list of text lines.

    Defined in :numref:`sec_text_preprocessing`rs  r  c                 S   s"   g | ]}t d d|  qS )z
[^A-Za-z]+ )resubstriplowerr}   liner   r   r	   r     s     z%read_time_machine.<locals>.<listcomp>)r  r   r  	readlines)r  linesr   r   r	   read_time_machine  s    r}  wordc                 C   s<   |dkrdd | D S |dkr,dd | D S t d|  dS )z`Split text lines into word or character tokens.

    Defined in :numref:`sec_text_preprocessing`r~  c                 S   s   g | ]}|  qS r   )r  ry  r   r   r	   r     s     ztokenize.<locals>.<listcomp>charc                 S   s   g | ]}t |qS r   )r+   ry  r   r   r	   r     s     zERROR: unknown token type: N)r  )r|  tokenr   r   r	   tokenize
  s
    r  c                   @   sJ   e Zd ZdZdddZdd Zdd	 Zd
d Zedd Z	edd Z
dS )VocabzVocabulary for text.Nr   c                 C   s   |dkrg }|dkrg }t |}t| dd dd| _dg| | _dd t| jD | _| jD ]>\}}||k rt q|| jkr`| j| t| jd	 | j|< q`dS )
z+Defined in :numref:`sec_text_preprocessing`Nc                 S   s   | d S Nr'   r   )r6   r   r   r	   r         z Vocab.__init__.<locals>.<lambda>T)keyreversez<unk>c                 S   s   i | ]\}}||qS r   r   )r}   r   r  r   r   r	   
<dictcomp>#  s    z"Vocab.__init__.<locals>.<dictcomp>r'   )	count_corpussorteditems_token_freqsidx_to_tokenr   token_to_idxrB   r0   )r=   tokensmin_freqreserved_tokenscounterr  freqr   r   r	   r>     s$    
zVocab.__init__c                 C   s
   t | jS r   )r0   r  r<   r   r   r	   r(   ,  s    zVocab.__len__c                    s0   t |ttfs j| jS  fdd|D S )Nc                    s   g | ]}  |qS r   )r   )r}   r  r<   r   r	   r   2  s     z%Vocab.__getitem__.<locals>.<listcomp>)r*   r+   tupler  r  unk)r=   r  r   r<   r	   r   /  s    zVocab.__getitem__c                    s*   t |ttfs j| S  fdd|D S )Nc                    s   g | ]} j | qS r   r  )r}   indexr<   r   r	   r   7  s     z#Vocab.to_tokens.<locals>.<listcomp>)r*   r+   r  r  )r=   indicesr   r<   r	   	to_tokens4  s    
zVocab.to_tokensc                 C   s   dS r   r   r<   r   r   r	   r  9  s    z	Vocab.unkc                 C   s   | j S r   )r  r<   r   r   r	   token_freqs=  s    zVocab.token_freqs)Nr   N)rJ   rK   rL   rM   r>   r(   r   r  propertyr  r  r   r   r   r	   r    s   

r  c                 C   s2   t | dkst| d tr(dd | D } t| S )zICount token frequencies.

    Defined in :numref:`sec_text_preprocessing`r   c                 S   s   g | ]}|D ]}|qqS r   r   r}   rz  r  r   r   r	   r   H  s       z count_corpus.<locals>.<listcomp>)r0   r*   r+   collectionsCounter)r  r   r   r	   r  A  s    r  rA   c                    sF   t  }t|d}t|  fdd|D }| dkr>|d|  }| fS )zuReturn token indices and the vocabulary of the time machine dataset.

    Defined in :numref:`sec_text_preprocessing`r  c                    s   g | ]}|D ]} | qqS r   r   r  vocabr   r	   r   T  s       z,load_corpus_time_machine.<locals>.<listcomp>r   N)r}  r  r  )
max_tokensr|  r  corpusr   r  r	   load_corpus_time_machineK  s    
r  c           
      #   s    t dd d  t d  }ttd| }t |  fdd|| }td|| |D ]N}||||  }fdd|D }fdd|D }	t|t|	fV  qldS )	zhGenerate a minibatch of subsequences using random sampling.

    Defined in :numref:`sec_language_model`r   r'   Nc                    s    | |   S r   r   )pos)r  	num_stepsr   r	   rj   i  s    z"seq_data_iter_random.<locals>.datac                    s   g | ]} |qS r   r   r}   r8  r   r   r	   r   r  s     z(seq_data_iter_random.<locals>.<listcomp>c                    s   g | ]} |d  qS )r'   r   r  r   r   r	   r   s  s     )rU   randintr0   r+   r   rm   r   tensor)
r  rd   r  num_subseqsinitial_indicesnum_batchesr~   initial_indices_per_batchr-   r4   r   )r  rj   r  r	   seq_data_iter_randomY  s    
r  c                 c   s   t d|}t| | d | | }t| |||  }t| |d |d |  }t||df}t||df}|jd | }td|| |D ]>}|dd||| f }	|dd||| f }
|	|
fV  qdS )zpGenerate a minibatch of subsequences using sequential partitioning.

    Defined in :numref:`sec_language_model`r   r'   rA   N)rU   r  r0   r   r  rX   rO   r   )r  rd   r  offset
num_tokensXsYsr  r~   r-   r4   r   r   r	   seq_data_iter_sequentialv  s    r  c                   @   s    e Zd ZdZdd Zdd ZdS )SeqDataLoaderz"An iterator to load sequence data.c                 C   s:   |rt j| _nt j| _t |\| _| _|| | _| _dS )z'Defined in :numref:`sec_language_model`N)	r   r  data_iter_fnr  r  r  r  rd   r  )r=   rd   r  use_random_iterr  r   r   r	   r>     s
    
zSeqDataLoader.__init__c                 C   s   |  | j| j| jS r   )r  r  rd   r  r<   r   r   r	   __iter__  s    zSeqDataLoader.__iter__N)rJ   rK   rL   rM   r>   r  r   r   r   r	   r    s   	r  F'  c                 C   s   t | |||}||jfS )zpReturn the iterator and the vocabulary of the time machine dataset.

    Defined in :numref:`sec_language_model`)r  r  )rd   r  r  r  r   r   r   r	   load_data_time_machine  s       r  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	RNNModelScratchz%A RNN Model implemented from scratch.c                 C   s,   || | _ | _|| | _| _|||| _dS )z$Defined in :numref:`sec_rnn_scratch`N)
vocab_sizenum_hiddens
init_state
forward_fnr   )r=   r  r  r  r  
get_paramsr   r   r	   r>     s    zRNNModelScratch.__init__c                 C   s2   t t || j}t |t j}| ||| jS r   )rT   one_hot	transposer  r   float32r  r   )r=   r-   stater   r   r	   r     s    zRNNModelScratch.__call__c                 O   s   |  || jS r   )r  r  )r=   rd   r   kwargsr   r   r	   begin_state  s    zRNNModelScratch.begin_stateN)rJ   rK   rL   rM   r>   r   r  r   r   r   r	   r    s   r  c                    s   |j dtjd}| d  g  fdd}| dd D ]"}|| |\}} |  q6t|D ]4}|| |\}} t| jddd qbd	fd	d
 D S )zYGenerate new characters following the `prefix`.

    Defined in :numref:`sec_rnn_scratch`r'   rd   r   r   c                      s   t t  d gd S )NrA   )r'   r'   )r   rX   r  r   r   )outputsr   r	   r     r  zpredict_ch8.<locals>.<lambda>Nr    c                    s   g | ]} j | qS r   r  r|   r  r   r	   r     s     zpredict_ch8.<locals>.<listcomp>)
r  rT   r  rB   r   r{   r   r   rX   r  )prefix	num_predsr   r  r  	get_inputr7   r   r   )r  r  r	   predict_ch8  s    "r  c                 C   s   t j|t jd}g }| D ],}t|t jr:|t | q|| qt jt	dd |D }t 
|t j}t ||rt|D ]\}}|| | ||< qn|}|S )z<Clip the gradient.

    Defined in :numref:`sec_rnn_scratch`r   c                 s   s    | ]}t |d   V  qdS )r^   N)rT   r   r   )r}   rf   r   r   r	   	<genexpr>  s   z grad_clipping.<locals>.<genexpr>)rT   constantr  r*   ZIndexedSlicesrB   Zconvert_to_tensormathsqrtrD   r   greaterr   )rb   thetanew_gradrf   normr~   r   r   r	   grad_clipping  s    
r  c              
   C   s   dt   }}t d}|D ]\}}	|dks0|rF| j|jd tjd}tjdd0}
| ||\}}t t	|	d}|||}W 5 Q R X | j
}|
||}t|d}|t|| ||t | t | qt|d |d  |d |  fS )	z`Train a model within one epoch (defined in Chapter 8).

    Defined in :numref:`sec_rnn_scratch`Nr^   r   r  T)
persistentrA   r'   )r   r9   r   r  rO   rT   r  r   rX   r  r   r   r  r   r2   r   r   r  exprC   )r   r   r   r   r  r  r;  r   r-   r4   gr_   r7   r   ra   rb   r   r   r	   train_epoch_ch8  s    

r  c              	      s   |  $ tjjjdd}tjj|}W 5 Q R X tjdddgd|gd}	 fdd	}
t	|D ]F}t
 ||||\}}|d
 d dkr`t|
d |	|d
 |g q`t j}td|dd|ddt|  t|
d t|
d dS )zOTrain a model (defined in Chapter 8).

    Defined in :numref:`sec_rnn_scratch`TrL  r   
perplexitytrain
   )r   r   r   r   c                    s   t | d S )N2   )r  )r  r   r  r   r	   r     r  ztrain_ch8.<locals>.<lambda>r'   r   ztime travellerzperplexity rB  ,  tokens/sec on 	travellerN)rS  rT   r   r   rU  r   rT  r   r   r   r  r  r   r0  rQ  rG  )r   r   r  rc   r   rX  r  r   r   r   predictr   pplspeedr/  r   r  r	   	train_ch8  s&    
 

"r  c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )RNNModelz$Defined in :numref:`sec_rnn-concise`c                    s2   t t| jf | || _|| _tjj|| _	d S r   )
r`  r  r>   rnnr  rT   r   ra  Densedense)r=   	rnn_layerr  r  rk  r   r	   r>     s    zRNNModel.__init__c                 C   sH   t t || j}| ||^}}| t |d|jd f}||fS )NrA   )rT   r  r  r  r  r  rX   rO   )r=   inputsr  r-   r4   outputr   r   r	   ro    s    zRNNModel.callc                 O   s   | j jj||S r   )r  cellZget_initial_state)r=   r   r  r   r   r	   r    s    zRNNModel.begin_state)rJ   rK   rL   rM   r>   ro  r  rq  r   r   rk  r	   r    s   r  zfra-eng.zip(94646ad1522d915e7b0f9296181140edcf86a4f5fra-engc               
   C   s>   t d} ttj| dd}| W  5 Q R  S Q R X dS )zRLoad the English-French dataset.

    Defined in :numref:`sec_machine_translation`r  zfra.txtr  N)r   r#  r  r   r  r  r  )r   r  r   r   r	   read_data_nmt  s    
r  c                    sB   dd   dd dd  fddtD }d|S )	zXPreprocess the English-French dataset.

    Defined in :numref:`sec_machine_translation`c                 S   s   | t dko|dkS )Nz,.!?rt  )set)r  	prev_charr   r   r	   no_space%  s    z preprocess_nmt.<locals>.no_spaceu    rt      c                    s6   g | ].\}}|d kr. ||d  r.d| n|qS )r   r'   rt  r   )r}   r~   r  r  textr   r	   r   ,  s   z"preprocess_nmt.<locals>.<listcomp>r  )replacerx  r   r  )r  outr   r  r	   preprocess_nmt!  s    r  c                 C   sx   g g  }}t | dD ]V\}}|r0||kr0 qp|d}t|dkr||d d ||d d q||fS )zVTokenize the English-French dataset.

    Defined in :numref:`sec_machine_translation`r   	r^   r   rt  r'   )r   r  r0   rB   )r  r[   sourcetargetr~   rz  partsr   r   r	   tokenize_nmt0  s    

r  c                 C   st   t   t jdd |D dd |D g\}}}t j| t j| |d jD ]}|d qTt j|  dS )z[Plot the histogram for list length pairs.

    Defined in :numref:`sec_machine_translation`c                 S   s   g | ]}t |qS r   r0   r}   r   r   r   r	   r   D  s     z+show_list_len_pair_hist.<locals>.<listcomp>r'   r   N)	r   r   r   histr   r   patches	set_hatchr   )r   r   r   xlistylistr   r   patchr   r   r	   show_list_len_pair_hist>  s    
r  c                 C   s.   t | |kr| d| S | |g|t |    S )zLTruncate or pad sequences.

    Defined in :numref:`sec_machine_translation`Nr  )rz  r  padding_tokenr   r   r	   truncate_padK  s    r  c                    sd   fdd| D } fdd| D } t  fdd| D }t t |d kt jd}||fS )zrTransform text sequences of machine translation into minibatches.

    Defined in :numref:`subsec_mt_data_loading`c                    s   g | ]} | qS r   r   r  r  r   r	   r   W  s     z#build_array_nmt.<locals>.<listcomp>c                    s   g | ]}| d  g qS )<eos>r   r  r  r   r	   r   X  s     c                    s   g | ]}t | d  qS )<pad>)r  r  r  r  r   r	   r   Y  s     r	  r'   )r   r  r   r   r   )r|  r  r  rG   	valid_lenr   r
  r	   build_array_nmtS  s     r  X  c                 C   s   t t }t||\}}tj|ddddgd}tj|ddddgd}t|||\}}	t|||\}
}||	|
|f}t|| }|||fS )zuReturn the iterator and the vocabularies of the translation dataset.

    Defined in :numref:`subsec_mt_data_loading`r^   r	  <bos>r  )r  r  )r  r  r  r   r  r  rr   )rd   r  r[   r  r  r  	src_vocab	tgt_vocab	src_arraysrc_valid_len	tgt_arraytgt_valid_lenro   r   r   r   r	   load_data_nmt_  s    
r  c                       s(   e Zd ZdZ fddZdd Z  ZS )Encoderz@The base encoder interface for the encoder-decoder architecture.c                    s   t t| jf | d S r   )r`  r  r>   r=   r  rk  r   r	   r>   q  s    zEncoder.__init__c                 O   s   t d S r   NotImplementedError)r=   r-   r   r  r   r   r	   ro  t  s    zEncoder.callrp  r   r   rk  r	   r  o  s   r  c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )DecoderznThe base decoder interface for the encoder-decoder architecture.

    Defined in :numref:`sec_encoder-decoder`c                    s   t t| jf | d S r   )r`  r  r>   r  rk  r   r	   r>   {  s    zDecoder.__init__c                 G   s   t d S r   r  )r=   enc_outputsr   r   r   r	   r  ~  s    zDecoder.init_statec                 K   s   t d S r   r  )r=   r-   r  r  r   r   r	   ro    s    zDecoder.call)rJ   rK   rL   rM   r>   r  ro  rq  r   r   rk  r	   r  w  s   r  c                       s(   e Zd ZdZ fddZdd Z  ZS )EncoderDecoderzbThe base class for the encoder-decoder architecture.

    Defined in :numref:`sec_encoder-decoder`c                    s"   t t| jf | || _|| _d S r   )r`  r  r>   encoderdecoder)r=   r  r  r  rk  r   r	   r>     s    zEncoderDecoder.__init__c                 O   s4   | j |f||}| jj|f| }| j||f|S r   )r  r  r  )r=   enc_Xdec_Xr   r  r  	dec_stater   r   r	   ro    s    zEncoderDecoder.callrp  r   r   rk  r	   r    s   r  c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )Seq2SeqEncoderzXThe RNN encoder for sequence to sequence learning.

    Defined in :numref:`sec_seq2seq`r   c                    sV   t  j|  tjj||| _tjjjtjj fddt	|D ddd| _
d S )Nc                    s   g | ]}t jjj d qS ))dropout)rT   r   ra  GRUCellr   r#  r  r   r	   r     s   z+Seq2SeqEncoder.__init__.<locals>.<listcomp>T)Zreturn_sequencesZreturn_state)r`  r>   rT   r   ra  	Embedding	embeddingRNNZStackedRNNCellsr   r  )r=   r  
embed_sizer  
num_layersr#  r  rk  r%  r	   r>     s    zSeq2SeqEncoder.__init__c                 O   s0   |  |}| j|f|}|dd  }|d |fS )Nr'   r   )r'  r  )r=   r-   r   r  r  r  r   r   r	   ro    s    
zSeq2SeqEncoder.call)r   rp  r   r   rk  r	   r"    s   	r"  c                 C   s|   | j d }tjd|tjddddf tj|dddf tjdk }t| j dkrjttj|dd| |S t|| |S dS )	zSMask irrelevant entries in sequences.

    Defined in :numref:`sec_seq2seq_decoder`r'   r   )r;   limitr   Nr   r   rA   r   )rO   rT   r   r  r   r0   wherer   )r-   r  valuemaxlenmaskr   r   r	   sequence_mask  s    

r0  c                       s(   e Zd ZdZ fddZdd Z  ZS )MaskedSoftmaxCELosszXThe softmax cross-entropy loss with masks.

    Defined in :numref:`sec_seq2seq_decoder`c                    s   t  jdd || _d S )Nnone)	reduction)r`  r>   r  )r=   r  rk  r   r	   r>     s    zMaskedSoftmaxCELoss.__init__c                 C   s^   t j|t jd}t|| j}t j||jd d}t jjj	ddd||}t j
|| dd}|S )	Nr   rA   )depthTr2  )rM  r3  r'   r   )rT   	ones_liker  r0  r  r  rO   r   r   ZCategoricalCrossentropyreduce_mean)r=   labelr   weightsZlabel_one_hotunweighted_lossweighted_lossr   r   r	   ro    s      zMaskedSoftmaxCELoss.callrp  r   r   rk  r	   r1    s   r1  c                 C   s  t jjj|d}tjddd|gd}t|D ]*}t }	td}
|D ]}dd |D \}}}}t j	t 
|d	 g|jd
  dd}t ||ddddf gd}t  (}| |||dd\}}t|||}W 5 Q R X ||| j}t|d}|t|| j t | }|
t || qH|d d d
kr,||d |
d
 |
d  f q,td|
d
 |
d  dd|
d |	  ddt|  dS )zUTrain a model for sequence to sequence.

    Defined in :numref:`sec_seq2seq_decoder`rJ  r   r   r  )r   r   r   r^   c                 S   s   g | ]}|qS r   r   )r}   r6   r   r   r	   r     s     z!train_seq2seq.<locals>.<listcomp>r  r   rP   rN   NrA   r'   Ttrainingr@  rA  r  rB  r  )rT   r   r   Adamr   r   r   r9   r   rX   r  rO   concatr   r1  r   r   r  r   r2   r   r   r   r  rC   rG  )r   r   rc   r   r  r/  rN  r   r   r;  r   rn   r-   X_valid_lenr4   Y_valid_lenbos	dec_inputr   Y_hatr   r   	gradientsr  r   r   r	   train_seq2seq  s0    
 
 rE  c                 C   s"  ||  d |d g }tt|g}t|||d }tj|dd}| j||dd}	| j	
|	|}
tjt|d gdd}g g  }}t|D ]d}| j	||
dd\}}
tj|d	d}tj|dd}|r|| j	j ||d kr q||  qd|tj|d
d  |fS )zPPredict for sequence to sequence.

    Defined in :numref:`sec_seq2seq_training`rt  r  r	  r   r   Fr;  r  r^   rA   rN   )rx  r  rT   r  r0   r   r  r   r  r  r  r   r   squeezerB   attention_weightsr   r  r  rX   rI   )r   src_sentencer  r  r  save_attention_weights
src_tokensenc_valid_lenr  r  r!  r   
output_seqattention_weight_seqr   r4   r   r   r   r	   predict_seq2seq  s(    
rN  c              	   C   s"  |  d| d }}t|t| }}ttdd||  }td|d D ]}dtt }	}
t|| d D ]&}|
d	||||    d7  < qrt|| d D ]L}|
d	||||   dkr|	d7 }	|
d	||||    d8  < q|t
|	|| d  t
d|9 }qN|S )z@Compute the BLEU.

    Defined in :numref:`sec_seq2seq_training`rt  r   r'   r   )r  r0   r  r  minr   r  r   r{   r  pow)pred_seq	label_seqkpred_tokenslabel_tokenslen_pred	len_labelscorer   num_matches
label_subsr~   r   r   r	   bleu  s    $$&r[  r   r   Redsc                 C   s   t   | jd | jd  }}t jj|||dddd\}}	tt|	| D ]v\}
\}}tt||D ]Z\}\}}|jt ||d}|
|d kr|	| |dkr|
| |rb|||  qbqH|j||	dd d	S )
zGShow heatmaps of matrices.

    Defined in :numref:`sec_attention-cues`r   r'   TF)r   sharexshareyrF  )cmapg333333?)r   shrinkN)r   r
   rO   r   r   r   r2   r   r   r   r   r   colorbar)matricesr   r   r   r   r`  r   r   r   r   r~   row_axesrow_matricesr8  r   matrixpcmr   r   r	   show_heatmaps  s"      


rh  c                 C   s   |dkrt jj| ddS | j}t|jdkr@t j||d d}nt j|dd}tjt j| d|d fd|dd} t jjt j| |dddS dS )	zyPerform softmax operation by masking elements on the last axis.

    Defined in :numref:`sec_attention-scoring-functions`NrA   r   r'   )repeatsrN   g    .)r-  )	rT   nnsoftmaxrO   r0   repeatrX   r   r0  )r-   
valid_lensrO   r   r   r	   masked_softmax*  s    "rn  c                       s(   e Zd ZdZ fddZdd Z  ZS )AdditiveAttentionzMAdditive attention.

    Defined in :numref:`sec_attention-scoring-functions`c                    s^   t  jf | tjjj|dd| _tjjj|dd| _tjjjddd| _tjj	|| _
d S )NFuse_biasr'   )r`  r>   rT   r   ra  r  W_kW_qw_vDropoutr#  )r=   key_size
query_sizer  r#  r  rk  r   r	   r>   A  s
    zAdditiveAttention.__init__c                 K   sv   |  || | }}tj|ddtj|dd }tj|}tj| |dd}t||| _	t
| j| j	f||S )Nr^   r   r'   rA   )rs  rr  rT   r   rj  tanhrF  rt  rn  rG  rW   r#  )r=   querieskeysvaluesrm  r  featuresscoresr   r   r	   ro  H  s     zAdditiveAttention.callrp  r   r   rk  r	   ro  =  s   ro  c                       s(   e Zd ZdZ fddZdd Z  ZS )DotProductAttentionzQScaled dot product attention.

    Defined in :numref:`subsec_additive-attention`c                    s"   t  jf | tjj|| _d S r   )r`  r>   rT   r   ra  ru  r#  )r=   r#  r  rk  r   r	   r>   _  s    zDotProductAttention.__init__c                 K   sV   |j d }tj||ddtjtj|tjd }t||| _t| j	| jf||S )NrA   T)transpose_br   )
rO   rT   rW   r  r  r   r  rn  rG  r#  )r=   ry  rz  r{  rm  r  dr}  r   r   r	   ro  h  s    
zDotProductAttention.callrp  r   r   rk  r	   r~  [  s   	r~  c                       s,   e Zd ZdZ fddZedd Z  ZS )AttentionDecoderz[The base attention-based decoder interface.

    Defined in :numref:`sec_seq2seq_attention`c                    s   t t| jf | d S r   )r`  r  r>   r  rk  r   r	   r>   s  s    zAttentionDecoder.__init__c                 C   s   t d S r   r  r<   r   r   r	   rG  v  s    z"AttentionDecoder.attention_weights)rJ   rK   rL   rM   r>   r  rG  rq  r   r   rk  r	   r  o  s   r  c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )MultiHeadAttentionzGMulti-head attention.

    Defined in :numref:`sec_multihead-attention`Fc           	         st   t  jf | || _t|| _tjjj	||d| _
tjjj	||d| _tjjj	||d| _tjjj	||d| _d S )Nrp  )r`  r>   	num_headsr   r~  	attentionrT   r   ra  r  rs  rr  W_vW_o)	r=   rv  rw  
value_sizer  r  r#  biasr  rk  r   r	   r>   ~  s    zMultiHeadAttention.__init__c                 K   sz   t | || j}t | || j}t | || j}|d k	rPtj|| jdd}| j||||f|}t|| j}| 	|S )Nr   )ri  r   )
transpose_qkvrs  r  rr  r  rT   rl  r  transpose_outputr  )r=   ry  rz  r{  rm  r  r  output_concatr   r   r	   ro    s    zMultiHeadAttention.call)Frp  r   r   rk  r	   r  z  s    
r  c                 C   sP   t j| | jd | jd |dfd} t j| dd} t j| d| jd | jd fdS )	zuTransposition for parallel computation of multiple attention heads.

    Defined in :numref:`sec_multihead-attention`r   r'   rA   rN   r   r^   r'   r   permr^   r   rT   rX   rO   r  r-   r  r   r   r	   r    s    	"r  c                 C   sP   t j| d|| jd | jd fd} t j| dd} t j| | jd | jd dfdS )z[Reverse the operation of `transpose_qkv`.

    Defined in :numref:`sec_multihead-attention`rA   r'   r^   rN   r  r  r   r  r  r   r   r	   r    s    "r  c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )PositionalEncodingzYPositional encoding.

    Defined in :numref:`sec_self-attention-and-positional-encoding`rh   c              
      s   t    tjj|| _td||f| _	tj
|tjdddtdtj
d|dtjd|  }t|| j	d d d d dd df< t|| j	d d d d dd df< d S )Nr'   r   rA   r  r   r^   )r`  r>   rT   r   ra  ru  r#  rF   rS   Paranger  rX   powersincos)r=   r  r#  max_lenr-   rk  r   r	   r>     s$    
 
   $zPositionalEncoding.__init__c                 K   s4   || j d d d |jd d d f  }| j|f|S r  )r  rO   r#  )r=   r-   r  r   r   r	   ro    s    &zPositionalEncoding.call)rh   rp  r   r   rk  r	   r    s   r  c                       s(   e Zd ZdZ fddZdd Z  ZS )PositionWiseFFNzLPositionwise feed-forward network.

    Defined in :numref:`sec_transformer`c                    s>   t  j|  tjj|| _tjj | _tjj|| _	d S r   )
r`  r>   rT   r   ra  r  dense1ReLUrn  dense2)r=   ffn_num_hiddensffn_num_outputsr  rk  r   r	   r>     s    zPositionWiseFFN.__init__c                 C   s   |  | | |S r   )r  rn  r  )r=   r-   r   r   r	   ro    s    zPositionWiseFFN.callrp  r   r   rk  r	   r    s   r  c                       s(   e Zd ZdZ fddZdd Z  ZS )AddNormz^Residual connection followed by layer normalization.

    Defined in :numref:`sec_transformer`c                    s2   t  jf | tjj|| _tjj|| _d S r   )	r`  r>   rT   r   ra  ru  r#  ZLayerNormalizationln)r=   normalized_shaper#  r  rk  r   r	   r>     s    zAddNorm.__init__c                 K   s   |  | j|f|| S r   )r  r#  )r=   r-   r4   r  r   r   r	   ro    s    zAddNorm.callrp  r   r   rk  r	   r    s   r  c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )EncoderBlockzDTransformer encoder block.

    Defined in :numref:`sec_transformer`Fc
              	      sN   t  jf |
 t|||||||	| _t||| _t||| _t||| _	d S r   )
r`  r>   r   r  r  r  addnorm1r  ffnaddnorm2)r=   rv  rw  r  r  
norm_shaper  r  r#  r  r  rk  r   r	   r>     s      zEncoderBlock.__init__c                 K   s6   | j || j||||f|f|}| j|| |f|S r   )r  r  r  r  )r=   r-   rm  r  r4   r   r   r	   ro    s     zEncoderBlock.call)Frp  r   r   rk  r	   r    s    	r  c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )TransformerEncoderz>Transformer encoder.

    Defined in :numref:`sec_transformer`Fc              	      s`   t  jf | | _tjj|| _t	| _
 f	ddt|	D | _d S )Nc                    s$   g | ]}t  	qS r   )r  r   	r  r#  r  rv  r  r  r  rw  r  r   r	   r     s          z/TransformerEncoder.__init__.<locals>.<listcomp>)r`  r>   r  rT   r   ra  r&  r'  r   r  pos_encodingr   blks)r=   r  rv  rw  r  r  r  r  r  r*  r#  r  r  rk  r  r	   r>     s    zTransformerEncoder.__init__c                 K   sv   | j | |tjtj| jtjd f|}d gt| j	 | _
t| j	D ]&\}}|||f|}|jjj
| j
|< qJ|S )Nr   )r  r'  rT   r  r  r   r  r  r0   r  rG  r   r  )r=   r-   rm  r  r~   blkr   r   r	   ro    s    zTransformerEncoder.call)Frp  r   r   rk  r	   r    s    r  c                 C   s"   t j j| ||tddd d S )Nz->)
arrowstyle)xyxytext
arrowprops)r   r   r/   annotatedict)r  r  r  r   r   r	   r    s    r     c           	      C   s   d\}}}}||fg}t |D ]F}|r@| |||||\}}}}n| ||||\}}}}|||f qtd|d  dt|ddt|d |S )zlOptimize a 2D objective function with a customized trainer.

    Defined in :numref:`subsec_gd-learningrate`)r   r   zepoch r'   z, x1: r  z, x2: )r   rB   r  r   )	trainerstepsf_gradx1x2s1s2resultsr~   r   r   r	   train_2d  s    
*r  c                 C   s|   t   t jjt| dddi t t dddt ddd\}}t jj||| ||dd	 t jd
 t j	d dS )zdShow the trace of 2D variables during optimization.

    Defined in :numref:`subsec_gd-learningrate`-ocolorz#ff7f0eg      g      ?g?g      z#1f77b4)colorsr  r  N)r  )
r   r   r   r3   r2   meshgridr  contourr   r   )r  r  r  r  r   r   r	   show_trace_2d,  s    r  zairfoil_self_noise.dat(76e5be1548fd8222e5074cf0faae75edff8cf93fairfoilr    c                 C   sv   t jtdt jdd}||jdd |jdd }tj|d|ddf |d|df f| dd	}||jd
 d
 fS )$Defined in :numref:`sec_minibatches`r  r  )r   	delimiterr   r   NrA   T)rp   r'   )	rF   
genfromtxtr   r  r  meanstdrr   rO   )rd   r   rj   r   r   r   r	   get_data_ch11;  s     & r  r^   c                    s  t jt jj|dfdddddt jt ddd  fddtj }}tjd	d
d|gddgd}dt  }	}
t	|D ]}|D ]\}}t 
 }t j||||}W 5 Q R X || g\}}|  g||g|| |	|jd 7 }	|	d dkr|
  |	|jd  }|t jj|  }t|||f}||| |
  qqztd|jd d dd|
 dd |
 |jd fS )r  r'   r   rQ   )rO   r  rR   T)	trainablec                    s   t |  S r   )r   r]   r,   rZ   rY   r   r	   r   M  r  ztrain_ch11.<locals>.<lambda>r   r   )\(?ffffff?r   r   r   r      loss: rA   rA  r  
 sec/epoch)rT   r4  rU   rV   rS   r   r`   r   r9   r   r   r  r6  r   rO   rC   rj   r-  rF  r   r   r   r;   r  r4   rE   rH   )
trainer_fnstateshyperparamsr   feature_dimr   r   r   r   r   r;  r   r-   r7   r  r   dwdbpqr  r   r  r	   
train_ch11D  s:      
 (r  c                 C   sf  t j }|t jjjdt jddd | f |}t jj }t	j
ddd|gdd	gd
}dt	  }}	t|D ]}
|D ]\}}t  *}||}|||}|j}|||}W 5 Q R X |t|| ||jd 7 }|d dkrx|	  ||jd  }|t jj|  }t	|||d f}||| |	  qxqptd|jd d dd|	 dd dS )r  r'   rQ   )rR   )Zkernel_initializerr   r   r   r  r  r  r  r^   r  rA   rA  r  r  N)rT   r   
Sequentialr   ra  r  Zrandom_normal_initializerr   ZMeanSquaredErrorr   r   r9   r   r   r   r   r   r2   rO   rC   rj   r-  rF  r   r   r;   r  r4   rE   )r  r  r   r   r   rN  r   r   r   r;  r   r-   r7   r  r  r   ra   rb   r  r  r  r   r   r	   train_concise_ch11d  s8    


 

r  c                   @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )	BenchmarkzFor measuring running time.Donec                 C   s
   || _ dS )z"Defined in :numref:`sec_hybridize`N)description)r=   r  r   r   r	   r>     s    zBenchmark.__init__c                 C   s   t  | _| S r   )r   r9   r;  r<   r   r   r	   	__enter__  s    
zBenchmark.__enter__c                 G   s"   t | j d| j dd d S )Nz: z.4fz sec)r  r  r;  rC   r   r   r   r	   __exit__  s    zBenchmark.__exit__N)r  )rJ   rK   rL   rM   r>   r  r  r   r   r   r	   r    s   
r  c           	      C   s   | dddf | dddf | dddf | dddf f\}}}}|| d }|| d }|| }|| }t j||||fdd} | S )zeConvert from (upper-left, lower-right) to (center, width, height).

    Defined in :numref:`sec_bbox`Nr   r'   r^   r   rA   r   r   stack)	boxesr  y1r  y2cxcyrY   r7  r   r   r	   box_corner_to_center  s    Dr  c           	      C   s   | dddf | dddf | dddf | dddf f\}}}}|d|  }|d|  }|d|  }|d|  }t j||||fdd} | S )	zeConvert from (center, width, height) to (upper-left, lower-right).

    Defined in :numref:`sec_bbox`Nr   r'   r^   r   r   rA   r   r  )	r  r  r  rY   r7  r  r  r  r  r   r   r	   box_center_to_corner  s    Dr  c                 C   s<   t jj| d | d f| d | d  | d | d  d|ddS )zMConvert bounding box to matplotlib format.

    Defined in :numref:`sec_bbox`r   r'   r^   r   F)r  widthheightfill	edgecolor	linewidth)r   r   	Rectangle)bboxr  r   r   r	   bbox_to_rect  s        r  c              	   C   s   | j d }t|f}t|f}||}	t >}
|| }||	}||t|||t| | d }W 5 Q R X |
||j}|t	||j |S )z=Update discriminator.

    Defined in :numref:`sec_basic_gan`r   r^   )
rO   rT   onesrS   r   rF  r   r   r   r2   )r-   Znet_Dnet_Gr   Zoptimizer_Drd   r  rS   fake_Xr   real_Yfake_Yloss_DZgrads_Dr   r   r	   update_D  s$    

 r  c              	   C   sr   | j d }t|f}t *}|| }||}	||t|	| }
W 5 Q R X ||
|j}|t||j |
S )z9Update generator.

    Defined in :numref:`sec_basic_gan`r   )	rO   rT   r  r   rF  r   r   r   r2   )r  r  r  r   Zoptimizer_Grd   r  r   r  r  loss_GZgrads_Gr   r   r	   update_G  s    

r  zpokemon.zip(c065c0e2593b8b161a2d7873e42418bf6a21106cpokemonc                 C   s   t |  S r   )rT   r   r   )r   r   r   r	   r     r  r   c                 O   s   | j ||S r   )r   )r6   r   r  r   r   r	   r     r  )r   )NNNNNNr#   r#   r$   r   N)T)Nr   )N)r   )N)r   )r~  )rA   )Fr  )F)N)r  )r   )F)Nr\  r]  )r  N)r  r  )r^   )r^   )r  r   DATA_URLr   rF   
tensorflowrT   r   Model	nn_Moduler  r  r  r   rU   ru  shutilsysr  r?   r  r   pandaspdr  IPythonr   
matplotlibr   r   matplotlib_inliner   modulesrJ   r   r
   r   r"   r3   r9   r\   r]   r`   rg   rr   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r#  r$  r0  r3  r9  rP  ZCallbackr:  rZ  r[  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  ra  ZLayerr  r  r  r  r  r  r  r  r  r  r  r"  r0  r   r   r1  rE  rN  r[  rh  rn  ro  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   rX   r  rS   r  r  sinhr  coshrx  linspacer  rV   uniformrandrW   r   r   r  r  r   r  r   r   r   r  r  r>  r  abseyer   r   r   r	   <module>   sZ  

           
!



		)






,

   
	 




 
   
&



 
 

