提交 767b41b3 编写于 作者: Z Zeyu Chen

add sentiment-classification example

上级 a00bc6a9
......@@ -16,4 +16,4 @@
- id: trailing-whitespace
- id: detect-private-key
- id: check-symlinks
- id: check-added-large-files
# - id: check-added-large-files
python test_create_module.py --train_data_path ./data/train_data/corpus.train --word_dict_path ./data/train.vocab --mode train --model_path ./models
2 当初 决定 购买 锋范 最大 理由 还是 品牌 追求 本田 国人 印象 相对 其他 日系 品牌 更好 一点
0 研究 发现 原来 本田锋范 小型车 研究 各项 尺寸 轴距 A级车 那么 一点 差距 晕倒 小型车 紧凑型车 价格 本田
0 貌似 操控 185 轮胎 加上 后轮 扭力 整车 刚性 怎么 直线 开开 还是 不错 要是 告诉 还是 算了吧 老老实实
2 外观 绝对 级别 好看 不管 哪一个 角度 都是 流畅 线条 唯一 不足 车子 一点 要是 一点 完美 其实 思域 还是 一点
2 内饰 年轻 而且 看上去 质感 蛮好 貌似 本田 所有 有点 相似 高档
2 奔驰 宝马 相应 车辆 小五 第一
0 美国 就是 既然 就能
0 一个 规格 三千 总体 来说 还是 比较 便宜 但是 什么 没有 起码 座套 俩字 没有 脚垫 没有
0 就是 五菱 扶手箱 一百元 一套 坐垫 也是 一百元 一套 脚垫 也是 一百元 总共 三百元 一个 差评 不过 总体 可以 买车 砍价 省出来
2 动力 不做 1.8T 已经 满足 需求
2 搭配 7 离合 还是 比较 省油
0 悬挂 还是 马马虎虎 比上不足 比下有余
2 内饰 不错 运动 包皮 耐看 动感
2 总体来说 这个 价位 这个 空间 景逸 很满意 适合 其实 买车 老婆 一样 最最 选择 合适 自己
2 驾驶 坐姿 视野 开阔 油门 踏板 轻盈 底盘 通过 A 轴距 转弯 车体 轻微 抖动
2 外观 时尚 线条 流畅 前脸 霸气 屁股 性感 车身 整体 表现出 年轻 活力 风度
0 黄色 不是 很好
2 整体 效果 还不错 10 以下 SUV 感觉 瑞虎 瑞虎 值得 拥有 呵呵
2 做工 很好 材质 很不错
2 后悔 已经 不少
2 说不上 满意 综合 起来 还是 很好
2 空间 可以 后面 三个 170 后备箱 给力
1 满分 10 性价比 8.5 综合 油耗 偏高 如果 开市区 不太 合算
0 后排 中间 突起 中间 不好
1 一般 家用 可以
2 过去 面包车 现在 和悦rs 13 感觉 当然 不一样 非常 舒适 满意 13 1 年多 等到 13 上市 痴情
0 舒适性 不知道 怎么 , 椅子 舒适性 一般般 , 前排 可以 后排 减速带 , 等等 明显 感到 振动 很大
2 相当 满意 炫耀 资本
2 车辆 非常 轻盈 有力 起来 非常 舒服
2 价位 级别 相比 性价比 最高
1 时候 30 + 油耗 现在 已经 努力 开到 9 最少 时候 开出 3.9L / 100KM 成就感 自己 预算 就是 5 - 6 毛钱 一公里
0 后备箱 放下 一个 婴儿车 基本 放不下 其他 东西
0 用料 不行
2 耐看型 开始 觉得 一般 几个月 越发 觉得 好看 流线 车身 符合 一个 年轻人 审美
2 总的来说 一款 不会 后悔 当初 排除 日韩 基本 10 - 20W 福克斯 速腾 太坑 英朗 太笨 其他 什么 508 C5 迈瑞宝 中级 不符合 年轻人 耐看 而且 动力 不足 对比 小四 缺点 所以 预算 15W 左右 C4L 绝对 一款 不错 选择 希望 对待 帮助
1 新手 油耗 暂时 比较 还有 下降 空间
1 内饰 颜色 浅色 最好
1 国产车 觉得 性价比 质量 还算 可以 毕竟 只是 几万元 车子 注定 包容 一些 不足 买车 现在 2 5万多公里 经过 一些 改动 还算 得心应手
2 还是 铃木 发动机 . . 皮实 耐用
1 一般般 . . . 还是 . . . 不过 起来 不错 . . .
2 空间 不错 这么 这样 表现 已经 超出 想象 特别 头部 空间 充足
2 对于 微型车 来说 舒适性 两轮 摩托车 要好 很多 就是 觉得 刮风 下雨 时候 Q 舒服
1 目前 9.2L / 100KM 计算 大概 9.6 南京 就是 而我 一般 短途 经常 基本 周末 开开 出去 玩玩 购物 走走 亲戚 而且 每次 开车 热车 1000 这样 油耗 差不多
1 高速 油耗 还不错 5.5-6L 市内 平均 车速 50KM 情况 油耗 达到 10L / 百公里 还是 偏高 特别 需要 指出 电脑 综合 油耗 误差 较大 平均 油耗 10L 电脑 显示 基本 8L
0 动力 疲软 高速 较大 悬挂 舒适性 欠佳 车身 激烈 驾驶 侧倾 明显
1 乘坐 空间 视野 在里面 局促 悬挂 震动感 明显
1 内饰 一般 定位 几万 小车 塑料 材质 可以 接受
1 老生长 油耗
2 比较 满意
2 内饰 不错
2 小F 刹车 很自如 很喜欢
2 起来 皮实
2 自驾东 1万多公里 各种 路面 跑起来 没有 发现 不适
1 基本上 油耗 工资 能够 忍耐 限度
2 空间 很大 尤其 驾驶员 位置 调整 后排 1.7m 标准 基本上 2 以上 空间 一家 出去玩 非常 舒服 空间 绝对 以为 地方 并且 后备箱 深度 很大 基本上 满足 日常 要求 出去玩 东西
2 2.0t 动力 非常好 可以说 随叫随到 随意 什么 时候 什么 时候 尤其 感觉 一点 费力 就算 满人 上坡 也是 有信心 加上 配合 6 双离合变速箱 绝对 黄金 搭档 这个 级别 用到 2.0t 发动机 绝对 独一无二
0 噪音
0 细致
2 车身 轻量化 日本 优势 所在 涡轮 增压 发动机 燃油 经济性 还行
0 一般 用料 较差 塑料感 做工 不错
2 质感 我喜欢
0 有点 就是 驾驶 自动
2 比较 温馨 内饰
2 多媒体 真皮 座椅 确实 不赖
2 后排座 可以 后备箱 就好
1 大气 一种 霸气感 屁股 有点 车灯
2 空间 外观 大气 !
0 价格高 4S店 一分 不用 优惠 配置 不是 很满意
0 A柱 转弯 视线 很多次 转弯 盲区 很大 脖子 看清楚 放心 开车 开车 过程 发现 不好 一点
2 后排 空间 很大 后备箱 家用 足够 后排 座椅 放倒 可以 踏板 ,
0 减震 噪音 可以 改善 其余 满意
1 果断 入手 当初 现在 入手 13 好看
1 英朗 总体来说 还是 比较 满意 不过 变速箱 漏油 现象 非常 普遍 异响 比较
2 麦逊 连杆 独立 悬挂 形式 底盘 调教 舒适性 为主 油门 整车 地盘 平稳 车身 稳定性 较好 方向盘 手感 不错 电子 助力 整体 操控 灵动 变速 系统 平稳 灵敏 高速 转弯 有点 侧倾
0 悬挂 有点 都是 音响效果 一般 音乐 发烧友 建议 改改 计划
2 由于 P版 基本 不用 总体 不错 一款 性价比 不错 下面 D 没有 列下 方向盘 换挡 定速 巡航 疝气 大灯 自动 大灯 电动 座椅 记忆 后排 座椅 加热 后排 中央 扶手 功能 按键 后视镜 记忆 后座 风口 LED 尾灯 后视镜 倒车 影像 车头 中网 前排 头部 气帘 气帘 胎压 监测 装置 大灯 清洗 装置 这么多 配置 建议 大家 还是 P 性价比
2 油耗 很好 对于 同级 不在
0 纵向 空间
0 1.6 动力
2 车辆 外形 大气
2 手动挡 操控 比较好 转向 指向性 准确
1 整体 比较 舒适 驾驶 起来 也是 舒服 空调 有点 稳定 刚刚 买车 时候 空调 但是 空调 越来越 觉得
2 1.6DVVT + 5 手动 发动机 属于 高转速 发动机 舍得 加速 不错 手动 变速箱 手感 挺好 一年 挂档 越来越好
2 属于 耐看型 顺眼
0 感觉 车身 单薄 高速
0 车头
2 20L 自然 吸气 发动机 算是 较好 加速 性能 6 20 相仿 但是 隔音 底盘 更好 加速 感觉 更为 线性 不知不觉 120km
2 高速 性能 非常好 150 160 觉得
1 够用 , 家里 没有 那种 个子 特别 . 储物 空间 败笔
0 一般 .
0 目前 为至 , 两次 高速 , 平时 出去玩 开开 . 车子 遇到 什么 问题 , 就是 车身 , 注意 时候 上面 有点 痕迹 , 郁闷 , 还有 , 最近 苏州 一次 冰雹 , 车顶 引擎 盖上 不少 , 比较 明显 那种 , 但是 旁边 一个 没有 . 我们 附近 几辆 没有 发现 冰雹 现象 . 咨询 售后 不在 保修 范围 . , 车身 脆弱 . 有点 , 感觉 上路 心里 安全感 .
2 空间 巨大
0 动力 一般 120 3000
2 舒适性 可以 起码 空间
0 内饰 老气 做工 不错 异响 也有
2 不错 操作
2 运动 符合 年轻人 感官
2 操控 可以 比较 舒适 但是 减震 如果 改进 减震K5 可以 更出色 轮胎 胎噪 过大 高速 行驶 100 速度 音响 音量 13 胎噪 还是 可以 清晰 听到 希望 2013 可以 更换 轮胎
2 搭赠 永远是 经典 真皮 座椅 真皮 包裹 中控台 一下子 抛弃 那种 塑料感 一种 豪车 感觉 感受到 全景 天窗 丰富 配置 k5 一下 留下 深刻 印象
0 油耗 有点 靠近 7
0 动力 一般 一档 二档 三档 我的最爱
1 座椅 包裹性 静音 不行
2 6.7万元 在里面 配置 最高
2 空间 前脸 好看 而且 价格 优惠
2 空间 同类 价位
2 不错 不是 飙车 刚刚
2 还不错 档位 清晰 就是 有时候 倒档 不好
2 车型 外观 动感 运动
1 一般 稍微 有点 特别是 怠速 时候 但是 长途 高速 节油
2 挂挡 入位 倒车 行车 操控 还不错
2 简洁
0 1.0 排量 有点 空调 动力 损失
2 因为 助力 起来 底盘 体宽 级别 ) 高速 140 觉得 面包 90 感到 刹车 给力 曾经 高速 120一脚 40 . 甩尾 底盘 起来 轿车 感觉 停车 很方便
2 外观 满意 买车 关注 熊猫 很久 时间 打算 买车 突然
2 外形 时尚 动感
2 外观 大气
1 9 10 平均 时速 19
2 车子 不错
2 够用 舍得 油门
0 表面 油漆 太软 , 轻轻 一点 见底 , 大包围装配接缝 较大 , 特别 大灯 接缝 , 看见 里面 螺丝 , 大灯 亮度 不够 , 晚上 行车 增加 安全 风险 , 备胎 几几 样子 不能 接受 ,
2 高速 油耗 7.0 - - 7.8 之间 ( 全程 空调 ) 市区 10.0 - 11.5 , 油耗 可以 接受
2 大气 , 时尚 大方 , 锋利 腰线 , 性感 PP ,
2 性价比 超群 . 动力 强劲 稳定性
1 小车 超市 走走 没想过 长途 都是 眨眼 所以 根本 没有 什么 不舒服
0 内饰 一般 有些 质量 不是 很好
0 动力 OK 配件 垃圾
0 后备箱 物件 不能 上次 岳父 家装
2 舒适性 这么说 这个 价位 而言 这款车 舒适性 还是 比较 过关 可能 是因为 跨界 缘故 噪音 还是 有点 红黑 相间 皮质 座椅 上去 感觉 还不错 等人 时候 打开 音乐 点支 比较 惬意
2 一个月 总体 感觉 还不错 现在 小白 4 63900 媳妇 因为 媳妇 驾照 出来 代为 磨合 这一个月 感受 就是 反正 野外 山区 这个 价位 SUV 肖克 途观 还有 感觉
2 空间 超大 操控性 动力 够用 视野 宽阔 安全性 较好
1 本人 身材 所有 后排 空间 凑合
1 经常 高速 所以 至今 综合 8.8
2 诸多 人性化 配置 随动 转向 自动 大灯 自动 雨刮
2 个人 感觉 很好 方向盘 很好
0 黑色 很容易 还有 就是 没有 升降器
2 当初 时候 不太 开车 油门 顿挫感 现在 这个 问题 什么 油门 别太急 接近 好多 还有 就是 30 时候 提速 需要 一点 时间 不会 上来 本人 新手 说不出 什么 意见 只能 自己 感觉到 总而言之 没有 失望 没有 后悔 购买
0 上坡 要命 吓死 一次2档 地板 超市 地上 车库 , 车子 越来越 动力 中间 踩刹车 可是 不管 怎么 油门 车子 没有 反应 1 油门 继续 这下 车轮 原地 空转 然后 体验 一把 赛车 感觉 一身 白毛 , 小舅子 凯越 3 可以 上去 之后 动力 不行 , 起步 加速 时候 低档 加速 , 3 以上 加速 还行 不愧为 高速 发动机 ! 感觉 就是 车速 越好 车速 悲催 1.6 人家 我们 中国 大马路 高速公路 还能 体验 一把 , 如果 喜欢 快车 比较 胃口 至于 喜欢 快车 所以 错车 当初 也是 5 连杆 吸引 , 没办法 大众神车 就是 即使 减配 还是 , 至少 起步 加速 就是 , 同学 朗逸
2 还好 2.0T 排量
2 1.5 排量 这种 动力 可以 虽然 提速 高速 155 相当 家里 一台 1.5 排量
2 内饰 满意 好多 人性化 储物 真皮 座椅 没有 异味 悦动 内味 一下
0 塑料件 塑料感 看起来 低档
2 个人 觉得 明锐 斯柯达 系列 漂亮 前脸 大气 尾部 庄重 有点 老年 意思 不过 选择 白明 装饰 点贴花 立马 年轻 10
2 非常 满意
2 空间 确实 很大 前排 后排 宽敞 1 后备箱 稍微 小点 本人 身高 1.81 驾驶 位置 后排 宽敞 窝腿
2 内饰 感觉 可以 个人 内饰 平常 很少 在意
2 骐达 作为 人生中 第一部 很不错 几个 同事 ( 网络工程师 ) 第一辆 都是 骐达 照片 爱车 PP 贴上 车标 感觉 确实 很少 喇叭 哈哈
2 油耗 基本 满意 市区 百公里 9 高速 8 左右 本人 13000多公里 平均 油耗 9.2 自己 驾驶 习惯 很大 关系 总体来说 油耗 还在 接受 范围
2 对于 主打 家用 车型 来说 卡罗拉 无疑 成功 毕竟 4000 销量 现在 级别 车型 日益 更新 今天 丰田 觉得 压力
2 超级喜欢 小指 外观
0 动力 ~ ~
2 买车 现在 一个月 3000公里 开始 时候 老婆 争议 僵持 一个多星期 老婆 买途观 但是 觉得 途观 个性 并且 感觉 有点像 中年人 老婆 觉得 小指 配置 没有 途观 个人 觉得 有些 配置 必要 有时候 一年 一次 其实 还是 自己 喜欢 但是 最好 老婆 还是 妥协 哈哈 那天 高兴 但是 SSSS 有点 小气 什么 礼品 ~ ~ ~ 目前 3000公里 油耗 市区 11 - 12 长途 8.5 还在 接受 范围 并且 觉得 空间 够用 不少 东西 动力 方面 反正 觉得 够用 因为 小指 毕竟 越野车 想要 强大 动力 或者 速度 激情 当然 轿车 ~ ~ 当然 可以 一类 非常 喜欢 大切 就是 经济 条件 允许 所以 小切 ~ 哈哈 目前 小切 经过 大风 大雨 发现 天窗 漏水 问题 感觉 欣慰 看图 ~ ~ ~ 注意 个人 观点 不喜 ~ ~ 谢谢
0 动力 不足 起步 稍微 有点
2 其实 有很多 一发 动机 世界 10 动力 足够 而且 使用 93 汽油 安全性 超高 据说 人员 死亡率 00 车型 外形 吸引
1 2.0T 四驱 一直 4 四驱 SUV , 但是 看到 2.0T 优点 吸引 放弃 四驱 400公里 时候 低速 熄火 难堪 恐怖 一件 事情 现在 900公里 没有 发生 不知道 后面 怎么样
2 感觉 不错 其他 第一辆 感觉 告诉 140
2 建议 直接 上高配 回来 之后 自己 加装 不少 东西 折腾 下来 高配 哈哈 得不偿失 总体来说 还是 好车 以后 应该 继续 考虑 雪铁龙
2 作为 职业 司机 来讲 我的选择
2 速腾 性价比 可以说 A级 最低 几乎 全国 优惠 甚至 黑心 4S 加价 价钱 已经 B级车 价钱 但是 喜欢 就是 喜欢 一样 速腾 除了 喜欢 外观 之外 更重要 速腾 体现 家用车 综合 经济性
2 驾驶 空间 还算 宽敞 视野 很好 避震 软硬 适中 适合 多种 路况
0 售后
2 综合 油耗 配置 功能 适用性 无需 增加 配置 操控 比较 精准 音响效果 可以
2 耐看 顺眼 肌肉感 屁股 个性 呵呵
2 个人 认为 超大 空间 普通 家用 轿车 队伍 无人 可以 匹敌 只能 跨界 SUV 比较
2 外观 经过 几次 小型 改装 本人 喜欢 尾部 秃秃 感觉 没有了 整体 日系 风范 毕露
2 上手
2 新手 感觉 还行
2 新手 总体来说 不错
1 1.6L 发动机 很多人 其实 没有 只有 油门 那么 动力 还是 完全 满足 一般 使用
2 鹰眼 大灯 很漂亮 感觉 威猛 但是 卤素大灯 硬伤 其实 够用 车体 流线感 不错 感觉 阳刚 锐气 时尚 前脸 屁股 都是 很漂亮 进气 大大 LOGO 给力 ~
2 操控 一流 指向 精准 路感
0 后排 空间 确实 老婆 小孩 前面 椅子 往后 后座 很难
2 可以 比赛 这点 够了 比赛 V12 朋友 锐志 提速 还在 磨合期 比较
2 非常 满意 本人 1 8 体重 180 里面 空间 有余 豪华版 电动 座椅 上下 前后 调节 很方便 后排 级别 最大 中级 后排 头部 空间 充足 驾驶 视线 很好 车身 缘故
2 油耗 7.3 左右 市区 大概 8 - 9 高速 大概 6 - 7 0 左右 油耗 大概 6 很好 综合 起来 油耗 7 多一点 完全 接受
0 配件 质量 有待 提高
0 地盘 悬挂 比较 颠簸 路面 容易 托底
0 低速 一般
1 漂亮 大灯 偷工减料
2 ESP , 6 气囊 性价比
2 这个 一大 优势 空间 绝对 够塞 后座 放下 简直 就是 一张 一直 笑称 一张 八仙桌 进去
1 就是 1.2 起步 感觉 动力 但是 一旦 速度 起来 感觉 就是 3 开始 压力
2 2.5G 动力 绝对 够用 红绿灯 好手 高速 上面 加速 比较 油门 轻松 120 .
2 转向 精准 低速 状态 方向盘 助力 还是 很好 方向 高速 状态 方向 助力 自动 调节 避免 碎盘 路面 不平 带来 方向 摇晃
2 还在 观望 同学 赶紧 下手 福克斯 绝对 值得 拥有 车型 还是 那句话 早买 享受
2 整车 质量 良好 钢板
2 还不错 真皮 座椅 硬度 适中 隔音 效果 可以 减震 效果 很好 空调 效果 可惜 没有 排出 风口 音响效果 尚可 导航 电视 功能 不错
0 减震 伏路 硬帮帮
2 方向盘 转向 精确 很舒服 挡位 行程 很舒服 挂挡 感觉 明显 出现 1 不好 情况 2 1 就好 论坛 看到 有人 手动车 1 倒档 不好 正常 多大 影响 现在 这样 很好
0 内饰 1 塑料 太多 也不 精致 不过 几W 不能 各方面 要求 那么
2 空间 比较 操控 性能 很好 特别 高速 以后 同事 大加 赞赏 用料 感觉 厚重
2 操控 灵敏 方向 指向性 很好 低速 高速 值得 赞赏
2 非常 一般 轿车 空间 而且 车身 偏高 头部 空间 舒适
2 外观 漂亮 大气 流线感 运动 十足
0 黑色 内饰 显得 空间 噪音 有点 隔音
0 还行 轿车 差点 音响效果 中等 后排 空间 比较 来说 比较 压抑 从来
1 低调 帕萨特 现在 细看 宝来朗逸 速腾 多少
1 中规中矩 大众 统一 内饰
2 舒适性 基本 可以 性价比 不错
2 舒适性 感觉 可以
1 2.0 起步 也不 绿叶肉 但是 时速 90 动力 输出 不足 当然 不是 2.0T , 这个 不能 苛求
因为 它太大了无法显示 source diff 。你可以改为 查看blob
因为 它太大了无法显示 source diff 。你可以改为 查看blob
python sentiment_classify.py --train_data_path ./data/train_data/corpus.train --word_dict_path ./data/train.vocab --mode finetune --model_path ./models
import sys
import time
import numpy as np
import paddle.fluid as fluid
import paddle
import paddle_hub as hub
def bow_net(data,
label,
dict_dim,
emb_dim=128,
hid_dim=128,
hid_dim2=96,
class_dim=2):
"""
Bow net
"""
# embedding layer
emb = fluid.layers.embedding(
input=data, size=[dict_dim, emb_dim], param_attr="bow_embedding")
# bow layer
bow = fluid.layers.sequence_pool(input=emb, pool_type='sum')
bow_tanh = fluid.layers.tanh(bow)
# full connect layer
fc_1 = fluid.layers.fc(
input=bow_tanh, size=hid_dim, act="tanh", name="bow_fc1")
fc_2 = fluid.layers.fc(
input=fc_1, size=hid_dim2, act="tanh", name="bow_fc2")
# softmax layer
prediction = fluid.layers.fc(
input=[fc_2], size=class_dim, act="softmax", name="fc_softmax")
cost = fluid.layers.cross_entropy(input=prediction, label=label)
avg_cost = fluid.layers.mean(x=cost)
acc = fluid.layers.accuracy(input=prediction, label=label)
return avg_cost, acc, prediction, bow_tanh
def cnn_net(data,
label,
dict_dim,
emb_dim=128,
hid_dim=128,
hid_dim2=96,
class_dim=2,
win_size=3):
"""
Conv net
"""
# embedding layer
emb = fluid.layers.embedding(input=data, size=[dict_dim, emb_dim])
# convolution layer
conv_3 = fluid.nets.sequence_conv_pool(
input=emb,
num_filters=hid_dim,
filter_size=win_size,
act="tanh",
pool_type="max")
# full connect layer
fc_1 = fluid.layers.fc(input=[conv_3], size=hid_dim2)
# softmax layer
prediction = fluid.layers.fc(input=[fc_1], size=class_dim, act="softmax")
cost = fluid.layers.cross_entropy(input=prediction, label=label)
avg_cost = fluid.layers.mean(x=cost)
acc = fluid.layers.accuracy(input=prediction, label=label)
return avg_cost, acc, prediction, [conv_3]
def lstm_net(data,
label,
dict_dim,
emb_dim=128,
hid_dim=128,
hid_dim2=96,
class_dim=2,
emb_lr=30.0):
"""
Lstm net
"""
# embedding layer
emb = fluid.layers.embedding(
input=data,
size=[dict_dim, emb_dim],
param_attr=fluid.ParamAttr(learning_rate=emb_lr))
# Lstm layer
fc0 = fluid.layers.fc(input=emb, size=hid_dim * 4)
lstm_h, c = fluid.layers.dynamic_lstm(
input=fc0, size=hid_dim * 4, is_reverse=False)
# max pooling layer
lstm_max = fluid.layers.sequence_pool(input=lstm_h, pool_type='max')
lstm_max_tanh = fluid.layers.tanh(lstm_max)
# full connect layer
fc1 = fluid.layers.fc(input=lstm_max_tanh, size=hid_dim2, act='tanh')
# softmax layer
prediction = fluid.layers.fc(input=fc1, size=class_dim, act='softmax')
cost = fluid.layers.cross_entropy(input=prediction, label=label)
avg_cost = fluid.layers.mean(x=cost)
acc = fluid.layers.accuracy(input=prediction, label=label)
return avg_cost, acc, prediction, lstm_max_tanh
def bilstm_net(data,
label,
dict_dim,
emb_dim=128,
hid_dim=128,
hid_dim2=96,
class_dim=2,
emb_lr=30.0):
"""
Bi-Lstm net
"""
# embedding layer
emb = fluid.layers.embedding(
input=data,
size=[dict_dim, emb_dim],
param_attr=fluid.ParamAttr(learning_rate=emb_lr))
# bi-lstm layer
fc0 = fluid.layers.fc(input=emb, size=hid_dim * 4)
rfc0 = fluid.layers.fc(input=emb, size=hid_dim * 4)
lstm_h, c = fluid.layers.dynamic_lstm(
input=fc0, size=hid_dim * 4, is_reverse=False)
rlstm_h, c = fluid.layers.dynamic_lstm(
input=rfc0, size=hid_dim * 4, is_reverse=True)
# extract last layer
lstm_last = fluid.layers.sequence_last_step(input=lstm_h)
rlstm_last = fluid.layers.sequence_last_step(input=rlstm_h)
lstm_last_tanh = fluid.layers.tanh(lstm_last)
rlstm_last_tanh = fluid.layers.tanh(rlstm_last)
# concat layer
lstm_concat = fluid.layers.concat(input=[lstm_last, rlstm_last], axis=1)
# full connect layer
fc1 = fluid.layers.fc(input=lstm_concat, size=hid_dim2, act='tanh')
# softmax layer
prediction = fluid.layers.fc(input=fc1, size=class_dim, act='softmax')
cost = fluid.layers.cross_entropy(input=prediction, label=label)
avg_cost = fluid.layers.mean(x=cost)
acc = fluid.layers.accuracy(input=prediction, label=label)
return avg_cost, acc, prediction, lstm_concat
def gru_net(data,
label,
dict_dim,
emb_dim=128,
hid_dim=128,
hid_dim2=96,
class_dim=2,
emb_lr=30.0):
"""
gru net
"""
emb = fluid.layers.embedding(
input=data,
size=[dict_dim, emb_dim],
param_attr=fluid.ParamAttr(learning_rate=emb_lr))
fc0 = fluid.layers.fc(input=emb, size=hid_dim * 3)
gru_h = fluid.layers.dynamic_gru(input=fc0, size=hid_dim, is_reverse=False)
gru_max = fluid.layers.sequence_pool(input=gru_h, pool_type='max')
gru_max_tanh = fluid.layers.tanh(gru_max)
fc1 = fluid.layers.fc(input=gru_max_tanh, size=hid_dim2, act='tanh')
prediction = fluid.layers.fc(input=fc1, size=class_dim, act='softmax')
cost = fluid.layers.cross_entropy(input=prediction, label=label)
avg_cost = fluid.layers.mean(x=cost)
acc = fluid.layers.accuracy(input=prediction, label=label)
return avg_cost, acc, prediction, gru_max_tanh
# coding: utf-8
import sys
import os
import time
import unittest
import contextlib
import logging
import argparse
import ast
import paddle.fluid as fluid
import paddle_hub as hub
import utils
from nets import bow_net
from nets import cnn_net
from nets import lstm_net
from nets import bilstm_net
from nets import gru_net
logger = logging.getLogger("paddle-fluid")
logger.setLevel(logging.INFO)
def parse_args():
parser = argparse.ArgumentParser("Sentiment Classification.")
# training data path
parser.add_argument(
"--train_data_path",
type=str,
required=False,
help="The path of trainning data. Should be given in train mode!")
# test data path
parser.add_argument(
"--test_data_path",
type=str,
required=False,
help="The path of test data. Should be given in eval or infer mode!")
# word_dict path
parser.add_argument(
"--word_dict_path",
type=str,
required=True,
help="The path of word dictionary.")
# current mode
parser.add_argument(
"--mode",
type=str,
required=True,
choices=['train', 'eval', 'infer', 'finetune'],
help="train/eval/infer mode")
# model type
parser.add_argument(
"--model_type", type=str, default="bow_net", help="type of model")
# model save path
parser.add_argument(
"--model_path",
type=str,
default="models",
required=True,
help="The path to saved the trained models.")
# Number of passes for the training task.
parser.add_argument(
"--num_passes",
type=int,
default=10,
help="Number of passes for the training task.")
# Batch size
parser.add_argument(
"--batch_size",
type=int,
default=256,
help="The number of training examples in one forward/backward pass.")
# lr value for training
parser.add_argument(
"--lr", type=float, default=0.002, help="The lr value for training.")
# Whether to use gpu
parser.add_argument(
"--use_gpu",
type=ast.literal_eval,
default=False,
help="Whether to use gpu to train the model.")
# parallel train
parser.add_argument(
"--is_parallel",
type=ast.literal_eval,
default=False,
help="Whether to train the model in parallel.")
args = parser.parse_args()
return args
def train_net(train_reader,
word_dict,
network_name,
use_gpu,
parallel,
save_dirname,
lr=0.002,
batch_size=128,
pass_num=30):
"""
train network
"""
if network_name == "bilstm_net":
network = bilstm_net
elif network_name == "bow_net":
network = bow_net
elif network_name == "cnn_net":
network = cnn_net
elif network_name == "lstm_net":
network = lstm_net
elif network_name == "gru_net":
network = gru_net
else:
print("unknown network type")
return
label = fluid.layers.data(name="label", shape=[1], dtype="int64")
data = fluid.layers.data(
name="words", shape=[1], dtype="int64", lod_level=1)
cost, acc, pred, sent_emb = network(data, label, len(word_dict) + 2)
# set optimizer
sgd_optimizer = fluid.optimizer.Adagrad(learning_rate=lr)
sgd_optimizer.minimize(cost)
# set place, executor, datafeeder
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace()
exe = fluid.Executor(place)
feeder = fluid.DataFeeder(feed_list=["words", "label"], place=place)
exe.run(fluid.default_startup_program())
# start training...
for pass_id in range(pass_num):
data_size, data_count, total_acc, total_cost = 0, 0, 0.0, 0.0
for batch in train_reader():
avg_cost_np, avg_acc_np = exe.run(
fluid.default_main_program(),
feed=feeder.feed(batch),
fetch_list=[cost, acc],
return_numpy=True)
data_size = len(batch)
total_acc += data_size * avg_acc_np
total_cost += data_size * avg_cost_np
data_count += data_size
avg_cost = total_cost / data_count
avg_acc = total_acc / data_count
print("[train info]: pass_id: %d, avg_acc: %f, avg_cost: %f" %
(pass_id, avg_acc, avg_cost))
# create Senta module
module_dir = os.path.join(save_dirname, network_name)
signature = hub.create_signature(
"default", inputs=[data], outputs=[sent_emb])
hub.create_module(
sign_arr=signature,
program=fluid.default_main_program(),
path=module_dir)
def retrain_net(train_reader,
word_dict,
network_name,
use_gpu,
parallel,
save_dirname,
lr=0.002,
batch_size=128,
pass_num=30):
"""
train network
"""
if network_name == "bilstm_net":
network = bilstm_net
elif network_name == "bow_net":
network = bow_net
elif network_name == "cnn_net":
network = cnn_net
elif network_name == "lstm_net":
network = lstm_net
elif network_name == "gru_net":
network = gru_net
else:
print("unknown network type")
return
emb_dim = 128
hid_dim = 128
hid_dim2 = 96
class_dim = 2
dict_dim = len(word_dict) + 2
module_dir = os.path.join(save_dirname, network_name)
print("module_dir", module_dir)
module = hub.Module(module_dir=module_dir)
main_program = fluid.Program()
startup_program = fluid.Program()
# use switch program to test fine-tuning
fluid.framework.switch_main_program(module.get_inference_program())
# remove feed fetch operator and variable
hub.ModuleUtils.remove_feed_fetch_op(fluid.default_main_program())
label = fluid.layers.data(name="label", shape=[1], dtype="int64")
data = module.get_feed_var_by_index(0)
#TODO(ZeyuChen): how to get output paramter according to proto config
sent_emb = module.get_fetch_var_by_index(0)
fc_2 = fluid.layers.fc(
input=sent_emb, size=hid_dim2, act="tanh", name="bow_fc2")
# softmax layer
pred = fluid.layers.fc(input=[fc_2], size=class_dim, act="softmax")
# print(fluid.default_main_program())
cost = fluid.layers.mean(
fluid.layers.cross_entropy(input=pred, label=label))
acc = fluid.layers.accuracy(input=pred, label=label)
# set optimizer
sgd_optimizer = fluid.optimizer.Adagrad(learning_rate=lr)
sgd_optimizer.minimize(cost)
# set place, executor, datafeeder
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace()
exe = fluid.Executor(place)
feeder = fluid.DataFeeder(feed_list=["words", "label"], place=place)
exe.run(fluid.default_startup_program())
# start training...
for pass_id in range(pass_num):
data_size, data_count, total_acc, total_cost = 0, 0, 0.0, 0.0
for batch in train_reader():
avg_cost_np, avg_acc_np = exe.run(
fluid.default_main_program(),
feed=feeder.feed(batch),
fetch_list=[cost, acc],
return_numpy=True)
data_size = len(batch)
total_acc += data_size * avg_acc_np
total_cost += data_size * avg_cost_np
data_count += data_size
avg_cost = total_cost / data_count
avg_acc = total_acc / data_count
print("[train info]: pass_id: %d, avg_acc: %f, avg_cost: %f" %
(pass_id, avg_acc, avg_cost))
# save the model
module_dir = os.path.join(save_dirname, network_name)
signature = hub.create_signature(
"default", inputs=[data], outputs=[sent_emb])
hub.create_module(
sign_arr=signature,
program=fluid.default_main_program(),
path=module_dir)
def eval_net(test_reader, use_gpu, model_path=None):
"""
Evaluation function
"""
if model_path is None:
print(str(model_path) + "can not be found")
return
# set place, executor
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace()
exe = fluid.Executor(place)
inference_scope = fluid.core.Scope()
with fluid.scope_guard(inference_scope):
# load the saved model
[inference_program, feed_target_names,
fetch_targets] = fluid.io.load_inference_model(model_path, exe)
# compute 2class and 3class accuracy
class2_acc, class3_acc = 0.0, 0.0
total_count, neu_count = 0, 0
for data in test_reader():
# infer a batch
pred = exe.run(
inference_program,
feed=utils.data2tensor(data, place),
fetch_list=fetch_targets,
return_numpy=True)
for i, val in enumerate(data):
class3_label, class2_label = utils.get_predict_label(
pred[0][i, 1])
true_label = val[1]
if class2_label == true_label:
class2_acc += 1
if class3_label == true_label:
class3_acc += 1
if true_label == 1.0:
neu_count += 1
total_count += len(data)
class2_acc = class2_acc / (total_count - neu_count)
class3_acc = class3_acc / total_count
print("[test info] model_path: %s, class2_acc: %f, class3_acc: %f" %
(model_path, class2_acc, class3_acc))
def infer_net(test_reader, use_gpu, model_path=None):
"""
Inference function
"""
if model_path is None:
print(str(model_path) + "can not be found")
return
# set place, executor
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace()
exe = fluid.Executor(place)
inference_scope = fluid.core.Scope()
with fluid.scope_guard(inference_scope):
# load the saved model
[inference_program, feed_target_names,
fetch_targets] = fluid.io.load_inference_model(model_path, exe)
for data in test_reader():
# infer a batch
pred = exe.run(
inference_program,
feed=utils.data2tensor(data, place),
fetch_list=fetch_targets,
return_numpy=True)
for i, val in enumerate(data):
class3_label, class2_label = utils.get_predict_label(
pred[0][i, 1])
pos_prob = pred[0][i, 1]
neg_prob = 1 - pos_prob
print("predict label: %d, pos_prob: %f, neg_prob: %f" %
(class3_label, pos_prob, neg_prob))
def main(args):
# train mode
if args.mode == "train":
# prepare_data to get word_dict, train_reader
word_dict, train_reader = utils.prepare_data(args.train_data_path,
args.word_dict_path,
args.batch_size, args.mode)
train_net(train_reader, word_dict, args.model_type, args.use_gpu,
args.is_parallel, args.model_path, args.lr, args.batch_size,
args.num_passes)
# train mode
if args.mode == "finetune":
# prepare_data to get word_dict, train_reader
word_dict, train_reader = utils.prepare_data(args.train_data_path,
args.word_dict_path,
args.batch_size, args.mode)
retrain_net(train_reader, word_dict, args.model_type, args.use_gpu,
args.is_parallel, args.model_path, args.lr, args.batch_size,
args.num_passes)
# eval mode
elif args.mode == "eval":
# prepare_data to get word_dict, test_reader
word_dict, test_reader = utils.prepare_data(args.test_data_path,
args.word_dict_path,
args.batch_size, args.mode)
eval_net(test_reader, args.use_gpu, args.model_path)
# infer mode
elif args.mode == "infer":
# prepare_data to get word_dict, test_reader
word_dict, test_reader = utils.prepare_data(args.test_data_path,
args.word_dict_path,
args.batch_size, args.mode)
infer_net(test_reader, args.use_gpu, args.model_path)
if __name__ == "__main__":
args = parse_args()
main(args)
# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# coding: utf-8
import sys
import os
import time
import unittest
import contextlib
import logging
import argparse
import ast
import utils
import paddle.fluid as fluid
import paddle_hub as hub
from nets import bow_net
from nets import cnn_net
from nets import lstm_net
from nets import bilstm_net
from nets import gru_net
logger = logging.getLogger("paddle-fluid")
logger.setLevel(logging.INFO)
def parse_args():
parser = argparse.ArgumentParser("Sentiment Classification.")
# training data path
parser.add_argument(
"--train_data_path",
type=str,
required=False,
help="The path of trainning data. Should be given in train mode!")
# test data path
parser.add_argument(
"--test_data_path",
type=str,
required=False,
help="The path of test data. Should be given in eval or infer mode!")
# word_dict path
parser.add_argument(
"--word_dict_path",
type=str,
required=True,
help="The path of word dictionary.")
# current mode
parser.add_argument(
"--mode",
type=str,
required=True,
choices=['train', 'eval', 'infer'],
help="train/eval/infer mode")
# model type
parser.add_argument(
"--model_type", type=str, default="bow_net", help="type of model")
# model save path parser.add_argument(
parser.add_argument(
"--model_path",
type=str,
default="models",
required=True,
help="The path to saved the trained models.")
# Number of passes for the training task.
parser.add_argument(
"--num_passes",
type=int,
default=3,
help="Number of passes for the training task.")
# Batch size
parser.add_argument(
"--batch_size",
type=int,
default=256,
help="The number of training examples in one forward/backward pass.")
# lr value for training
parser.add_argument(
"--lr", type=float, default=0.002, help="The lr value for training.")
# Whether to use gpu
parser.add_argument(
"--use_gpu",
type=ast.literal_eval,
default=False,
help="Whether to use gpu to train the model.")
# parallel train
parser.add_argument(
"--is_parallel",
type=ast.literal_eval,
default=False,
help="Whether to train the model in parallel.")
args = parser.parse_args()
return args
def bow_net_module(data,
label,
dict_dim,
emb_dim=128,
hid_dim=128,
hid_dim2=96,
class_dim=2):
"""
Bow net
"""
module_dir = "./model/test_create_module"
# embedding layer
emb = fluid.layers.embedding(
input=data, size=[dict_dim, emb_dim], param_attr="bow_embedding")
# bow layer
bow = fluid.layers.sequence_pool(input=emb, pool_type='sum')
bow_tanh = fluid.layers.tanh(bow)
# full connect layer
fc_1 = fluid.layers.fc(
input=bow_tanh, size=hid_dim, act="tanh", name="bow_fc1")
fc_2 = fluid.layers.fc(
input=fc_1, size=hid_dim2, act="tanh", name="bow_fc2")
# softmax layer
prediction = fluid.layers.fc(
input=[fc_2], size=class_dim, act="softmax", name="fc_softmax")
cost = fluid.layers.cross_entropy(input=prediction, label=label)
avg_cost = fluid.layers.mean(x=cost)
acc = fluid.layers.accuracy(input=prediction, label=label)
return avg_cost, acc, prediction, emb
def train_net(train_reader,
word_dict,
network_name,
use_gpu,
parallel,
save_dirname,
lr=0.002,
batch_size=128,
pass_num=10):
"""
train network
"""
if network_name == "bilstm_net":
network = bilstm_net
elif network_name == "bow_net":
network = bow_net
elif network_name == "cnn_net":
network = cnn_net
elif network_name == "lstm_net":
network = lstm_net
elif network_name == "gru_net":
network = gru_net
else:
print("unknown network type")
return
label = fluid.layers.data(name="label", shape=[1], dtype="int64")
data = fluid.layers.data(
name="words", shape=[1], dtype="int64", lod_level=1)
cost, acc, pred, emb = network(data, label, len(word_dict) + 2)
# set optimizer
sgd_optimizer = fluid.optimizer.Adagrad(learning_rate=lr)
sgd_optimizer.minimize(cost)
# set place, executor, datafeeder
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace()
exe = fluid.Executor(place)
feeder = fluid.DataFeeder(feed_list=["words", "label"], place=place)
exe.run(fluid.default_startup_program())
# start training...
for pass_id in range(pass_num):
data_size, data_count, total_acc, total_cost = 0, 0, 0.0, 0.0
for batch in train_reader():
avg_cost_np, avg_acc_np = exe.run(
fluid.default_main_program(),
feed=feeder.feed(batch),
fetch_list=[cost, acc],
return_numpy=True)
data_size = len(batch)
total_acc += data_size * avg_acc_np
total_cost += data_size * avg_cost_np
data_count += data_size
avg_cost = total_cost / data_count
avg_acc = total_acc / data_count
print("[train info]: pass_id: %d, avg_acc: %f, avg_cost: %f" %
(pass_id, avg_acc, avg_cost))
# save the model
module_dir = os.path.join(save_dirname, network_name)
config = hub.ModuleConfig(module_dir)
config.save_dict(word_dict=word_dict)
# saving config
input_desc = {"words": data.name}
output_desc = {"emb": emb.name}
config.register_feed_signature(input_desc)
config.register_fetch_signature(output_desc)
config.dump()
feed_var_name = config.feed_var_name("words")
fluid.io.save_inference_model(module_dir, [feed_var_name], emb, exe)
def retrain_net(train_reader,
word_dict,
network_name,
use_gpu,
parallel,
save_dirname,
lr=0.002,
batch_size=128,
pass_num=30):
"""
train network
"""
if network_name == "bilstm_net":
network = bilstm_net
elif network_name == "bow_net":
network = bow_net
elif network_name == "cnn_net":
network = cnn_net
elif network_name == "lstm_net":
network = lstm_net
elif network_name == "gru_net":
network = gru_net
else:
print("unknown network type")
return
dict_dim = len(word_dict) + 2
emb_dim = 128
hid_dim = 128
hid_dim2 = 96
class_dim = 2
module_path = "./models/bow_net"
module = hub.Module(module_dir=module_path)
main_program = fluid.Program()
startup_program = fluid.Program()
# use switch program to test fine-tuning
fluid.framework.switch_main_program(module.get_inference_program())
# remove feed fetch operator and variable
hub.ModuleUtils.remove_feed_fetch_op(fluid.default_main_program())
label = fluid.layers.data(name="label", shape=[1], dtype="int64")
data = module.get_feed_var("words")
emb = module.get_fetch_var("emb")
# bow layer
bow = fluid.layers.sequence_pool(input=emb, pool_type='sum')
bow_tanh = fluid.layers.tanh(bow)
# full connect layer
fc_1 = fluid.layers.fc(
input=bow_tanh, size=hid_dim, act="tanh", name="bow_fc1")
fc_2 = fluid.layers.fc(
input=fc_1, size=hid_dim2, act="tanh", name="bow_fc2")
# softmax layer
pred = fluid.layers.fc(input=[fc_2], size=class_dim, act="softmax")
cost = fluid.layers.mean(
fluid.layers.cross_entropy(input=pred, label=label))
acc = fluid.layers.accuracy(input=pred, label=label)
# set optimizer
sgd_optimizer = fluid.optimizer.Adagrad(learning_rate=lr)
sgd_optimizer.minimize(cost)
# set place, executor, datafeeder
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace()
exe = fluid.Executor(place)
feeder = fluid.DataFeeder(feed_list=["words", "label"], place=place)
exe.run(fluid.default_startup_program())
# start training...
for pass_id in range(pass_num):
data_size, data_count, total_acc, total_cost = 0, 0, 0.0, 0.0
for batch in train_reader():
avg_cost_np, avg_acc_np = exe.run(
fluid.default_main_program(),
feed=feeder.feed(batch),
fetch_list=[cost, acc],
return_numpy=True)
data_size = len(batch)
total_acc += data_size * avg_acc_np
total_cost += data_size * avg_cost_np
data_count += data_size
avg_cost = total_cost / data_count
avg_acc = total_acc / data_count
print("[train info]: pass_id: %d, avg_acc: %f, avg_cost: %f" %
(pass_id, avg_acc, avg_cost))
# save the model
module_dir = os.path.join(save_dirname, network_name + "_retrain")
fluid.io.save_inference_model(module_dir, ["words"], emb, exe)
config = hub.ModuleConfig(module_dir)
config.save_dict(word_dict=word_dict)
config.dump()
def main(args):
# prepare_data to get word_dict, train_reader
word_dict, train_reader = utils.prepare_data(
args.train_data_path, args.word_dict_path, args.batch_size, args.mode)
train_net(train_reader, word_dict, args.model_type, args.use_gpu,
args.is_parallel, args.model_path, args.lr, args.batch_size,
args.num_passes)
# NOTE(ZeyuChen): can't run train_net and retrain_net together
# retrain_net(train_reader, word_dict, args.model_type, args.use_gpu,
# args.is_parallel, args.model_path, args.lr, args.batch_size,
# args.num_passes)
if __name__ == "__main__":
args = parse_args()
main(args)
# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# coding: utf-8
import sys
import os
import time
import unittest
import contextlib
import logging
import argparse
import ast
import utils
import paddle.fluid as fluid
import paddle_hub as hub
from nets import bow_net
from nets import cnn_net
from nets import lstm_net
from nets import bilstm_net
from nets import gru_net
logger = logging.getLogger("paddle-fluid")
logger.setLevel(logging.INFO)
def parse_args():
parser = argparse.ArgumentParser("Sentiment Classification.")
# training data path
parser.add_argument(
"--train_data_path",
type=str,
required=False,
help="The path of trainning data. Should be given in train mode!")
# test data path
parser.add_argument(
"--test_data_path",
type=str,
required=False,
help="The path of test data. Should be given in eval or infer mode!")
# word_dict path
parser.add_argument(
"--word_dict_path",
type=str,
required=True,
help="The path of word dictionary.")
# current mode
parser.add_argument(
"--mode",
type=str,
required=True,
choices=['train', 'eval', 'infer'],
help="train/eval/infer mode")
# model type
parser.add_argument(
"--model_type", type=str, default="bow_net", help="type of model")
# model save path
parser.add_argument(
"--model_path",
type=str,
default="models",
required=True,
help="The path to saved the trained models.")
# Number of passes for the training task.
parser.add_argument(
"--num_passes",
type=int,
default=10,
help="Number of passes for the training task.")
# Batch size
parser.add_argument(
"--batch_size",
type=int,
default=256,
help="The number of training examples in one forward/backward pass.")
# lr value for training
parser.add_argument(
"--lr", type=float, default=0.002, help="The lr value for training.")
# Whether to use gpu
parser.add_argument(
"--use_gpu",
type=ast.literal_eval,
default=False,
help="Whether to use gpu to train the model.")
# parallel train
parser.add_argument(
"--is_parallel",
type=ast.literal_eval,
default=False,
help="Whether to train the model in parallel.")
args = parser.parse_args()
return args
def retrain_net(train_reader,
word_dict,
network_name,
use_gpu,
parallel,
save_dirname,
lr=0.002,
batch_size=128,
pass_num=30):
"""
train network
"""
if network_name == "bilstm_net":
network = bilstm_net
elif network_name == "bow_net":
network = bow_net
elif network_name == "cnn_net":
network = cnn_net
elif network_name == "lstm_net":
network = lstm_net
elif network_name == "gru_net":
network = gru_net
else:
print("unknown network type")
return
dict_dim = len(word_dict) + 2
emb_dim = 128
hid_dim = 128
hid_dim2 = 96
class_dim = 2
module_path = "./models/bow_net"
module = hub.Module(module_dir=module_path)
main_program = fluid.Program()
startup_program = fluid.Program()
# use switch program to test fine-tuning
fluid.framework.switch_main_program(module.get_inference_program())
# remove feed fetch operator and variable
hub.ModuleUtils.remove_feed_fetch_op(fluid.default_main_program())
# remove_feed_fetch_op(fluid.default_main_program())
label = fluid.layers.data(name="label", shape=[1], dtype="int64")
#data = fluid.default_main_program().global_block().var("words")
data = module.get_feed_var("words")
#TODO(ZeyuChen): how to get output paramter according to proto config
emb = module.get_fetch_var("emb")
# # # embedding layer
# emb = fluid.layers.embedding(input=data, size=[dict_dim, emb_dim])
# #input=data, size=[dict_dim, emb_dim], param_attr="bow_embedding")
# # bow layer
bow = fluid.layers.sequence_pool(input=emb, pool_type='sum')
bow_tanh = fluid.layers.tanh(bow)
# full connect layer
fc_1 = fluid.layers.fc(
input=bow_tanh, size=hid_dim, act="tanh", name="bow_fc1")
fc_2 = fluid.layers.fc(
input=fc_1, size=hid_dim2, act="tanh", name="bow_fc2")
# softmax layer
pred = fluid.layers.fc(input=[fc_2], size=class_dim, act="softmax")
# print(fluid.default_main_program())
cost = fluid.layers.mean(
fluid.layers.cross_entropy(input=pred, label=label))
acc = fluid.layers.accuracy(input=pred, label=label)
# set optimizer
sgd_optimizer = fluid.optimizer.Adagrad(learning_rate=lr)
sgd_optimizer.minimize(cost)
# set place, executor, datafeeder
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace()
exe = fluid.Executor(place)
feeder = fluid.DataFeeder(feed_list=["words", "label"], place=place)
exe.run(fluid.default_startup_program())
# start training...
for pass_id in range(pass_num):
data_size, data_count, total_acc, total_cost = 0, 0, 0.0, 0.0
for batch in train_reader():
avg_cost_np, avg_acc_np = exe.run(
fluid.default_main_program(),
feed=feeder.feed(batch),
fetch_list=[cost, acc],
return_numpy=True)
data_size = len(batch)
total_acc += data_size * avg_acc_np
total_cost += data_size * avg_cost_np
data_count += data_size
avg_cost = total_cost / data_count
avg_acc = total_acc / data_count
print("[train info]: pass_id: %d, avg_acc: %f, avg_cost: %f" %
(pass_id, avg_acc, avg_cost))
# save the model
module_dir = os.path.join(save_dirname, network_name + "_retrain")
fluid.io.save_inference_model(module_dir, ["words"], emb, exe)
input_desc = {"words": data.name}
output_desc = {"emb": emb.name}
config = hub.ModuleConfig(module_dir)
config.save_dict(word_dict=word_dict)
config.dump()
def main(args):
# prepare_data to get word_dict, train_reader
word_dict, train_reader = utils.prepare_data(
args.train_data_path, args.word_dict_path, args.batch_size, args.mode)
retrain_net(train_reader, word_dict, args.model_type, args.use_gpu,
args.is_parallel, args.model_path, args.lr, args.batch_size,
args.num_passes)
if __name__ == "__main__":
args = parse_args()
main(args)
python sentiment_classify.py --train_data_path ./data/train_data/corpus.train --word_dict_path ./data/train.vocab --mode train --model_path ./models
import os
import sys
import time
import numpy as np
import random
import paddle.fluid as fluid
import paddle
def get_predict_label(pos_prob):
neg_prob = 1 - pos_prob
# threshold should be (1, 0.5)
neu_threshold = 0.55
if neg_prob > neu_threshold:
class3_label = 0
elif pos_prob > neu_threshold:
class3_label = 2
else:
class3_label = 1
if pos_prob >= neg_prob:
class2_label = 2
else:
class2_label = 0
return class3_label, class2_label
def to_lodtensor(data, place):
"""
convert ot LODtensor
"""
seq_lens = [len(seq) for seq in data]
cur_len = 0
lod = [cur_len]
for l in seq_lens:
cur_len += l
lod.append(cur_len)
flattened_data = np.concatenate(data, axis=0).astype("int64")
flattened_data = flattened_data.reshape([len(flattened_data), 1])
res = fluid.LoDTensor()
res.set(flattened_data, place)
res.set_lod([lod])
return res
def data2tensor(data, place):
"""
data2tensor
"""
input_seq = to_lodtensor(map(lambda x: x[0], data), place)
return {"words": input_seq}
def data_reader(file_path, word_dict, is_shuffle=True):
"""
Convert word sequence into slot
"""
unk_id = len(word_dict)
all_data = []
with open(file_path, "r") as fin:
for line in fin:
cols = line.strip().split("\t")
label = int(cols[0])
wids = [
word_dict[x] if x in word_dict else unk_id
for x in cols[1].split(" ")
]
all_data.append((wids, label))
if is_shuffle:
random.shuffle(all_data)
def reader():
for doc, label in all_data:
yield doc, label
return reader
def load_vocab(file_path):
"""
load the given vocabulary
"""
vocab = {}
with open(file_path) as f:
wid = 0
for line in f:
vocab[line.strip()] = wid
wid += 1
vocab["<unk>"] = len(vocab)
return vocab
def prepare_data(data_path, word_dict_path, batch_size, mode):
"""
prepare data
"""
assert os.path.exists(
word_dict_path), "The given word dictionary dose not exist."
if mode == "train":
assert os.path.exists(
data_path), "The given training data does not exist."
if mode == "eval" or mode == "infer":
assert os.path.exists(data_path), "The given test data does not exist."
word_dict = load_vocab(word_dict_path)
if mode == "train":
train_reader = paddle.batch(
data_reader(data_path, word_dict, True), batch_size)
return word_dict, train_reader
else:
test_reader = paddle.batch(
data_reader(data_path, word_dict, False), batch_size)
return word_dict, test_reader
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册