使用pystencils自动区分和生成torch/tensorflow操作(https://i10git.cs.fau.de/pycodegen/pystencils)
pystencils-autodiff的Python项目详细描述
pystencils_autodiff
使用量
使用pystencils创建一个pystencils.assignmentcollection
importsympyimportpystencilsz,x,y=pystencils.fields("z, y, x: [20,30]")forward_assignments=pystencils.AssignmentCollection({z[0,0]:x[0,0]*sympy.log(x[0,0]*y[0,0])})print(forward_assignments)
Subexpressions:MainAssignments:z[0,0]←y_C*log(x_C*y_C)
然后您可以获得相应的向后分配:
frompystencils.autodiffimportAutoDiffOp,create_backward_assignmentsbackward_assignments=create_backward_assignments(forward_assignments)print(backward_assignments)
你可以看到两个输入的导数乘以输出的梯度。
Subexpressions:MainAssignments: \hat{y}[0,0]←diffz_C*(log(x_C*y_C)+1) \hat{x}[0,0]←diffz_C*y_C/x_C
您还可以使用类autodiffop来获得tensorflow的赋值(如果您有兴趣的话)和自动可微操作…
op=AutoDiffOp(forward_assignments)backward_assignments=op.backward_assignmentsx_tensor=pystencils.autodiff.tf_variable_from_field(x)y_tensor=pystencils.autodiff.tf_variable_from_field(y)tensorflow_op=op.create_tensorflow_op({x:x_tensor,y:y_tensor},backend='tensorflow')
…或火炬:
x_tensor=pystencils.autodiff.torch_tensor_from_field(x,cuda=False,requires_grad=True)y_tensor=pystencils.autodiff.torch_tensor_from_field(y,cuda=False,requires_grad=True)z_tensor=op.create_tensorflow_op({x:x_tensor,y:y_tensor},backend='torch')