def get_theano_variables(self, inputs=None, outputs=None): """ Returns a dict containing inputs, outputs and graph corresponding to the Theano version of the pyfn. """ inputs = utils.as_seq(inputs, tuple) sym_inputs = [self.get_symbolic(x) for x in inputs] outputs = utils.as_seq(outputs, tuple) sym_outputs = [self.get_symbolic(x) for x in outputs] # get symbolic inputs corresponding to shared inputs in s_inputs s_memo = OrderedDict((arg, arg.type()) for arg in utils.flat_from_doc(sym_inputs)) theano_inputs = tuple(s_memo.values()) # get new graph, replacing shared inputs with symbolic ones graph = theano.gof.graph.clone_get_equiv( theano.gof.graph.inputs(sym_outputs), sym_outputs, memo=s_memo.copy()) # get symbolic outputs theano_outputs = tuple([graph[o] for o in sym_outputs]) return theano_inputs, theano_outputs, graph
def get_theano_variables(self, inputs=None, outputs=None): """ Returns a dict containing inputs, outputs and graph corresponding to the Theano version of the pyfn. """ inputs = utils.as_seq(inputs, tuple) sym_inputs = [self.get_symbolic(x) for x in inputs] outputs = utils.as_seq(outputs, tuple) sym_outputs = [self.get_symbolic(x) for x in outputs] # get symbolic inputs corresponding to shared inputs in s_inputs s_memo = OrderedDict( (arg, arg.type()) for arg in utils.flat_from_doc(sym_inputs)) theano_inputs = tuple(s_memo.values()) # get new graph, replacing shared inputs with symbolic ones graph = theano.gof.graph.clone_get_equiv( theano.gof.graph.inputs(sym_outputs), sym_outputs, memo=s_memo.copy()) # get symbolic outputs theano_outputs = tuple([graph[o] for o in sym_outputs]) return theano_inputs, theano_outputs, graph
def get_theano_vars(self, inputs=None, outputs=None): """ Returns a dict containing inputs, outputs and graph corresponding to the Theano version of the pyfn. """ sym_inputs = tuple(self.get_symbolic(i) for i in utils.as_seq(inputs)) sym_outputs = tuple(self.get_symbolic(o) for o in utils.as_seq(outputs)) # get symbolic inputs corresponding to shared inputs in s_inputs # this dict maps each shared variable to its (non-shared) type. s_memo = OrderedDict((var, var.type()) for var in utils.flatten(sym_inputs)) theano_inputs = tuple(s_memo.values()) # get new graph, replacing shared inputs with symbolic ones # graph is a dict mapping "old" variables to "new" ones, where "old" # is the chain including shared variables, and "new" is the chain # with the non-shared replacements. graph = theano.gof.graph.clone_get_equiv( inputs=theano.gof.graph.inputs(sym_outputs), outputs=sym_outputs, memo=s_memo.copy()) # get symbolic outputs theano_outputs = tuple([graph[o] for o in sym_outputs]) return theano_inputs, theano_outputs, graph
def get_theano_variables(self, inputs=None, outputs=None): """ Returns a dict containing inputs, outputs and graph corresponding to the Theano version of the pyfn. This version of the function returns a single vector input. """ inputs = utils.as_seq(inputs, tuple) outputs = utils.as_seq(outputs, tuple) if inputs: sym_inputs = [self.get_symbolic(x) for x in inputs] else: sym_inputs = self.s_inputs.values() if outputs: sym_outputs = [self.get_symbolic(x) for x in outputs] else: sym_outputs = self.s_outputs.values() if len(sym_outputs) > 1: raise ValueError( 'VectorArg functions should return a single output.') # get symbolic inputs corresponding to shared inputs in s_inputs s_memo = OrderedDict() sym_args = utils.flat_from_doc(sym_inputs) real_args = utils.flat_from_doc(self.all_init_args) # create a symbolic vector, then split it up into symbolic input # args inputs_dtype = self.vector_from_args(self.all_init_args).dtype theano_input = tt.vector(name='theta', dtype=inputs_dtype) i = 0 for sa, ra in zip(sym_args, real_args): if sa.ndim > 0: vector_arg = theano_input[i: i + ra.size].reshape(ra.shape) else: vector_arg = theano_input[i] s_memo[sa] = tt.patternbroadcast( vector_arg.astype(str(sa.dtype)), broadcastable=sa.broadcastable) i += ra.size # get new graph, replacing shared inputs with symbolic ones graph = theano.gof.graph.clone_get_equiv( theano.gof.graph.inputs(sym_outputs), sym_outputs, memo=s_memo.copy()) # get symbolic outputs theano_outputs = graph[sym_outputs[0]] f_in, f_out = self.finalize(theano_input, theano_outputs, graph) return f_in, f_out, graph
def get_theano_variables(self, inputs=None, outputs=None): """ Returns a dict containing inputs, outputs and graph corresponding to the Theano version of the pyfn. This version of the function returns a single vector input. """ inputs = utils.as_seq(inputs, tuple) outputs = utils.as_seq(outputs, tuple) if inputs: sym_inputs = [self.get_symbolic(x) for x in inputs] else: sym_inputs = self.s_inputs.values() if outputs: sym_outputs = [self.get_symbolic(x) for x in outputs] else: sym_outputs = self.s_outputs.values() if len(sym_outputs) > 1: raise ValueError( 'VectorArg functions should return a single output.') # get symbolic inputs corresponding to shared inputs in s_inputs s_memo = OrderedDict() sym_args = utils.flat_from_doc(sym_inputs) real_args = utils.flat_from_doc(self.all_init_args) # create a symbolic vector, then split it up into symbolic input # args inputs_dtype = self.vector_from_args(self.all_init_args).dtype theano_input = tt.vector(name='theta', dtype=inputs_dtype) i = 0 for sa, ra in zip(sym_args, real_args): if sa.ndim > 0: vector_arg = theano_input[i:i + ra.size].reshape(ra.shape) else: vector_arg = theano_input[i] s_memo[sa] = tt.patternbroadcast(vector_arg.astype(str(sa.dtype)), broadcastable=sa.broadcastable) i += ra.size # get new graph, replacing shared inputs with symbolic ones graph = theano.gof.graph.clone_get_equiv( theano.gof.graph.inputs(sym_outputs), sym_outputs, memo=s_memo.copy()) # get symbolic outputs theano_outputs = graph[sym_outputs[0]] f_in, f_out = self.finalize(theano_input, theano_outputs, graph) return f_in, f_out, graph