Hi, i have trained my Chinese data use your code ,and it test well,thans for your share.
And i want to inference result intime when user input come in. So i add some code about inference intime ,could you please check it , thx!
`import os
import argparse
import logging
import sys
import tensorflow as tf
import numpy as np
import my_la
import time
from tensorflow.python.ops import rnn_cell_impl
import tensorflow.contrib.rnn.python.ops.core_rnn_cell as rnn_cell_impl
import tensorflow.contrib.rnn as rnn_cell_impl
import tensorflow.contrib.rnn.core_rnn_cell as rnn_cell_impl
import tensorflow.contrib.rnn as rnn
from tensorflow.contrib.rnn.python.ops import core_rnn_cell as rnn_cell_impl
from tensorflow.python.ops import rnn_cell_impl
from utils import createVocabulary
from utils import loadVocabulary
from utils import computeF1Score
from utils import DataProcessor
parser.add_argument("--num_units", type=int, default=128, help="Network size.", dest='layer_size')
parser.add_argument("--model_type", type=str, default='full', help="""full(default) | intent_only
full: full attention model
intent_only: intent attention model""")
Training Environment
parser.add_argument("--batch_size", type=int, default=32, help="Batch size.")
parser.add_argument("--max_epochs", type=int, default=30, help="Max epochs to train.")
parser.add_argument("--no_early_stop", action='store_false',dest='early_stop', help="Disable early stop, which is based on sentence level accuracy.")
parser.add_argument("--patience", type=int, default=8, help="Patience to wait before stop.")
Model and Vocab
parser.add_argument("--dataset", type=str, default='aiways', help="""Type 'atis' or 'snips' to use dataset provided by us or enter what ever you named your own dataset.
Note, if you don't want to use this part, enter --dataset=''. It can not be None""")
parser.add_argument("--model_path", type=str, default='./model', help="Path to save model.")
parser.add_argument("--vocab_path", type=str, default='./vocab', help="Path to vocabulary files.")
Data
parser.add_argument("--train_data_path", type=str, default='train', help="Path to training data files.")
parser.add_argument("--test_data_path", type=str, default='test', help="Path to testing data files.")
parser.add_argument("--valid_data_path", type=str, default='valid', help="Path to validation data files.")
parser.add_argument("--input_file", type=str, default='sql.in', help="Input file name.")
parser.add_argument("--slot_file", type=str, default='sql.out', help="Slot file name.")
parser.add_argument("--intent_file", type=str, default='label', help="Intent file name.")
parser.add_argument("--emb_dim", type=str, default=100, help="Intent file name.")
parser.add_argument("--pretrain_model", type=str, default='./model', help="Path to save model.")
parser.add_argument("--Is_Train",type=bool,default=False,help="whether is train")
parser.add_argument("--Is_intime",type=bool,default=True,help="whether predict intime")
arg=parser.parse_args()
Print arguments
for k,v in sorted(vars(arg).items()):
print(k,'=',v)
print()
intent_params = []
slotparams = []
for p in params:
if not 'slot' in p.name:
intentparams.append(p)
if 'slot' in p.name or 'bidirectional_rnn' in p.name or 'embedding' in p.name:
slot_params.append(p)
Hi, i have trained my Chinese data use your code ,and it test well,thans for your share.
And i want to inference result intime when user input come in. So i add some code about inference intime ,could you please check it , thx!
`import os
import argparse
import logging
import sys
import tensorflow as tf
import numpy as np
import my_la
import time
from tensorflow.python.ops import rnn_cell_impl
import tensorflow.contrib.rnn.python.ops.core_rnn_cell as rnn_cell_impl
import tensorflow.contrib.rnn as rnn_cell_impl
import tensorflow.contrib.rnn.core_rnn_cell as rnn_cell_impl
import tensorflow.contrib.rnn as rnn from tensorflow.contrib.rnn.python.ops import core_rnn_cell as rnn_cell_impl
from tensorflow.python.ops import rnn_cell_impl
from utils import createVocabulary from utils import loadVocabulary from utils import computeF1Score from utils import DataProcessor
parser = argparse.ArgumentParser(allow_abbrev=False)
Network
parser.add_argument("--num_units", type=int, default=128, help="Network size.", dest='layer_size') parser.add_argument("--model_type", type=str, default='full', help="""full(default) | intent_only full: full attention model intent_only: intent attention model""")
Training Environment
parser.add_argument("--batch_size", type=int, default=32, help="Batch size.") parser.add_argument("--max_epochs", type=int, default=30, help="Max epochs to train.") parser.add_argument("--no_early_stop", action='store_false',dest='early_stop', help="Disable early stop, which is based on sentence level accuracy.") parser.add_argument("--patience", type=int, default=8, help="Patience to wait before stop.")
Model and Vocab
parser.add_argument("--dataset", type=str, default='aiways', help="""Type 'atis' or 'snips' to use dataset provided by us or enter what ever you named your own dataset. Note, if you don't want to use this part, enter --dataset=''. It can not be None""") parser.add_argument("--model_path", type=str, default='./model', help="Path to save model.") parser.add_argument("--vocab_path", type=str, default='./vocab', help="Path to vocabulary files.")
Data
parser.add_argument("--train_data_path", type=str, default='train', help="Path to training data files.") parser.add_argument("--test_data_path", type=str, default='test', help="Path to testing data files.") parser.add_argument("--valid_data_path", type=str, default='valid', help="Path to validation data files.") parser.add_argument("--input_file", type=str, default='sql.in', help="Input file name.") parser.add_argument("--slot_file", type=str, default='sql.out', help="Slot file name.") parser.add_argument("--intent_file", type=str, default='label', help="Intent file name.") parser.add_argument("--emb_dim", type=str, default=100, help="Intent file name.") parser.add_argument("--pretrain_model", type=str, default='./model', help="Path to save model.") parser.add_argument("--Is_Train",type=bool,default=False,help="whether is train") parser.add_argument("--Is_intime",type=bool,default=True,help="whether predict intime")
arg=parser.parse_args()
Print arguments
for k,v in sorted(vars(arg).items()): print(k,'=',v) print()
if arg.model_type == 'full': add_final_state_to_intent = True remove_slot_attn = False elif arg.model_type == 'intent_only': add_final_state_to_intent = True remove_slot_attn = True else: print('unknown model type!') exit(1)
full path to data will be: ./data + dataset + train/test/valid
if arg.dataset == None: print('name of dataset can not be None') exit(1) elif arg.dataset == 'snips': print('use snips dataset') elif arg.dataset == 'atis': print('use atis dataset') else: print('use own dataset: ',arg.dataset) full_train_path = os.path.join('./data',arg.dataset,arg.train_data_path) full_test_path = os.path.join('./data',arg.dataset,arg.test_data_path) full_valid_path = os.path.join('./data',arg.dataset,arg.valid_data_path)
createVocabulary(os.path.join(full_train_path, arg.input_file), os.path.join(arg.vocab_path, 'in_vocab')) createVocabulary(os.path.join(full_train_path, arg.slot_file), os.path.join(arg.vocab_path, 'slot_vocab')) createVocabulary(os.path.join(full_train_path, arg.intent_file), os.path.join(arg.vocab_path, 'intent_vocab'))
in_vocab = loadVocabulary(os.path.join(arg.vocab_path, 'in_vocab')) slot_vocab = loadVocabulary(os.path.join(arg.vocab_path, 'slot_vocab')) intent_vocab = loadVocabulary(os.path.join(arg.vocab_path, 'intent_vocab'))
def createModel(input_data, input_size, sequence_length, slot_size, intent_size, emb,layer_size = 128, isTraining = True): cell_fw = tf.contrib.rnn.BasicLSTMCell(layer_size) cell_bw = tf.contrib.rnn.BasicLSTMCell(layer_size)
def valid(in_path, slot_path, intent_path, sg_sess): data_processor_valid = DataProcessor(in_path, slot_path, intent_path, in_vocab, slot_vocab, intent_vocab)
def inference_intime(in_path, slot_path, intent_path, sg_sess, input_sqr): data_processor_valid = DataProcessor(in_path, slot_path, intent_path, in_vocab, slot_vocab, intent_vocab,is_intime=True)
Create Training Model
input_data = tf.placeholder(tf.int32, [None, None], name='inputs') sequence_length = tf.placeholder(tf.int32, [None], name="sequence_length") global_step = tf.Variable(0, trainable=False, name='global_step') slots = tf.placeholder(tf.int32, [None, None], name='slots') slot_weights = tf.placeholder(tf.float32, [None, None], name='slot_weights') intent = tf.placeholder(tf.int32, [None], name='intent')
char_list,emb_list = my_la.load_emb('wiki_100.utf8') d = loadVocabulary('vocab/in_vocab') emb = my_la.find_emb((char_list,emb_list),d)
with tf.variable_scope('model'):
slots_shape = tf.shape(slots) slots_reshape = tf.reshape(slots, [-1])
slot_outputs = training_outputs[0] with tf.variable_scope('slot_loss'): crossent = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=slots_reshape, logits=slot_outputs) crossent = tf.reshape(crossent, slots_shape) slot_loss = tf.reduce_sum(crossent*slot_weights, 1) total_size = tf.reduce_sum(slot_weights, 1) total_size += 1e-12 slot_loss = slot_loss / total_size
intent_output = training_outputs[1] with tf.variable_scope('intent_loss'): crossent =tf.nn.sparse_softmax_cross_entropy_with_logits(labels=intent, logits=intent_output) intent_loss = tf.reduce_sum(crossent) / tf.cast(arg.batch_size, tf.float32)
params = tf.trainable_variables() opt = tf.train.AdamOptimizer()
intent_params = [] slotparams = [] for p in params: if not 'slot' in p.name: intentparams.append(p) if 'slot' in p.name or 'bidirectional_rnn' in p.name or 'embedding' in p.name: slot_params.append(p)
gradients_slot = tf.gradients(slot_loss, slot_params) gradients_intent = tf.gradients(intent_loss, intent_params)
clipped_gradients_slot, norm_slot = tf.clip_by_global_norm(gradients_slot, 5.0) clipped_gradients_intent, norm_intent = tf.clip_by_global_norm(gradients_intent, 5.0)
gradient_norm_slot = norm_slot gradient_norm_intent = norm_intent update_slot = opt.apply_gradients(zip(clipped_gradients_slot, slot_params)) update_intent = opt.apply_gradients(zip(clipped_gradients_intent, intent_params), global_step=global_step)
training_outputs = [global_step, slot_loss, update_intent, update_slot, gradient_norm_intent, gradient_norm_slot] inputs = [input_data, sequence_length, slots, slot_weights, intent]
Create Inference Model
with tf.variable_scope('model', reuse=True): inference_outputs = createModel(input_data, len(in_vocab['vocab']), sequence_length, len(slot_vocab['vocab']),len(intent_vocab['vocab']), emb,layer_size=arg.emb_dim, isTraining=False)
inference_slot_output = tf.nn.softmax(inference_outputs[0], name='slot_output') inference_intent_output = tf.nn.softmax(inference_outputs[1], name='intent_output')
inference_outputs = [inference_intent_output, inference_slot_output] inference_inputs = [input_data, sequence_length]
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
saver = tf.train.Saver()
Start Training
with tf.Session() as sess:
`