code diary

前段时间研究了下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.

总结

  1. 其实flask做web,花了三天时间,前两天看书实践,但是框架封装太好反而不太好学,因为我的需求其实重在前后台数据交互,但是书会把重点放在框架的介绍上;最后感谢实验室的同学,请教了一个小时,然后回去花了半天时间搞定了。
  2. 多看文档吧,一切的bug都是有原因的。

猜你喜欢

转载自blog.csdn.net/u011415481/article/details/77803250
今日推荐