智能對聯模型太難完成?華為雲ModelArts助你實現!手把手教學


摘要:農歷新年將至,聽說華為雲 AI 又將開啟智能對對聯迎接牛氣沖天,讓我們拭目以待!作為資深 Copy 攻城獅,想要自己實現一個對對聯的模型,是不能可能完成的任務,因此我搜羅了不少前人的實踐案例,今天想和大家分享的是 和鯨社區的 rua年糕 貢獻的項目-AI 對聯,基於 ModelArts 的  「我的筆記本」實現。
華為雲EI專家胡琦

一、環境准備

准備環境前,先嘮叨幾句:ModelArts 是面向開發者的一站式AI開發平台,ModelArts 在人工智能三要素中都有非常出色的表現,數據方面提供海量數據預處理及半自動化標注,算法方面除了開發者自己開發還=提供大量的預置算法和訂閱算法可供選擇,算力方面目前開發環境提供免費算力以及即點即用的「我的筆記本」。目前個人比較中意的功能就是「我的筆記本」,如果您體驗過 MindSpore 教程的 「Run in ModelArts」,您會發現其實教程中鏈接的就是 ModelArts 的 「我的筆記本」模塊,具體體驗可閱讀我的歷史文章5分鍾在線體驗MindSpore的圖層IR--MindIR

相比常規的開發先要裝一堆的環境和軟件,基於 ModelArts 的 AI 開發似乎變得更簡單,理論上有能上網的設備就夠了,比如 pad,然后僅僅需要注冊一個華為雲賬號並實名認證。當然,ModelArts准備工作並不僅僅是這些,比如如需用到 OBS 還需生成訪問密鑰並完成 ModelArts 全局配置。具體操作請參考ModelArts-Lab:https://gitee.com/ModelArts/ModelArts-Lab

Free 的「我的筆記本」就在 ModelArts 總覽頁底部的開發工具卡片中,點擊「立即體驗」即可開啟一個默認的 CPU 環境的 JupyterLab,我們可以在右邊的「切換規格」欄進行環境或者規格的切換。需要注意的是:切換資源后,將影響實例下所有Notebook與Terminal。Notebook中執行的所有變量將失效,Terminal需要重新打開,手動安裝包不再生效,需要重新執行。 目前, CPU 和 GPU 環境支持 Conda-python3 、Pytorch-1.0.0、TensorFlow-1.13.1等8種Notebook環境,不過使用 GPU 需要注意:1、免費規格用於使用體驗,會在1小時后自動停止;2、免費算力不包含對象存儲服務(OBS)存儲資源費用。 如果想使用 MindSpore 框架,可以從 MindSpore 官方文檔教程中的 「Run in ModelArts」進行跳轉到帶有 MindSpore 框架的 JupyterLab。

二、Seq2Seq 簡介

Seq2Seq是 Google 在 2017年開源的一款用於 TensorFlow 的通用編碼器&解碼器框架(encoder-decoder framework),可用於機器翻譯、文本摘要、會話建模、圖像描述等。

論文地址: https://arxiv.org/abs/1703.03906

三、Copy 實踐

新建 TensorFlow 1.13.1 環境的 notebook 文件,開始代碼編(kao)寫(bei)。

  • 數據集下載

couplet-dataset 盡管比較陳舊,但擁有 70 萬條數據,應該夠實現一個簡單的對對聯模型。

!wget https://github.com/wb14123/couplet-dataset/releases/download/1.0/couplet.tar.gz
!tar -xzvf couplet.tar.gz
!mkdir couplet/model
  • 依賴安裝及引用

!pip install klab-autotime
!pip install backcall
import codecs
import numpy as np
from keras.models import Model
from keras.layers import *
from keras.callbacks import Callback
# 顯示cell運行時長
%load_ext klab-autotime

# 使用GPU
import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
# The GPU id to use, usually either "0" or "1"
os.environ["CUDA_VISIBLE_DEVICES"]="0" 
  • 數據處理

# 定義參數
min_count = 2
maxlen = 16
batch_size = 64
char_size = 128
train_input_path = 'couplet/train/in.txt'
train_output_path = 'couplet/train/out.txt'
test_input_path = 'couplet/test/in.txt'
test_output_path = 'couplet/test/out.txt'
# 數據讀取與切分
def read_data(txtname):
    txt = codecs.open(txtname, encoding='utf-8').readlines()
    txt = [line.strip().split(' ') for line in txt]      # 每行按空格切分
    txt = [line for line in txt if len(line) <= maxlen]  # 過濾掉字數超過maxlen的對聯
    return txt
  • 模型定義

def gated_resnet(x, ksize=3):
    # 門卷積 + 殘差
    x_dim = K.int_shape(x)[-1]
    xo = Conv1D(x_dim*2, ksize, padding='same')(x)
    return Lambda(lambda x: x[0] * K.sigmoid(x[1][..., :x_dim]) \
                            + x[1][..., x_dim:] * K.sigmoid(-x[1][..., :x_dim]))([x, xo])

                            x_in = Input(shape=(None,))
x = x_in
x = Embedding(len(chars)+1, char_size)(x)
x = Dropout(0.25)(x)

x = gated_resnet(x)
x = gated_resnet(x)
x = gated_resnet(x)
x = gated_resnet(x)
x = gated_resnet(x)
x = gated_resnet(x)

x = Dense(len(chars)+1, activation='softmax')(x)

其他代碼此處就不再貼了,建議直接參考源碼出處,或者訪問https://github.com/hu-qi/modelarts-couplet。此處我選擇 200 個 Epoch,訓練過程如下圖:

從圖中明顯可以看出評估函數輸出的下聯不斷地在調整。當訓練完成之后我們便煉的了簡單能使用的丹--AI 對對聯模型,緊接着測試一下:

上聯:天增歲月人增壽 
下聯:國滿春秋我成春
上聯:鼠去牛來聞虎嘯 
下聯:羊來馬去看龍吟
上聯:流光溢彩氣沖斗牛 
下聯:春色流輝風震春蟲

不錯不錯,還是挺工整通順的!

當然實踐中也並不是一帆風順,訓練過程中如果遇到續期提示,請務必要手動點擊,不然又得重啟 Notebook 。續期就對了,盡管我不太清除能續幾次,但續期就不會導致訓練中斷。

四、總結

此次實踐的數據集和 notebook 已上傳到 github :https://github.com/hu-qi/modelarts-couplet, 另外對聯數據也共享到 ModelArts AI Gallery:couplet-dataset:70萬對聯數據集,歡迎取閱!

 

點擊關注,第一時間了解華為雲新鮮技術~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM