def train(data_dir, checkpoint_path, config): """Trains the model with the given data Args: data_dir: path to the data for the model (see data_utils for data format) checkpoint_path: the path to save the trained model checkpoints config: one of the above configs that specify the model and how it should be run and trained Returns: None """ # Prepare Name data. print("Reading Name data in %s" % data_dir) names, counts = data_utils.read_names(data_dir) with tf.Graph().as_default(), tf.Session() as session: initializer = tf.random_uniform_initializer(-config.init_scale, config.init_scale) with tf.variable_scope("model", reuse=None, initializer=initializer): m = NamignizerModel(is_training=True, config=config) tf.global_variables_initializer().run() for i in range(config.max_max_epoch): lr_decay = config.lr_decay ** max(i - config.max_epoch, 0.0) m.assign_lr(session, config.learning_rate * lr_decay) print("Epoch: %d Learning rate: %.3f" % (i + 1, session.run(m.lr))) train_perplexity = run_epoch(session, m, names, counts, config.epoch_size, m.train_op, verbose=True) print("Epoch: %d Train Perplexity: %.3f" % (i + 1, train_perplexity)) m.saver.save(session, checkpoint_path, global_step=i)
def namignize(names, checkpoint_path, config): """Recognizes names and prints the Perplexity of the model for each names in the list Args: names: a list of names in the model format checkpoint_path: the path to restore the trained model from, should not include the model name, just the path to config: one of the above configs that specify the model and how it should be run and trained Returns: None """ with tf.Graph().as_default(), tf.Session() as session: with tf.variable_scope("model"): m = NamignizerModel(is_training=False, config=config) m.saver.restore(session, checkpoint_path) for name in names: x, y = data_utils.name_to_batch(name, m.batch_size, m.num_steps) cost, loss, _ = session.run([m.cost, m.loss, tf.no_op()], {m.input_data: x, m.targets: y, m.weights: np.concatenate(( np.ones(len(name)), np.zeros(m.batch_size * m.num_steps - len(name))))}) print("Name {} gives us a perplexity of {}".format( name, np.exp(cost)))
def namignize(names, checkpoint_path, config, model_size): """Recognizes names and prints the Perplexity of the model for each names in the list Args: names: a list of names in the model format checkpoint_path: the path to restore the trained model from, should not include the model name, just the path to config: one of the above configs that specify the model and how it should be run and trained Returns: None """ with tf.Graph().as_default(), tf.Session() as session: with tf.variable_scope("model"): m = NamignizerModel(is_training=False, config=config) m.saver.restore(session, checkpoint_path) for name in names: x, y = data_utils.name_to_batch(name, m.batch_size, m.num_steps) feed_dict = { m.input_data: x, m.targets: y, m.weights: np.concatenate( (np.ones(len(name)), np.zeros(m.batch_size * m.num_steps - len(name)))) } model_name = 'namignize_{}'.format(model_size) options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) run_metadata = tf.RunMetadata() cost, loss, _ = session.run( [m.cost, m.loss, tf.no_op()], feed_dict=feed_dict, options=options, run_metadata=run_metadata) cg = CompGraph(model_name, run_metadata, tf.get_default_graph()) cg_tensor_dict = cg.get_tensors() cg_sorted_keys = sorted(cg_tensor_dict.keys()) cg_sorted_items = [] for cg_key in cg_sorted_keys: cg_sorted_items.append(tf.shape(cg_tensor_dict[cg_key])) cg_sorted_shape = session.run(cg_sorted_items, feed_dict=feed_dict) cg.op_analysis(dict(zip(cg_sorted_keys, cg_sorted_shape)), '{}.pickle'.format(model_name)) exit(0) print("Name {} gives us a perplexity of {}".format( name, np.exp(cost)))
def namignator(checkpoint_path, config): """Generates names randomly according to a given model Args: checkpoint_path: the path to restore the trained model from, should not include the model name, just the path to config: one of the above configs that specify the model and how it should be run and trained Returns: None """ # Save the original config options orig_num_steps = config.num_steps orig_batch_size = config.batch_size # mutate the config to become a name generator config config.num_steps = 1 config.batch_size = 1 with tf.Graph().as_default(), tf.Session() as session: with tf.variable_scope("model"): m = NamignizerModel(is_training=False, config=config) m.saver.restore(session, checkpoint_path) activations, final_state, _ = session.run([m.activations, m.final_state, tf.no_op()], {m.input_data: np.zeros((1, 1)), m.targets: np.zeros((1, 1)), m.weights: np.ones(1)}) # sample from our softmax activations next_letter = np.random.choice(27, p=activations[0]) name = [next_letter] while next_letter != 0: activations, final_state, _ = session.run([m.activations, m.final_state, tf.no_op()], {m.input_data: [[next_letter]], m.targets: np.zeros((1, 1)), m.initial_state: final_state, m.weights: np.ones(1)}) next_letter = np.random.choice(27, p=activations[0]) name += [next_letter] result = list(map(lambda x: chr(x + 96), name)) print(''.join(result[:-1])) # Reset config to original values config.num_steps = orig_num_steps config.batch_size = orig_batch_size
def train(data_dir, checkpoint_path, config): """Trains the model with the given data Args: data_dir: path to the data for the model (see data_utils for data format) checkpoint_path: the path to save the trained model checkpoints config: one of the above configs that specify the model and how it should be run and trained Returns: None """ # Prepare Name data. print("Reading Name data in %s" % data_dir) names, counts = data_utils.read_names(data_dir) model_path = os.environ["RESULT_DIR"]+"/model" with tf.Graph().as_default(), tf.Session() as session: initializer = tf.random_uniform_initializer(-config.init_scale, config.init_scale) with tf.variable_scope("model", reuse=None, initializer=initializer): m = NamignizerModel(is_training=True, config=config) tf.global_variables_initializer().run() for i in range(config.max_max_epoch): lr_decay = config.lr_decay ** max(i - config.max_epoch, 0.0) m.assign_lr(session, config.learning_rate * lr_decay) print("Epoch: %d Learning rate: %.3f" % (i + 1, session.run(m.lr))) train_perplexity = run_epoch(session, m, names, counts, config.epoch_size, m.train_op, verbose=True) print("Epoch: %d Train Perplexity: %.3f" % (i + 1, train_perplexity)) m.saver.save(session, os.environ["RESULT_DIR"] + "/model.ckpt", global_step=i) input_data = tf.saved_model.utils.build_tensor_info(m.input_data) target_data = tf.saved_model.utils.build_tensor_info(m.targets) weight_data = tf.saved_model.utils.build_tensor_info(m.weights) predict_outputs = tf.saved_model.utils.build_tensor_info(m.cost) prediction_signature = ( tf.saved_model.signature_def_utils.build_signature_def( inputs={ 'input_data' : input_data, 'target_data' : target_data, 'weight_data' : weight_data }, outputs={ tf.saved_model.signature_constants.PREDICT_INPUTS: predict_outputs }, method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)) builder = tf.saved_model.builder.SavedModelBuilder(model_path) legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op') builder.add_meta_graph_and_variables( session, [tf.saved_model.tag_constants.SERVING], signature_def_map={ 'predict_images': prediction_signature, }, legacy_init_op=legacy_init_op) save_path = str(builder.save()) print("Model saved in file: %s" % save_path) os.system("(cd $RESULT_DIR/model;tar cvfz ../saved_model.tar.gz .)") print(str(os.listdir(os.environ["RESULT_DIR"]))) print(os.environ["RESULT_DIR"]) sys.stdout.flush()