예제 #1
0
 def _opt_fd():
     _od = maybe_call(optimization_step_feed_dict, maybe_eval(self._global_step)) \
         if optimization_step_feed_dict else {}  # e.g. hyper-learning rate is a placeholder
     _oo_fd = maybe_call(outer_objective_feed_dicts, maybe_eval(self._global_step)) \
         if outer_objective_feed_dicts else {}  # this is used in ForwardHG. In ReverseHG should't be needed
     # but it doesn't matter
     return merge_dicts(_od, _oo_fd)
예제 #2
0
    def run(self, T_or_generator, inner_objective_feed_dicts=None, outer_objective_feed_dicts=None,
            initializer_feed_dict=None, global_step=None, session=None, online=False):

        ss = session or tf.get_default_session()

        self._history.clear()
        if not online:
            self._history.append(ss.run(self.initialization, feed_dict=utils.maybe_call(
                initializer_feed_dict, utils.maybe_eval(global_step, ss))))

        for t in range(T_or_generator) if isinstance(T_or_generator, int) else T_or_generator:
            self._history.append(ss.run(self.iteration,
                                        feed_dict=utils.maybe_call(inner_objective_feed_dicts, t)))
        # initialization of support variables (supports stochastic evaluation of outer objective via global_step ->
        # variable)
        ss.run(self._reverse_initializer, feed_dict=utils.maybe_call(outer_objective_feed_dicts,
                                                                     utils.maybe_eval(global_step, ss)))
        for pt, state_feed_dict in self._state_feed_dict_generator(reversed(self._history[:-1])):
            # this should be fine also for truncated reverse... but check again the index t
            t = len(self._history) - pt - 2  # if T is int then len(self.history) is T + 1 and this numerator
            # shall start at T-1  (99.99 sure its correct)
            ss.run(self._alpha_iter,
                   feed_dict=utils.merge_dicts(state_feed_dict,
                                               utils.maybe_call(inner_objective_feed_dicts, t)
                                               if inner_objective_feed_dicts else {}))
예제 #3
0
 def _opt_fd():
     _od = maybe_call(optimization_step_feed_dict, maybe_eval(self._global_step)) \
         if optimization_step_feed_dict else {}  # e.g. hyper-learning rate is a placeholder
     _oo_fd = maybe_call(outer_objective_feed_dicts, maybe_eval(self._global_step)) \
         if outer_objective_feed_dicts else {}  # this is used in ForwardHG. In ReverseHG should't be needed
     # but it doesn't matter
     return merge_dicts(_od, _oo_fd)
예제 #4
0
    def run(self,
            T_or_generator,
            inner_objective_feed_dicts=None,
            outer_objective_feed_dicts=None,
            initializer_feed_dict=None,
            global_step=None,
            session=None,
            online=False,
            callback=None):

        ss = session or tf.get_default_session()

        if online == False:
            self._run_batch_initialization(
                ss,
                utils.maybe_call(initializer_feed_dict,
                                 utils.maybe_eval(global_step, ss)))

        elif online == 'wr':
            self._run_wr_initialization(
                ss,
                utils.maybe_call(initializer_feed_dict,
                                 utils.maybe_eval(global_step, ss)))

        for t in utils.solve_int_or_generator(T_or_generator):
            _fd = utils.maybe_call(inner_objective_feed_dicts, t)
            self._forward_step(ss, _fd)
            utils.maybe_call(callback, t, _fd, ss)
예제 #5
0
    def run(self,
            T_or_generator,
            inner_objective_feed_dicts=None,
            outer_objective_feed_dicts=None,
            initializer_feed_dict=None,
            global_step=None,
            session=None,
            online=False,
            forward_callback=None):

        ss = session or tf.get_default_session()

        self._history.clear()
        if not online:
            _fd = utils.maybe_call(initializer_feed_dict,
                                   utils.maybe_eval(global_step, ss))
            self._history.append(ss.run(self.initialization, feed_dict=_fd))

        else:
            self._history.append(ss.run(self.state))

        # optionally may track inner objective (to check for divergence)

        for t in range(T_or_generator) if utils.isinteger(
                T_or_generator) else T_or_generator:
            _fd = utils.maybe_call(inner_objective_feed_dicts, t)
            self._history.append(ss.run(self.iteration, feed_dict=_fd))
            if forward_callback is not None:
                forward_callback(t, _fd, ss)

        # initialization of support variables (supports stochastic evaluation of outer objective via global_step ->
        # variable)
        # TODO (maybe tf bug or oddity) for some strange reason, if some variable's initializer depends on
        # a placeholder, then the initializer of alpha SEEMS TO DEPEND ALSO ON THAT placeholder,
        # as if the primary variable should be reinitialized as well, but, I've checked, the primary variable is NOT
        # actually reinitialized. This doesn't make sense since the primary variable is already initialized
        # and Tensorflow seems not to care... should maybe look better into this issue
        reverse_init_fd = utils.maybe_call(outer_objective_feed_dicts,
                                           utils.maybe_eval(global_step, ss))
        # now adding also the initializer_feed_dict because of tf quirk...
        maybe_init_fd = utils.maybe_call(initializer_feed_dict,
                                         utils.maybe_eval(global_step, ss))
        if maybe_init_fd is not None:
            reverse_init_fd = utils.merge_dicts(reverse_init_fd, maybe_init_fd)

        ss.run(self._reverse_initializer, feed_dict=reverse_init_fd)
        for pt, state_feed_dict in self._state_feed_dict_generator(
                reversed(self._history[:-1])):
            # this should be fine also for truncated reverse... but check again the index t
            t = len(
                self._history
            ) - pt - 2  # if T is int then len(self.history) is T + 1 and this numerator
            # shall start at T-1
            ss.run(self._alpha_iter,
                   feed_dict=utils.merge_dicts(
                       state_feed_dict,
                       utils.maybe_call(inner_objective_feed_dicts, t)
                       if inner_objective_feed_dicts else {}))
예제 #6
0
    def run(self,
            T_or_generator,
            inner_objective_feed_dicts=None,
            outer_objective_feed_dicts=None,
            initializer_feed_dict=None,
            global_step=None,
            session=None,
            online=False,
            callback=None):
        # callback may be a pair, first for froward pass, second for reverse pass
        callback = utils.as_tuple_or_list(callback)
        # same thing for T
        T_or_generator = utils.as_tuple_or_list(T_or_generator)

        ss = session or tf.get_default_session()

        del self._history[:]
        if not online:
            _fd = utils.maybe_call(initializer_feed_dict,
                                   utils.maybe_eval(global_step, ss))
            self._save_history(ss.run(self.initialization, feed_dict=_fd))

        # else:  # not totally clear if i should add this
        #     self._save_history(ss.run(list(self.state)))

        T = 0  # this is useful if T_or_generator is indeed a generator...
        for t in utils.solve_int_or_generator(T_or_generator[0]):
            # nonlocal t  # with nonlocal would not be necessary the variable T... not compatible with 2.7
            _fd = utils.maybe_call(inner_objective_feed_dicts, t)
            self._save_history(ss.run(self.iteration, feed_dict=_fd))
            utils.maybe_call(callback[0], t, _fd, ss)
            T = t

        # initialization of support variables (supports stochastic evaluation of outer objective via global_step ->
        # variable)
        # TODO (maybe tf bug or oddity) for some strange reason, if some variable's initializer depends on
        # a placeholder, then the initializer of alpha SEEMS TO DEPEND ALSO ON THAT placeholder,
        # as if the primary variable should be reinitialized as well, but, I've checked, the primary variable is NOT
        # actually reinitialized. This doesn't make sense since the primary variable is already initialized
        # and Tensorflow seems not to care... should maybe look better into this issue
        reverse_init_fd = utils.maybe_call(outer_objective_feed_dicts,
                                           utils.maybe_eval(global_step, ss))
        # now adding also the initializer_feed_dict because of tf quirk...
        maybe_init_fd = utils.maybe_call(initializer_feed_dict,
                                         utils.maybe_eval(global_step, ss))
        reverse_init_fd = utils.merge_dicts(reverse_init_fd, maybe_init_fd)
        ss.run(self._reverse_initializer, feed_dict=reverse_init_fd)

        for pt, state_feed_dict in self._state_feed_dict_generator(
                reversed(self._history[:-1]), T_or_generator[-1]):
            # this should be fine also for truncated reverse... but check again the index t
            t = T - pt - 1  # if T is int then len(self.history) is T + 1 and this numerator
            # shall start at T-1
            _fd = utils.merge_dicts(
                state_feed_dict, utils.maybe_call(inner_objective_feed_dicts,
                                                  t))
            ss.run(self._alpha_iter, _fd)
            if len(callback) == 2: utils.maybe_call(callback[1], t, _fd, ss)
예제 #7
0
    def run(self,
            T_or_generator,
            inner_objective_feed_dicts=None,
            outer_objective_feed_dicts=None,
            initializer_feed_dict=None,
            global_step=None,
            session=None,
            online=False,
            forward_callback=None):

        ss = session or tf.get_default_session()

        if not online:
            ss.run(self.initialization,
                   feed_dict=utils.maybe_call(
                       initializer_feed_dict,
                       utils.maybe_eval(global_step, ss)))
            ss.run(self._forward_initializer)

        # optionally may track inner objective (to check for divergence)
        for t in range(T_or_generator) if utils.isinteger(
                T_or_generator) else T_or_generator:
            _fd = utils.maybe_call(inner_objective_feed_dicts, t)
            ss.run(self._z_iter, _fd)
            ss.run(self.iteration, _fd)
            if forward_callback is not None:
                forward_callback(t, _fd, ss)
예제 #8
0
    def run(self,
            T_or_generator,
            inner_objective_feed_dicts=None,
            outer_objective_feed_dicts=None,
            initializer_feed_dict=None,
            global_step=None,
            session=None,
            online=False):

        ss = session or tf.get_default_session()

        if not online:
            ss.run(self.initialization,
                   feed_dict=utils.maybe_call(
                       initializer_feed_dict,
                       utils.maybe_eval(global_step, ss)))
            ss.run(self._forward_initializer)

        for t in range(T_or_generator) if isinstance(T_or_generator,
                                                     int) else T_or_generator:
            # ss.run()
            ss.run(self._z_iter, utils.maybe_call(inner_objective_feed_dicts,
                                                  t))
            ss.run(self.iteration,
                   utils.maybe_call(inner_objective_feed_dicts, t))
예제 #9
0
 def _adjust_step(_t):
     if online:
         _T = utils.maybe_eval(global_step, ss)
         if _T is None:
             _T = 0
         tot_t = T_or_generator[0]
         if not isinstance(tot_t, int): return _t  # when using a generator there is little to do...
         return int(_t + tot_t*_T)
     else: return _t
예제 #10
0
    def run(self,
            T_or_generator,
            inner_objective_feed_dicts=None,
            outer_objective_feed_dicts=None,
            initializer_feed_dict=None,
            global_step=None,
            session=None,
            online=False):

        ss = session or tf.get_default_session()

        self._history = []
        if not online:
            self._history.append(
                ss.run(self.initialization,
                       feed_dict=utils.maybe_call(
                           initializer_feed_dict,
                           utils.maybe_eval(global_step, ss))))

        for t in range(T_or_generator) if isinstance(T_or_generator,
                                                     int) else T_or_generator:
            self._history.append(
                ss.run(self.iteration,
                       feed_dict=utils.maybe_call(inner_objective_feed_dicts,
                                                  t)))
        # initialization of support variables (supports stochastic evaluation of outer objective via global_step ->
        # variable)
        ss.run(self._reverse_initializer,
               feed_dict=utils.maybe_call(outer_objective_feed_dicts,
                                          utils.maybe_eval(global_step, ss)))
        for pt, state_feed_dict in self._state_feed_dict_generator(
                reversed(self._history[:-1])):
            # this should be fine also for truncated reverse... but check again the index t
            t = len(
                self._history
            ) - pt - 2  # if T is int then len(self.history) is T + 1 and this numerator
            # shall start at T-1  (99.99 sure its correct)
            ss.run(self._alpha_iter,
                   feed_dict=utils.merge_dicts(
                       state_feed_dict,
                       utils.maybe_call(inner_objective_feed_dicts, t)
                       if inner_objective_feed_dicts else {}))
예제 #11
0
    def run(self,
            T_or_generator,
            inner_objective_feed_dicts=None,
            outer_objective_feed_dicts=None,
            initializer_feed_dict=None,
            global_step=None,
            session=None,
            online=False,
            callback=None):
        ss = session or tf.get_default_session()

        inner_objective_feed_dicts = utils.as_tuple_or_list(
            inner_objective_feed_dicts)
        if not online:
            self._run_batch_initialization(
                ss,
                utils.maybe_call(initializer_feed_dict,
                                 utils.maybe_eval(global_step, ss)))

        for t in utils.solve_int_or_generator(T_or_generator):
            _fd = utils.maybe_call(inner_objective_feed_dicts[0], t)
            self._forward_step(ss, _fd)
            utils.maybe_call(callback, t, _fd, ss)

        # end of optimization. Solve linear systems.
        tol_val = utils.maybe_call(self.tolerance,
                                   utils.maybe_eval(
                                       global_step,
                                       ss))  # decreasing tolerance (seq.)
        # feed dictionaries (could...in theory, implement stochastic solution of this linear system...)
        _fd = utils.maybe_call(inner_objective_feed_dicts[-1], -1)
        _fd_outer = utils.maybe_call(outer_objective_feed_dicts,
                                     utils.maybe_eval(global_step, ss))
        _fd = utils.merge_dicts(_fd, _fd_outer)

        for lin_sys in self._lin_sys:
            lin_sys(tol_val).minimize(
                ss, _fd)  # implicitly warm restarts with previously found q
예제 #12
0
    def run(self, T_or_generator, inner_objective_feed_dicts=None, outer_objective_feed_dicts=None,
            initializer_feed_dict=None, global_step=None, session=None, online=False):

        ss = session or tf.get_default_session()

        if not online:
            ss.run(self.initialization, feed_dict=utils.maybe_call(
                initializer_feed_dict, utils.maybe_eval(global_step, ss)))
            ss.run(self._forward_initializer)

        for t in range(T_or_generator) if isinstance(T_or_generator, int) else T_or_generator:
            # ss.run()
            ss.run(self._z_iter, utils.maybe_call(inner_objective_feed_dicts, t))
            ss.run(self.iteration, utils.maybe_call(inner_objective_feed_dicts, t))