前言
国庆的时候用LSTM搭建的了一个神经网络,训练微博数据集来进行情感多分类。后来觉得之前那个数据集不太行,所以经过大量的资料搜索,使用了当前这个数据集。数据集的提供方是清华大学计算机系黄民烈副教授。共4万多条句子,分为其他(Null), 喜好(Like),悲伤(Sad),厌恶(Disgust),愤怒(Anger),高兴(Happiness)六类。相对之前那个数据集更具权威性和准确性。
通过Django部署keras模型
重新训练模型后,我就想把它用在之前的web项目中。开始想的是直接用java调用python程序,试了试,效果不太理想。然后就硬着头皮学了一下Django框架,挺好上手的,看了下官方文档,就搭了个demo,把预测程序放进去用了。但是还是遇到了一些坑,在此记录一下吧。
坑1——Django下的文件路径问题
因为第一次接触Django,很多问题也不太懂。开始以为加载文件就是类似加载静态文件就行了,然而我错了,它根本不能被认出来。然后只能把它当做外部文件来加载。解决方法如下:
将文件保存在django项目根目录中,并在settings.py文件中添加以下内容.
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))1
然后在打开文件时加一些操作,这里就是在文件名前添加了项目的根路径。
import os
from django.conf import settings
model = load_model(os.path.join(settings.BASE_DIR, 'my_model.h5'))1
2
3
坑2——版本问题
由于之前使用的是keras3.0,然后Keras 2.3.0中添加了线程本地存储元素。在调用模型时(例如,从批处理生成器中),将引发与线程本地数据相关的属性错误。然后被迫降低版本为Keras2.2.4,但是降了keras版本后又导致TensorFlow出问题了(我的TensorFlow是2.0.0版本),mmp,版本又不兼容。然后又降低TensorFlow版本为1.14.0。emmm,程序跑起来了,有点小激动。
坑3——多线程下的变量问题
开始测试调用api,第一次,么得问题,好开心,第二次,程序崩了。啥子问题?emmm,因为Django是多线程运行的,但是我的模型是直接加载的,所以导致多线程运行环境中全局不唯一。最后是通过tf.get_default_graph()来将加载的模型作为这个TensorFlow运行环境的默认图,也就是唯一的图啦,然后程序就可以快活的跑起来啦。部分代码如下:
# 加载模型,并使模型和变量在同一图内
global graph
model = load_model(os.path.join(settings.BASE_DIR, 'my_model.h5'))
graph = tf.get_default_graph()1
2
3
4
说了这么多,大家想不想玩一下呢,啊哈哈哈。
GitHub地址: sentiment_analysis_api 如果觉得有点意思,请给个小星星哦。