@ -0,0 +1,35 @@ | |||||
from sqlalchemy import create_engine | |||||
from sqlalchemy import Column, Integer, TEXT,VARCHAR | |||||
from sqlalchemy.ext.declarative import declarative_base | |||||
engine = create_engine('mysql+pymysql://root:yyj0010YYJ@10.23.174.207/cloud',encoding="utf-8",echo=True) | |||||
base = declarative_base() | |||||
class User(base): | |||||
__tablename__ = 'users' | |||||
user_id = Column('user_id', VARCHAR(20), primary_key=True) | |||||
password = Column('password', TEXT, nullable=False) | |||||
class predict(base): | |||||
__tablename__= 'predictcouplet' | |||||
up = Column('up',VARCHAR(20),primary_key=True) | |||||
down= Column('down',VARCHAR(20),primary_key=True) | |||||
class train(base): | |||||
__tablename__= 'trainingcouplet' | |||||
up = Column('up',VARCHAR(20),primary_key=True) | |||||
down= Column('down',VARCHAR(20),primary_key=True) | |||||
class evaluate(base): | |||||
__tablename__= 'evaluatecouplet' | |||||
up = Column('up',VARCHAR(20),primary_key=True) | |||||
down= Column('down',VARCHAR(20),primary_key=True) | |||||
popular=Column('popular',Integer) | |||||
base.metadata.create_all(engine) # 创建表结构 | |||||
@ -0,0 +1,133 @@ | |||||
from flask import Flask | |||||
from flask import render_template | |||||
from flask import request | |||||
from flask import redirect,url_for | |||||
from code1.model import Model | |||||
import session | |||||
import socket | |||||
import random | |||||
from __init__ import predict,train,evaluate | |||||
#获取本机电脑名 | |||||
app = Flask(__name__) | |||||
import user | |||||
import couplet | |||||
vocab_file = 'code1/data/vocabs' | |||||
model_dir = 'code1/output' | |||||
m = Model( | |||||
None, None, None, None, vocab_file, | |||||
num_units=1024, layers=4, dropout=0.2, | |||||
batch_size=32, learning_rate=0.0001, | |||||
output_dir=model_dir, | |||||
restore_model=True, init_train=False, init_infer=True) | |||||
@app.route("/") | |||||
def index(): | |||||
return render_template("homepage.html",ip=ip) | |||||
@app.route("/homepage",methods=['GET']) | |||||
def homepage(): | |||||
return render_template("homepage.html",ip=ip) | |||||
@app.route("/game1",methods=['GET','post']) | |||||
def game1(): | |||||
if request.method == 'GET': | |||||
return render_template("game1.html",ip=ip) | |||||
else: | |||||
upper = request.form.get("upper", "") | |||||
input=upper | |||||
lower=m.infer(' '.join(input)) | |||||
lower = ''.join(lower.split(' ')) | |||||
return render_template("game1_result.html",lower=lower,upper=upper,ip=ip) | |||||
@app.route("/judge",methods=['GET','POST']) | |||||
def judge(): | |||||
result= request.form.get("result", "") | |||||
upper = request.form.get("upper") | |||||
lower = request.form.get("lower") | |||||
u = couplet.Couplet() | |||||
if(int(result)==1): | |||||
u.to_evaluation(up=upper,down=lower) | |||||
else: | |||||
u.to_predict(up=upper,down=lower) | |||||
return render_template("game1_back.html",ip=ip) | |||||
@app.route("/game2",methods=['GET','post']) | |||||
def game2(): | |||||
if request.method == 'GET': | |||||
u = couplet.Couplet() | |||||
pre = u.db_session.query(predict).all() | |||||
up=[] | |||||
for i in pre: | |||||
up.append(i.up) | |||||
up=up[random.randint(0, len(up)-1)] | |||||
return render_template("game2.html",up=up,ip=ip) | |||||
else: | |||||
up = request.form.get("up") | |||||
down= request.form.get("down") | |||||
u = couplet.Couplet() | |||||
u.to_evaluation(up=up,down=down) | |||||
return render_template("game2_back.html",ip=ip) | |||||
@app.route("/game3",methods=['GET','post']) | |||||
def game3(): | |||||
if request.method == 'GET': | |||||
u = couplet.Couplet() | |||||
pre = u.db_session.query(evaluate).all() | |||||
up=[] | |||||
down=[] | |||||
for i in pre: | |||||
up.append(i.up) | |||||
down.append(i.down) | |||||
temp=random.randint(0,len(up)-1) | |||||
up=up[temp] | |||||
down=down[temp] | |||||
return render_template("game3.html",up=up,down=down,ip=ip) | |||||
else: | |||||
result = request.form.get("result", "") | |||||
up = request.form.get("up") | |||||
down= request.form.get("down") | |||||
print(result,up,down) | |||||
if(result=='1'): | |||||
u = couplet.Couplet() | |||||
u.add_popular(up=up, down=down,popular=1) | |||||
else: | |||||
u = couplet.Couplet() | |||||
u.minus_popular(up=up, down=down, popular=1) | |||||
return render_template("game3_back.html",ip=ip) | |||||
@app.route("/register", methods=['GET',"POST"]) | |||||
def register(): | |||||
if request.method=='GET': | |||||
return render_template("register.html",ip=ip) | |||||
else: | |||||
user_id = request.form.get("user_id", "") | |||||
password = request.form.get("password", "") | |||||
u = user.Users() | |||||
code, message = u.register(user_id=user_id, password=password) | |||||
if code==200: | |||||
return """<a href="http://{}/login" target="_self">注册成功,点击登陆</a> """.format(ip) | |||||
else: | |||||
return """<a href="http://{}/register" target="_self">注册失败,点击重新注册</a> """.format(ip) | |||||
@app.route("/login", methods=["GET","POST"]) | |||||
def login(): | |||||
if request.method=='GET': | |||||
return render_template("login.html") | |||||
else: | |||||
user_id = request.form.get("user_id", "") | |||||
password = request.form.get("password", "") | |||||
u = user.Users() | |||||
code, message = u.login(user_id=user_id, password=password) | |||||
if code==200: | |||||
return redirect(url_for('homepage')) | |||||
else: | |||||
return """<a href="http://{}/login" target="_self">用户名或密码错误,点击重新登陆</a> """.format(ip) | |||||
if __name__ == '__main__': | |||||
app.run("127.0.0.1",port=5000) |
@ -0,0 +1,73 @@ | |||||
import session | |||||
from __init__ import predict,train,evaluate | |||||
class Couplet(session.ORMsession): | |||||
def __init__(self): | |||||
session.ORMsession.__init__(self) | |||||
def send_up(self,up:str): | |||||
return 'asda' | |||||
def to_train(self,up:str,down:str): | |||||
try: | |||||
couplet=train(up=up,down=down) | |||||
self.db_session.add(couplet) | |||||
self.db_session.commit() | |||||
except BaseException as e: | |||||
return 530, "{}".format(str(e)) | |||||
return 200 | |||||
def to_predict(self,up:str,down:str): | |||||
try: | |||||
couplet = predict(up=up,down=down) | |||||
self.db_session.add(couplet) | |||||
self.db_session.commit() | |||||
except BaseException as e: | |||||
return 530, "{}".format(str(e)) | |||||
return 200 | |||||
def to_evaluation(self,up:str,down:str): | |||||
try: | |||||
couplet = evaluate(up=up, down=down,popular=0) | |||||
self.db_session.add(couplet) | |||||
self.db_session.commit() | |||||
self.db_session.rollback() | |||||
except BaseException as e: | |||||
return 530, "{}".format(str(e)) | |||||
return 200 | |||||
def add_popular(self,up:str,down:str,popular:int): | |||||
try: | |||||
self.db_session.query(evaluate).filter(evaluate.up==up,evaluate.down==down).update({'evaluate.popular':evaluate.popular+popular}) | |||||
self.db_session.commit() | |||||
except BaseException as e: | |||||
return 530, "{}".format(str(e)) | |||||
return 200 | |||||
def minus_popular(self,up:str,down:str,popular:int): | |||||
try: | |||||
couplet = evaluate() | |||||
self.db_session.query(evaluate).filter(evaluate.up == up, evaluate.down == down).update( | |||||
{'evaluate.popular': evaluate.popular - popular}) | |||||
self.db_session.commit() | |||||
except BaseException as e: | |||||
return 530, "{}".format(str(e)) | |||||
return 200 | |||||
def change_eva(self): | |||||
try: | |||||
self.db_session.query(evaluate).filter(evaluate.popular<=-10).delete() | |||||
row=self.db_session.query(evaluate).filter(evaluate.popular>=0).all() | |||||
up=[] | |||||
down=[] | |||||
for i in row: | |||||
up.append(i.up) | |||||
down.append() | |||||
self.db_session.query(evaluate).filter(evaluate.popular >=10).delete() | |||||
self.db_session.commit() | |||||
for i in range(0,len(up)): | |||||
couplet=train(up=up[i],down=down[i]) | |||||
self.db_session.add(couplet) | |||||
except BaseException as e: | |||||
return 530, "{}".format(str(e)) |
@ -0,0 +1,35 @@ | |||||
error_code = { | |||||
401: "authorization fail.", | |||||
511: "non exist user id {}", | |||||
512: "exist user id {}", | |||||
513: "non exist store id {}", | |||||
514: "exist store id {}", | |||||
515: "non exist book id {}", | |||||
516: "exist book id {}", | |||||
517: "stock level low, book id {}", | |||||
518: "invalid order id {}", | |||||
519: "not sufficient funds, order id {}", | |||||
520: "non qualified book.", | |||||
521: "", | |||||
522: "", | |||||
523: "", | |||||
524: "", | |||||
525: "", | |||||
526: "", | |||||
527: "", | |||||
528: "", | |||||
} | |||||
def error_non_exist_user_id(user_id): | |||||
return 511, error_code[511].format(user_id) | |||||
def error_exist_user_id(user_id): | |||||
return 512, error_code[512].format(user_id) | |||||
def error_authorization_fail(): | |||||
return 401, error_code[401] | |||||
def error_and_message(code, message): | |||||
return code, message |
@ -0,0 +1,234 @@ | |||||
import tensorflow as tf | |||||
import seq2seq | |||||
import bleu | |||||
import reader | |||||
from os import path | |||||
import random | |||||
class Model(): | |||||
def __init__(self, train_input_file, train_target_file, | |||||
test_input_file, test_target_file, vocab_file, | |||||
num_units, layers, dropout, | |||||
batch_size, learning_rate, output_dir, | |||||
save_step = 100, eval_step = 1000, | |||||
param_histogram=False, restore_model=False, | |||||
init_train=True, init_infer=False): | |||||
self.num_units = num_units | |||||
self.layers = layers | |||||
self.dropout = dropout | |||||
self.batch_size = batch_size | |||||
self.learning_rate = learning_rate | |||||
self.save_step = save_step | |||||
self.eval_step = eval_step | |||||
self.param_histogram = param_histogram | |||||
self.restore_model = restore_model | |||||
self.init_train = init_train | |||||
self.init_infer = init_infer | |||||
if init_train: | |||||
self.train_reader = reader.SeqReader(train_input_file, | |||||
train_target_file, vocab_file, batch_size) | |||||
self.train_reader.start() | |||||
self.train_data = self.train_reader.read() | |||||
self.eval_reader = reader.SeqReader(test_input_file, test_target_file, | |||||
vocab_file, batch_size) | |||||
self.eval_reader.start() | |||||
self.eval_data = self.eval_reader.read() | |||||
self.model_file = path.join(output_dir, 'model.ckpl') | |||||
self.log_writter = tf.summary.FileWriter(output_dir) | |||||
if init_train: | |||||
self._init_train() | |||||
self._init_eval() | |||||
if init_infer: | |||||
self.infer_vocabs = reader.read_vocab(vocab_file) | |||||
self.infer_vocab_indices = dict((c, i) for i, c in | |||||
enumerate(self.infer_vocabs)) | |||||
self._init_infer() | |||||
self.reload_infer_model() | |||||
def gpu_session_config(self): | |||||
config = tf.ConfigProto() | |||||
config.gpu_options.allow_growth = True | |||||
return config | |||||
def _init_train(self): | |||||
self.train_graph = tf.Graph() | |||||
with self.train_graph.as_default(): | |||||
self.train_in_seq = tf.placeholder(tf.int32, shape=[self.batch_size, None]) | |||||
self.train_in_seq_len = tf.placeholder(tf.int32, shape=[self.batch_size]) | |||||
self.train_target_seq = tf.placeholder(tf.int32, shape=[self.batch_size, None]) | |||||
self.train_target_seq_len = tf.placeholder(tf.int32, shape=[self.batch_size]) | |||||
output = seq2seq.seq2seq(self.train_in_seq, self.train_in_seq_len, | |||||
self.train_target_seq, self.train_target_seq_len, | |||||
len(self.train_reader.vocabs), | |||||
self.num_units, self.layers, self.dropout) | |||||
self.train_output = tf.argmax(tf.nn.softmax(output), 2) | |||||
self.loss = seq2seq.seq_loss(output, self.train_target_seq, | |||||
self.train_target_seq_len) | |||||
params = tf.trainable_variables() | |||||
gradients = tf.gradients(self.loss, params) | |||||
clipped_gradients, _ = tf.clip_by_global_norm( | |||||
gradients, 0.5) | |||||
self.train_op = tf.train.AdamOptimizer( | |||||
learning_rate=self.learning_rate | |||||
).apply_gradients(zip(clipped_gradients,params)) | |||||
if self.param_histogram: | |||||
for v in tf.trainable_variables(): | |||||
tf.summary.histogram('train_' + v.name, v) | |||||
tf.summary.scalar('loss', self.loss) | |||||
self.train_summary = tf.summary.merge_all() | |||||
self.train_init = tf.global_variables_initializer() | |||||
self.train_saver = tf.train.Saver() | |||||
self.train_session = tf.Session(graph=self.train_graph, | |||||
config=self.gpu_session_config()) | |||||
def _init_eval(self): | |||||
self.eval_graph = tf.Graph() | |||||
with self.eval_graph.as_default(): | |||||
self.eval_in_seq = tf.placeholder(tf.int32, shape=[self.batch_size, None]) | |||||
self.eval_in_seq_len = tf.placeholder(tf.int32, shape=[self.batch_size]) | |||||
self.eval_output = seq2seq.seq2seq(self.eval_in_seq, | |||||
self.eval_in_seq_len, None, None, | |||||
len(self.eval_reader.vocabs), | |||||
self.num_units, self.layers, self.dropout) | |||||
if self.param_histogram: | |||||
for v in tf.trainable_variables(): | |||||
tf.summary.histogram('eval_' + v.name, v) | |||||
self.eval_summary = tf.summary.merge_all() | |||||
self.eval_saver = tf.train.Saver() | |||||
self.eval_session = tf.Session(graph=self.eval_graph, | |||||
config=self.gpu_session_config()) | |||||
def _init_infer(self): | |||||
self.infer_graph = tf.Graph() | |||||
with self.infer_graph.as_default(): | |||||
self.infer_in_seq = tf.placeholder(tf.int32, shape=[1, None]) | |||||
self.infer_in_seq_len = tf.placeholder(tf.int32, shape=[1]) | |||||
self.infer_output = seq2seq.seq2seq(self.infer_in_seq, | |||||
self.infer_in_seq_len, None, None, | |||||
len(self.infer_vocabs), | |||||
self.num_units, self.layers, self.dropout) | |||||
self.infer_saver = tf.train.Saver() | |||||
self.infer_session = tf.Session(graph=self.infer_graph, | |||||
config=self.gpu_session_config()) | |||||
def train(self, epochs, start=0): | |||||
if not self.init_train: | |||||
raise Exception('Train graph is not inited!') | |||||
with self.train_graph.as_default(): | |||||
if path.isfile(self.model_file + '.meta') and self.restore_model: | |||||
print("Reloading model file before training.") | |||||
self.train_saver.restore(self.train_session, self.model_file) | |||||
else: | |||||
self.train_session.run(self.train_init) | |||||
total_loss = 0 | |||||
for step in range(start, epochs): | |||||
data = next(self.train_data) | |||||
in_seq = data['in_seq'] | |||||
in_seq_len = data['in_seq_len'] | |||||
target_seq = data['target_seq'] | |||||
target_seq_len = data['target_seq_len'] | |||||
output, loss, train, summary = self.train_session.run( | |||||
[self.train_output, self.loss, self.train_op, self.train_summary], | |||||
feed_dict={ | |||||
self.train_in_seq: in_seq, | |||||
self.train_in_seq_len: in_seq_len, | |||||
self.train_target_seq: target_seq, | |||||
self.train_target_seq_len: target_seq_len}) | |||||
total_loss += loss | |||||
self.log_writter.add_summary(summary, step) | |||||
if step % self.save_step == 0: | |||||
self.train_saver.save(self.train_session, self.model_file) | |||||
print("Saving model. Step: %d, loss: %f" % (step, | |||||
total_loss / self.save_step)) | |||||
# print sample output | |||||
sid = random.randint(0, self.batch_size-1) | |||||
input_text = reader.decode_text(in_seq[sid], | |||||
self.eval_reader.vocabs) | |||||
output_text = reader.decode_text(output[sid], | |||||
self.train_reader.vocabs) | |||||
target_text = reader.decode_text(target_seq[sid], | |||||
self.train_reader.vocabs).split(' ')[1:] | |||||
target_text = ' '.join(target_text) | |||||
print('******************************') | |||||
print('src: ' + input_text) | |||||
print('output: ' + output_text) | |||||
print('target: ' + target_text) | |||||
if step % self.eval_step == 0: | |||||
bleu_score = self.eval(step) | |||||
print("Evaluate model. Step: %d, score: %f, loss: %f" % ( | |||||
step, bleu_score, total_loss / self.save_step)) | |||||
eval_summary = tf.Summary(value=[tf.Summary.Value( | |||||
tag='bleu', simple_value=bleu_score)]) | |||||
self.log_writter.add_summary(eval_summary, step) | |||||
if step % self.save_step == 0: | |||||
total_loss = 0 | |||||
def eval(self, train_step): | |||||
with self.eval_graph.as_default(): | |||||
self.eval_saver.restore(self.eval_session, self.model_file) | |||||
bleu_score = 0 | |||||
target_results = [] | |||||
output_results = [] | |||||
for step in range(0, self.eval_reader.data_size): | |||||
data = next(self.eval_data) | |||||
in_seq = data['in_seq'] | |||||
in_seq_len = data['in_seq_len'] | |||||
target_seq = data['target_seq'] | |||||
target_seq_len = data['target_seq_len'] | |||||
outputs = self.eval_session.run( | |||||
self.eval_output, | |||||
feed_dict={ | |||||
self.eval_in_seq: in_seq, | |||||
self.eval_in_seq_len: in_seq_len}) | |||||
for i in range(len(outputs)): | |||||
output = outputs[i] | |||||
target = target_seq[i] | |||||
output_text = reader.decode_text(output, | |||||
self.eval_reader.vocabs).split(' ') | |||||
target_text = reader.decode_text(target[1:], | |||||
self.eval_reader.vocabs).split(' ') | |||||
prob = int(self.eval_reader.data_size * self.batch_size / 10) | |||||
target_results.append([target_text]) | |||||
output_results.append(output_text) | |||||
if random.randint(1, prob) == 1: | |||||
print('====================') | |||||
input_text = reader.decode_text(in_seq[i], | |||||
self.eval_reader.vocabs) | |||||
print('src:' + input_text) | |||||
print('output: ' + ' '.join(output_text)) | |||||
print('target: ' + ' '.join(target_text)) | |||||
return bleu.compute_bleu(target_results, output_results)[0] * 100 | |||||
def reload_infer_model(self): | |||||
with self.infer_graph.as_default(): | |||||
self.infer_saver.restore(self.infer_session, self.model_file) | |||||
def infer(self, text): | |||||
if not self.init_infer: | |||||
raise Exception('Infer graph is not inited!') | |||||
with self.infer_graph.as_default(): | |||||
in_seq = reader.encode_text(text.split(' ') + ['</s>',], | |||||
self.infer_vocab_indices) | |||||
in_seq_len = len(in_seq) | |||||
outputs = self.infer_session.run(self.infer_output, | |||||
feed_dict={ | |||||
self.infer_in_seq: [in_seq], | |||||
self.infer_in_seq_len: [in_seq_len]}) | |||||
output = outputs[0] | |||||
output_text = reader.decode_text(output, self.infer_vocabs) | |||||
return output_text |
@ -0,0 +1,157 @@ | |||||
import tensorflow as tf | |||||
from tensorflow.contrib import rnn | |||||
from tensorflow.python.layers import core as layers_core | |||||
def getLayeredCell(layer_size, num_units, input_keep_prob, | |||||
output_keep_prob=1.0): | |||||
return rnn.MultiRNNCell([rnn.DropoutWrapper(rnn.BasicLSTMCell(num_units), | |||||
input_keep_prob, output_keep_prob) for i in range(layer_size)]) | |||||
def bi_encoder(embed_input, in_seq_len, num_units, layer_size, input_keep_prob): | |||||
# encode input into a vector | |||||
bi_layer_size = int(layer_size / 2) | |||||
encode_cell_fw = getLayeredCell(bi_layer_size, num_units, input_keep_prob) | |||||
encode_cell_bw = getLayeredCell(bi_layer_size, num_units, input_keep_prob) | |||||
bi_encoder_output, bi_encoder_state = tf.nn.bidirectional_dynamic_rnn( | |||||
cell_fw=encode_cell_fw, | |||||
cell_bw=encode_cell_bw, | |||||
inputs=embed_input, | |||||
sequence_length=in_seq_len, | |||||
dtype=embed_input.dtype, | |||||
time_major=False) | |||||
# concat encode output and state | |||||
encoder_output = tf.concat(bi_encoder_output, -1) | |||||
encoder_state = [] | |||||
for layer_id in range(bi_layer_size): | |||||
encoder_state.append(bi_encoder_state[0][layer_id]) | |||||
encoder_state.append(bi_encoder_state[1][layer_id]) | |||||
encoder_state = tuple(encoder_state) | |||||
return encoder_output, encoder_state | |||||
def attention_decoder_cell(encoder_output, in_seq_len, num_units, layer_size, | |||||
input_keep_prob): | |||||
attention_mechanim = tf.contrib.seq2seq.BahdanauAttention(num_units, | |||||
encoder_output, in_seq_len, normalize=True) | |||||
# attention_mechanim = tf.contrib.seq2seq.LuongAttention(num_units, | |||||
# encoder_output, in_seq_len, scale = True) | |||||
cell = getLayeredCell(layer_size, num_units, input_keep_prob) | |||||
cell = tf.contrib.seq2seq.AttentionWrapper(cell, attention_mechanim, | |||||
attention_layer_size=num_units) | |||||
return cell | |||||
def decoder_projection(output, output_size): | |||||
return tf.layers.dense(output, output_size, activation=None, | |||||
use_bias=False, name='output_mlp') | |||||
def train_decoder(encoder_output, in_seq_len, target_seq, target_seq_len, | |||||
encoder_state, num_units, layers, embedding, output_size, | |||||
input_keep_prob, projection_layer): | |||||
decoder_cell = attention_decoder_cell(encoder_output, in_seq_len, num_units, | |||||
layers, input_keep_prob) | |||||
batch_size = tf.shape(in_seq_len)[0] | |||||
init_state = decoder_cell.zero_state(batch_size, tf.float32).clone( | |||||
cell_state=encoder_state) | |||||
helper = tf.contrib.seq2seq.TrainingHelper( | |||||
target_seq, target_seq_len, time_major=False) | |||||
decoder = tf.contrib.seq2seq.BasicDecoder(decoder_cell, helper, | |||||
init_state, output_layer=projection_layer) | |||||
outputs, _, _ = tf.contrib.seq2seq.dynamic_decode(decoder, | |||||
maximum_iterations=100) | |||||
return outputs.rnn_output | |||||
def infer_decoder(encoder_output, in_seq_len, encoder_state, num_units, layers, | |||||
embedding, output_size, input_keep_prob, projection_layer): | |||||
decoder_cell = attention_decoder_cell(encoder_output, in_seq_len, num_units, | |||||
layers, input_keep_prob) | |||||
batch_size = tf.shape(in_seq_len)[0] | |||||
init_state = decoder_cell.zero_state(batch_size, tf.float32).clone( | |||||
cell_state=encoder_state) | |||||
# TODO: start tokens and end tokens are hard code | |||||
""" | |||||
helper = tf.contrib.seq2seq.GreedyEmbeddingHelper( | |||||
embedding, tf.fill([batch_size], 0), 1) | |||||
decoder = tf.contrib.seq2seq.BasicDecoder(decoder_cell, helper, | |||||
init_state, output_layer=projection_layer) | |||||
""" | |||||
decoder = tf.contrib.seq2seq.BeamSearchDecoder( | |||||
cell=decoder_cell, | |||||
embedding=embedding, | |||||
start_tokens=tf.fill([batch_size], 0), | |||||
end_token=1, | |||||
initial_state=init_state, | |||||
beam_width=10, | |||||
output_layer=projection_layer, | |||||
length_penalty_weight=1.0) | |||||
outputs, _, _ = tf.contrib.seq2seq.dynamic_decode(decoder, | |||||
maximum_iterations=100) | |||||
return outputs.sample_id | |||||
def seq2seq(in_seq, in_seq_len, target_seq, target_seq_len, vocab_size, | |||||
num_units, layers, dropout): | |||||
in_shape = tf.shape(in_seq) | |||||
batch_size = in_shape[0] | |||||
if target_seq != None: | |||||
input_keep_prob = 1 - dropout | |||||
else: | |||||
input_keep_prob = 1 | |||||
projection_layer = layers_core.Dense(vocab_size, use_bias=False) | |||||
# embedding input and target sequence | |||||
with tf.device('/cpu:0'): | |||||
embedding = tf.get_variable( | |||||
name='embedding', | |||||
shape=[vocab_size, num_units]) | |||||
embed_input = tf.nn.embedding_lookup(embedding, in_seq, name='embed_input') | |||||
# encode and decode | |||||
encoder_output, encoder_state = bi_encoder(embed_input, in_seq_len, | |||||
num_units, layers, input_keep_prob) | |||||
decoder_cell = attention_decoder_cell(encoder_output, in_seq_len, num_units, | |||||
layers, input_keep_prob) | |||||
batch_size = tf.shape(in_seq_len)[0] | |||||
init_state = decoder_cell.zero_state(batch_size, tf.float32).clone( | |||||
cell_state=encoder_state) | |||||
if target_seq != None: | |||||
embed_target = tf.nn.embedding_lookup(embedding, target_seq, | |||||
name='embed_target') | |||||
helper = tf.contrib.seq2seq.TrainingHelper( | |||||
embed_target, target_seq_len, time_major=False) | |||||
else: | |||||
# TODO: start tokens and end tokens are hard code | |||||
helper = tf.contrib.seq2seq.GreedyEmbeddingHelper( | |||||
embedding, tf.fill([batch_size], 0), 1) | |||||
decoder = tf.contrib.seq2seq.BasicDecoder(decoder_cell, helper, | |||||
init_state, output_layer=projection_layer) | |||||
outputs, _, _ = tf.contrib.seq2seq.dynamic_decode(decoder, | |||||
maximum_iterations=100) | |||||
if target_seq != None: | |||||
return outputs.rnn_output | |||||
else: | |||||
return outputs.sample_id | |||||
def seq_loss(output, target, seq_len): | |||||
target = target[:, 1:] | |||||
cost = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=output, | |||||
labels=target) | |||||
batch_size = tf.shape(target)[0] | |||||
loss_mask = tf.sequence_mask(seq_len, tf.shape(output)[1]) | |||||
cost = cost * tf.to_float(loss_mask) | |||||
return tf.reduce_sum(cost) / tf.to_float(batch_size) |
@ -0,0 +1,12 @@ | |||||
from sqlalchemy.ext.declarative import declarative_base | |||||
from sqlalchemy.orm import Session | |||||
from sqlalchemy.orm import sessionmaker | |||||
from sqlalchemy import create_engine | |||||
from sqlalchemy import or_ | |||||
from sqlalchemy import Column,Integer,String | |||||
class ORMsession: | |||||
def __init__(self): | |||||
engine = create_engine('mysql+pymysql://root:yyj0010YYJ@10.23.174.207/cloud',encoding="utf-8", echo=True) | |||||
Session=sessionmaker(engine) | |||||
self.db_session = Session() |
@ -0,0 +1,69 @@ | |||||
from __init__ import User | |||||
import logging | |||||
import session | |||||
import error | |||||
import random | |||||
import string | |||||
import jwt | |||||
import time | |||||
#Users类,包括注册登录 | |||||
class Users(session.ORMsession): | |||||
token_lifetime: int = 60 | |||||
def __init__(self): | |||||
session.ORMsession.__init__(self) | |||||
def register(self,user_id:str,password:str) -> (int,str): | |||||
try: | |||||
if(len(password)==0): | |||||
return 202,"error" | |||||
user=User(user_id=user_id,password=password) | |||||
self.db_session.add(user) | |||||
self.db_session.commit() | |||||
except: | |||||
return error.error_exist_user_id(user_id) | |||||
return 200,"ok" | |||||
def unregister(self, user_id: str, password: str) -> (int, str): | |||||
try: | |||||
code, message = self.check_password(user_id, password) | |||||
if code != 200: | |||||
return code, message | |||||
user = self.db_session.query(User).filter(User.user_id==user_id).first() | |||||
self.db_session.delete(user) | |||||
self.db_session.commit() | |||||
except: | |||||
return error.error_authorization_fail() | |||||
return 200, "ok" | |||||
def check_password(self, user_id: str, password: str) -> (int, str): | |||||
user = self.db_session.query(User).filter(User.user_id==user_id).first() | |||||
if user is None: | |||||
return error.error_authorization_fail() | |||||
if password != user.password: | |||||
return error.error_authorization_fail() | |||||
return 200, "ok" | |||||
def login(self, user_id: str, password: str) -> (int, str, str): | |||||
try: | |||||
code, message = self.check_password(user_id, password) | |||||
if code != 200: | |||||
return code, message | |||||
self.db_session.commit() | |||||
except: | |||||
return error.error_authorization_fail() | |||||
return 200, "ok" | |||||
def change_password(self, user_id: str, old_password: str, new_password: str) -> (int,str): | |||||
try: | |||||
code, message = self.check_password(user_id, old_password) | |||||
if code != 200: | |||||
return code, message | |||||
self.db_session.query(User).filter(User.user_id== user_id)\ | |||||
.update({'password': new_password}) | |||||
self.db_session.commit() | |||||
except: | |||||
return error.error_authorization_fail() | |||||
return 200, "ok" | |||||