前段时间研究了下seq2seq, 想写个web,显示结果,让同组同学测试一下,然后最近就研究了一下python web相关内容,遇到了一些坑,记录一下。
项目需求
web页面上显示三个输入框:
用户在第一个输入框输入句子,回车之后,把数据提交到后台,处理之后结果显示在第二个输入框,第二个输入框数据回车之后,后台处理,得到的结果显示在第三个输入框。
python + flask
因为seq2seq用tensorflow实现的,随便学一下python做web,因为需求很简单,于是选择了flask这个轻量级的框架。
一开始还看了flask的一个电子书,看完表单那一章就懵逼了…对于一个没做过前段的人来说略复杂,因为涉及到两次submit, 然后发现还是使用给控件绑定事件,用js提交请求,处理服务器返回的数据,会比较好。
flask后台 index.py 代码框架如下:
from flask import Flask, request, jsonify
from flask.ext.bootstrap import Bootstrap
from flask import render_template
from seq2seq import *
import tensorflow as tf
import numpy as np
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hrad to guess string'
bootstrap = Bootstrap(app)
print("debug pattern")
@app.route('/')
def index():
return render_template('index.html', name="NJU")
if __name__ == '__main__':
app.run(debug=True)
– 这里需要注意的是,app.run(debug=True), 如果是debug模式,后台会一直监听当前的脚本index.py 执行两遍,比如上面的后台会输入:
debug pattern
debug pattern
一般情况下是没什么问题,但是如果需要在开始加载模型,加载数据的话,这样就会有点儿耗时。
还有一个问题是,因为我需要加载模型之后,用session在两个方法里面fetch两个节点,一开始的写法是这样:
loaded_graph = tf.Graph()
with tf.Session(graph=loaded_graph) as sess:
# 加载模型
loader = tf.train.import_meta_graph(model_file + '.meta')
loader.restore(sess, model_file)
def fun1():
sess.run(xx)
fun1() # ######## runtime error:closed session
会出现session关闭的问题,因为with语句结束之后,sess就已经close了,于是改成下面这样:
model_file = "./trained_model.ckpt"
loaded_graph = tf.Graph()
sess = tf.Session(graph=loaded_graph)
loader = tf.train.import_meta_graph(model_file + '.meta')
loader.restore(sess, model_file)
input_data = sess.graph.get_tensor_by_name('inputs:0')
结果报错: graph is empty….
很懵逼,测试了一下sess.graph就是loaded_graph,但是不知道为什么用with就可以,但是去掉之后就不行了;
后来想到用default graph来试试,code如下:
model_file = "./trained_model.ckpt"
sess = tf.Session()
loader = tf.train.import_meta_graph(model_file + '.meta')
loader.restore(sess, model_file)
input_data = sess.graph.get_tensor_by_name('inputs:0')
测试正常!终于fix了这个bug,不过不清楚为什么==。
python list string转换
就,啊,转啊,只需要注意的是:
a = “12.3”, 那么list(a)得到的结果是[“1”, “2”, “.”, “3”];
但是 a= “1, 2.3”, 可以split(“,”), 然后把每个元素转为float.
总结
- 其实flask做web,花了三天时间,前两天看书实践,但是框架封装太好反而不太好学,因为我的需求其实重在前后台数据交互,但是书会把重点放在框架的介绍上;最后感谢实验室的同学,请教了一个小时,然后回去花了半天时间搞定了。
- 多看文档吧,一切的bug都是有原因的。