U C^& @sddlmZddlmZddlmZddlmZmZmZm Z ddlm Z ddl m Z dd d Z e e ejed ed ededddddeddde de ddGdddeZd S))unicode_literals)Model)describe) DimensionSynapsesBiasesGradient)check) has_shapeNcCsZ|jdkr|jd|_|jdkrV|dk rVt|jdkrD|jd|_nt|d|_dS)Nr)nIshapenOlenintmax)modelXyr?/tmp/pip-install-6_kvzl1k/thinc/thinc/neural/_classes/affine.py_set_dimensions_if_needed s   rz Batch sizez Input sizez Output sizezWeights matrixcCs |j|jfSN)rrobjrrrrcCs ||Sr)Zxavier_uniform_init)Wopsrrrrrz Bias vectorcCs|jfSr)rrrrrrrrb)nBrrrr!d_Wd_bc@sheZdZdZdZeddZeddZddd Ze d e d d d Z e d e d dddZ dS)Affinez.Computes the linear transform Y = (W @ X) + b.ZaffinecCs |j|jfSrr"rselfrrr input_shape(szAffine.input_shapecCs |j|jfSr)r"rr'rrr output_shape,szAffine.output_shapeNcKs,tj|f|||_||_|dd|_dS)N drop_factorg?)r__init__rrgetr+)r(rrkwargsrrrr,0szAffine.__init__rr&cCs"|jj||jdd}||j7}|S)NT)Ztrans2)r gemmrr!)r( input__BIoutputrrrpredict6s zAffine.predictcs\jj}dfdd }|dk r:|j9}jj||dd\}}|||fS)Ncsnjj|}jj|djdj|jdd7_j|j}|dk rj|jj jj j d|S)NT)Ztrans1outr)Zaxis)key) r xpascontiguousarrayr/r#r$sumrZ_memweightsZgradientid)Zgrad__BOZsgdZgrad__BIr0r(rr finish_updateAsz*Affine.begin_update..finish_updateT)Zinplace)N)r r6r7r2r+Zdropout)r(r0ZdropZ output__BOr<Z bp_dropoutrr;r begin_update<s   zAffine.begin_update)NN)r3)__name__ __module__ __qualname____doc__namepropertyr)r*r,r argr r2r=rrrrr%s    r%)N) __future__rrrrrrr r r r rZon_data attributesr%rrrrs*