def check_fn(*args, **kwargs): if not to_check_train_step(): return fn(*args, **kwargs) net = args[0] # first arg self # get pre-update parameters to compare pre_params = [param.clone() for param in net.parameters()] # run train_step, get loss loss = fn(*args, **kwargs) assert not torch.isnan(loss).any(), loss # get post-update parameters to compare post_params = [param.clone() for param in net.parameters()] if loss == 0.0: # if loss is 0, there should be no updates # TODO if without momentum, parameters should not change too for p_name, param in net.named_parameters(): assert param.grad.norm() == 0 else: # check parameter updates try: assert not all( torch.equal(w1, w2) for w1, w2 in zip(pre_params, post_params) ), f'Model parameter is not updated in train_step(), check if your tensor is detached from graph. Loss: {loss:g}' logger.info( f'Model parameter is updated in train_step(). Loss: {loss: g}' ) except Exception as e: logger.error(e) if os.environ.get('PY_ENV') == 'test': # raise error if in unit test raise (e) # check grad norms min_norm, max_norm = 0.0, 1e5 for p_name, param in net.named_parameters(): try: grad_norm = param.grad.norm() assert min_norm < grad_norm < max_norm, f'Gradient norm for {p_name} is {grad_norm:g}, fails the extreme value check {min_norm} < grad_norm < {max_norm}. Loss: {loss:g}. Check your network and loss computation.' except Exception as e: logger.warning(e) logger.info(f'Gradient norms passed value check.') logger.debug('Passed network parameter update check.') # store grad norms for debugging net.store_grad_norms() return loss
def _transform_sysact_in(cls, action): new_action = {} if not isinstance(action, dict): logger.warning(f'illegal da: {action}') return new_action for act in action.keys(): if not isinstance(act, str) or '-' not in act: logger.warning(f'illegal act: {act}') continue if 'general' not in act: (dom, intent) = act.lower().split('-') if dom in REF_SYS_DA_M.keys(): new_list = [] for pairs in action[act]: if (not isinstance(pairs, list) and not isinstance(pairs, tuple)) or\ (len(pairs) < 2) or\ (not isinstance(pairs[0], str) or (not isinstance(pairs[1], str) and not isinstance(pairs[1], int))): logger.warning(f'illegal pairs: {pairs}') continue if REF_SYS_DA_M[dom].get(pairs[0].lower(), None) is not None: new_list.append([REF_SYS_DA_M[dom][pairs[0].lower()], cls._normalize_value(dom, intent, REF_SYS_DA_M[dom][pairs[0].lower()], pairs[1])]) if len(new_list) > 0: new_action[act.lower()] = new_list else: new_action[act.lower()] = action[act] return new_action
import os import colorlover as cl import pydash as ps # The data visualization module # Defines plotting methods for analysis from plotly import graph_objs as go, io as pio, tools from plotly.offline import init_notebook_mode, iplot from convlab.lib import logger, util logger = logger.get_logger(__name__) # warn orca failure only once orca_warn_once = ps.once(lambda e: logger.warning( f'Failed to generate graph. Run retro-analysis to generate graphs later.')) if util.is_jupyter(): init_notebook_mode(connected=True) def create_label(y_col, x_col, title=None, y_title=None, x_title=None, legend_name=None): '''Create label dict for go.Layout with smart resolution''' legend_name = legend_name or y_col y_col_list, x_col_list, legend_name_list = ps.map_( [y_col, x_col, legend_name], util.cast_list) y_title = str(y_title or ','.join(y_col_list))
def update_booking(self, diaact, slot_vals, goal: Goal): """ Handel Book-XXX :param diaact: Dial-Act :param slot_vals: slot value pairs :param goal: Goal :return: True:user want to close the session. False:session is continue """ _, intent = diaact.split('-') domain = self.cur_domain if domain not in goal.domains: return False g_reqt = goal.domain_goals[domain].get('reqt', dict({})) g_info = goal.domain_goals[domain].get('info', dict({})) g_fail_info = goal.domain_goals[domain].get('fail_info', dict({})) g_book = goal.domain_goals[domain].get('book', dict({})) g_fail_book = goal.domain_goals[domain].get('fail_book', dict({})) if intent in ['book', 'inform']: info_right = True for [slot, value] in slot_vals: if slot == 'time': if domain in ['train', 'restaurant']: slot = 'duration' if domain == 'train' else 'time' else: logger.warning(f'illegal booking slot: {slot}, domain: {domain}') continue if slot in g_reqt: if not self._check_reqt_info(domain): self._remove_item(domain + '-request', slot) if value in NOT_SURE_VALS: g_reqt[slot] = '\"' + value + '\"' else: g_reqt[slot] = value elif slot in g_fail_info and value != g_fail_info[slot]: self._push_item(domain + '-inform', slot, g_fail_info[slot]) info_right = False elif len(g_fail_info) <= 0 and slot in g_info and check_constraint(slot, g_info[slot], value): self._push_item(domain + '-inform', slot, g_info[slot]) info_right = False elif slot in g_fail_book and value != g_fail_book[slot]: self._push_item(domain + '-inform', slot, g_fail_book[slot]) info_right = False elif len(g_fail_book) <= 0 and slot in g_book and value != g_book[slot]: self._push_item(domain + '-inform', slot, g_book[slot]) info_right = False else: pass if intent == 'book' and info_right: # booked ok if 'booked' in goal.domain_goals[domain]: goal.domain_goals[domain]['booked'] = DEF_VAL_BOOKED self._push_item('general-thank') elif intent in ['nobook']: if len(g_fail_book) > 0: # Discard fail_book data and update the book data to the stack for slot in g_book.keys(): if (slot not in g_fail_book) or (slot in g_fail_book and g_fail_book[slot] != g_book[slot]): self._push_item(domain + '-inform', slot, g_book[slot]) # change fail_info name goal.domain_goals[domain]['fail_book_fail'] = goal.domain_goals[domain].pop('fail_book') elif 'booked' in goal.domain_goals[domain].keys(): self.close_session() return True elif intent in ['request']: for [slot, _] in slot_vals: if slot == 'time': if domain in ['train', 'restaurant']: slot = 'duration' if domain == 'train' else 'time' else: logger.warning('illegal booking slot: %s, slot: %s domain' % (slot, domain)) continue if slot in g_reqt: pass elif slot in g_fail_info: self._push_item(domain + '-inform', slot, g_fail_info[slot]) elif len(g_fail_info) <= 0 and slot in g_info: self._push_item(domain + '-inform', slot, g_info[slot]) elif slot in g_fail_book: self._push_item(domain + '-inform', slot, g_fail_book[slot]) elif len(g_fail_book) <= 0 and slot in g_book: self._push_item(domain + '-inform', slot, g_book[slot]) else: if domain == 'taxi' and (slot == 'destination' or slot == 'departure'): places = [dom for dom in goal.domains[: goal.domains.index('taxi')] if 'address' in goal.domain_goals[dom]['reqt']] if len(places) >= 1 and slot == 'destination' and \ goal.domain_goals[places[-1]]['reqt']['address'] not in NOT_SURE_VALS: self._push_item(domain + '-inform', slot, goal.domain_goals[places[-1]]['reqt']['address']) elif len(places) >= 2 and slot == 'departure' and \ goal.domain_goals[places[-2]]['reqt']['address'] not in NOT_SURE_VALS: self._push_item(domain + '-inform', slot, goal.domain_goals[places[-2]]['reqt']['address']) elif random.random() < 0.5: self._push_item(domain + '-inform', slot, DEF_VAL_DNC) elif random.random() < 0.5: self._push_item(domain + '-inform', slot, DEF_VAL_DNC) return False