NLP小項目--emojify(一)

起因

前段時間完成了吳恩達的深度學習第五專題序列模型,里面一些作業(yè)都很有意思,包括這個Emojify摆出,根據(jù)你輸入的話語判斷你話語的含義掖举,并且用一個表情來表示快骗,
并且把表情放在語句后,這樣就可以實現(xiàn)說話時自動添加最貼切的表情。

具體參考我的github方篮,那是一個keras版本的實現(xiàn)名秀,也是Coursera作業(yè)使用的框架,我稍稍改編了一下藕溅,
里面有些實現(xiàn)的效果以及模型的結(jié)構(gòu)匕得,這里就不多說了,代碼也很簡單巾表,容易理解汁掠。

本來這么簡單感覺沒必要寫個博客,但是正好用pytorch復現(xiàn)一遍集币,此間遇到不少坑考阱,所以我打算好好講解一番。
我將會從制作自己的數(shù)據(jù)集開始惠猿,把這個問題擴展羔砾,分成幾篇博文,按流程介紹我的實現(xiàn)歷程偶妖。

這里我不由不說姜凄,要看你的框架掌握的怎么樣,其實就是看你官方文檔看的怎么樣趾访,更重要的是态秧,你的官方源碼看的怎么樣,所以這幾篇博文我會嵌入一些官方源碼 和官方文檔的內(nèi)容扼鞋,詳細講解如何利用它們解決自己的問題申鱼,因為當你編程的時候你會發(fā)現(xiàn),遇到問題百度是沒什么用的云头,google也不是什么問題都有的捐友。 通過源碼,你也會發(fā)現(xiàn)各種教程里都不太可能說到的東西溃槐。成功運行官方教程里給出的mnist程序匣砖,并不是你就會了這個框架,甚至連入門都說不上昏滴!一定要通讀文檔和源碼:秭辍!

制作數(shù)據(jù)集

這第一篇博文我主要就想講解一下如何在pytorch框架中制作自己的數(shù)據(jù)集谣殊,這里不得不說拂共,源碼大法好。這里的制作數(shù)據(jù)集不是
收集數(shù)據(jù)并且做成對應(yīng)格式姻几,而是已經(jīng)有數(shù)據(jù)了宜狐,怎么裝載到dataset里势告,看完博文你就了解了。

emojify數(shù)據(jù)集構(gòu)造

首先介紹一下emojify的數(shù)據(jù)集是什么樣子的肌厨,其實我建議你去上面我給出的我的github上看一下培慌,上面的介紹很清楚。這里就簡單說一下柑爸,
這個數(shù)據(jù)集還是很簡單的吵护,每一個traindata就是一句話,string類型表鳍,標簽就是0-4五個整形的值馅而,代表五個表情(emoji)。testdata也一樣譬圣,
但是我把所有的testdata和traindata都合在一起了瓮恭,稍微增大訓練集,提升泛化效果厘熟,測試我們只需要手動輸入一些我們想說的話就好了屯蹦,
這個項目中測試集并不是很重要。

所以最后的訓練數(shù)據(jù)就是188個樣本绳姨,但是為了batchsize好選登澜,我刪了8個樣本,變成180個樣本飘庄,存在一個csv文件中脑蠕。csv文件的讀取相信不用我多說,
pandas和csv模塊都可以輕松讀取跪削。

直接加載數(shù)據(jù)

其實我們可以讀取數(shù)據(jù)谴仙,然后保存在列表里,然后用np.random.shuffle打亂一下碾盐,大不了再寫一個get_batch函數(shù)獲取批樣本晃跺,就像下面一樣:

    def get_batchs(X,Y,batchsize = 3,batchnum = 0):
        if (batchnum*batchsize+batchsize) >= X.shape[0]:
            bx = X[batchnum * batchsize:]
            by = Y[batchnum * batchsize:]
        else:
            bx = X[batchnum * batchsize:(batchnum * batchsize + batchsize)]
            by = Y[batchnum * batchsize:(batchnum * batchsize + batchsize)]
        return np.array(bx),np.array(by)

就可以在每個step時候調(diào)用一下,就可以輸入數(shù)據(jù)了毫玖,那么為什么還要制作數(shù)據(jù)集呢掀虎?
因為簡單的數(shù)據(jù)集自然沒有必要的,這樣處理足夠了孕豹,但是復雜的比較龐大的數(shù)據(jù)集呢?一點就是這樣寫是把所有的數(shù)據(jù)都加載進來十气,
因此需要大量的內(nèi)存励背,第二是要實現(xiàn)更加復雜的操作比較麻煩,又要添加更多的代碼砸西,比如多線程讀取數(shù)據(jù)等等叶眉。更重要的是址儒,數(shù)據(jù)集都不會制作,
如何說掌握了pytorch衅疙。

自定義數(shù)據(jù)集

回憶一下莲趣,你是怎么用pytorch實現(xiàn)mnist分類的,具體一點饱溢,如何加載mnist數(shù)據(jù)集的喧伞。你是直接用了torchvision.datasets.MNIST,而且
可以指定一些參數(shù)绩郎,比如是否從云端下載數(shù)據(jù)集潘鲫,對數(shù)據(jù)采用怎么樣的變換等等,然后調(diào)用 Data.DataLoader肋杖,可以讓數(shù)據(jù)集可迭代溉仑,
并且可以shffule,指定batchsize等等状植,然后訓練時就可以直接調(diào)用了浊竟,測試集也一樣處理,是不是很方便津畸。那么我們也可以這樣嗎振定?

答案是肯定的。如果是圖片數(shù)據(jù)集洼畅,你想做一個分類的話吩案,直接用datasets的ImageFolder函數(shù)就可以了,只需要注意文件和文件夾的格式
就行了帝簇。那么這里的emojify數(shù)據(jù)集呢徘郭?這里就要上源碼了,我們先看官方源碼的mnist是如何編寫的丧肴,這里完全是我自己摸索的残揉,然后發(fā)現(xiàn)
沒什么大問題,所以拿出來說一下芋浮。源碼在哪看呢抱环?github搜索vision和pytorch,分別是兩部分的源碼纸巷。

class MNIST(data.Dataset):
   urls = [
       'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz',
       'http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz',
       'http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz',
       'http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz',
   ]
   raw_folder = 'raw'
   processed_folder = 'processed'
   training_file = 'training.pt'
   test_file = 'test.pt'
   def __init__(self, root, train=True, transform=None, target_transform=None, download=False):
       self.root = os.path.expanduser(root)
       self.transform = transform
       self.target_transform = target_transform
       self.train = train  # training set or test set

       if download:
           self.download()
       if not self._check_exists():
           raise RuntimeError('Dataset not found.' +
                              ' You can use download=True to download it')
       if self.train:
           self.train_data, self.train_labels = torch.load(
               os.path.join(self.root, self.processed_folder, self.training_file))
       else:
           self.test_data, self.test_labels = torch.load(
               os.path.join(self.root, self.processed_folder, self.test_file))

   def __getitem__(self, index):
       img = Image.fromarray(img.numpy(), mode='L')

       if self.transform is not None:
           img = self.transform(img)

       if self.target_transform is not None:
           target = self.target_transform(target)

       return img, target

   def __len__(self):
       if self.train:
           return len(self.train_data)
       else:
           return len(self.test_data)

   def _check_exists(self):
       return os.path.exists(os.path.join(self.root, self.processed_folder, self.training_file)) and \
           os.path.exists(os.path.join(self.root, self.processed_folder, self.test_file))

   def download(self):
       pass

上面是主要代碼镇草,download被我刪了,這里也不需要瘤旨,接下來我們直接進行修改梯啤,怎么改呢,首先看init方法存哲,賦值部分
都不怎么需要改因宇,雖然本例中幾個都用不到七婴,download不需要,所以上面可以直接改成pass察滑,然后把下面的實現(xiàn)刪去打厘,
train肯定是True,因為沒有測試集贺辰,所以else的部分就pass户盯,if self.train:的部分就讀取我們的csv數(shù)據(jù)就好了,
這里string的數(shù)據(jù)要換成index魂爪,我一開始沒有先舷,直接加載數(shù)據(jù),然后出錯滓侍,查看源碼發(fā)現(xiàn)蒋川,因為數(shù)據(jù)會在源碼里幫你轉(zhuǎn)化成torch的Tensor,
而torch里沒有string的Tensor的撩笆,所以要變換成詞匯表里的索引捺球。_check_exists也不需要,刪去夕冲,len里面train的值改成我們的樣本數(shù)180氮兵,
測試集沒有,就是0嘍歹鱼。這樣就剩getitem了泣栈,顧名思義,就是獲取item的值弥姻,官方在這個函數(shù)下標注
tuple: (image, target) where target is index of the target class南片,也就是獲取index索引的數(shù)據(jù),這也很簡單庭敦。整理一下疼进,改成如下:

 class emojiDataset(Data.Dataset):
    def __init__(self, root, train=True, transform=None, target_transform=None, download=False):
        self.root = root
        self.transform = transform
        self.target_transform = target_transform
        self.train = train
        if download:
            pass
        if self.train:
            traindata,trainlabels = read_csv(os.path.join(self.root,'mytrain.csv'))
            self.train_data = sentences_to_indices(traindata, word_to_index, 10)
            self.train_labels = trainlabels
            # self.train_labels = convert_to_one_hot(trainlabels, C=5)
        else:
            pass
    def __getitem__(self, index):
        if self.train:
            data, target = self.train_data[index], self.train_labels[index]
        else:
            pass
        if self.transform is not None:
            pass
        if self.target_transform is not None:
            pass
        return data, target
    def __len__(self):
        if self.train:
            return 180
        else:
            return 0

可以看到,其實沒怎么修改秧廉,然后iter一下伞广,print(next(iter))測試,發(fā)現(xiàn)沒有任何問題疼电,就是這么簡單嚼锄。
注意到這個問題比較簡單,所以很多函數(shù)都是pass蔽豺,你當然可以自由編寫区丑,適應(yīng)你的項目要求。

實例化一下茫虽,用dataloader試一下刊苍,看看是不是也可以,結(jié)果自然是可以的濒析。

結(jié)論

這樣數(shù)據(jù)集的準備就ok了正什,剩下就是定義模型和訓練了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末号杏,一起剝皮案震驚了整個濱河市婴氮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盾致,老刑警劉巖主经,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異庭惜,居然都是意外死亡罩驻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門护赊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惠遏,“玉大人,你說我怎么就攤上這事骏啰〗谒保” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵判耕,是天一觀的道長透绩。 經(jīng)常有香客問我,道長壁熄,這世上最難降的妖魔是什么帚豪? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮请毛,結(jié)果婚禮上志鞍,老公的妹妹穿的比我還像新娘。我一直安慰自己方仿,他們只是感情好固棚,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仙蚜,像睡著了一般此洲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上委粉,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天呜师,我揣著相機與錄音,去河邊找鬼贾节。 笑死汁汗,一個胖子當著我的面吹牛衷畦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播知牌,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼祈争,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了角寸?” 一聲冷哼從身側(cè)響起菩混,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扁藕,沒想到半個月后沮峡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡亿柑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年邢疙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片望薄。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡秘症,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出式矫,到底是詐尸還是另有隱情乡摹,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布采转,位于F島的核電站聪廉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏故慈。R本人自食惡果不足惜板熊,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望察绷。 院中可真熱鬧干签,春花似錦、人聲如沸拆撼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闸度。三九已至竭贩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莺禁,已是汗流浹背留量。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人楼熄。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓忆绰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親可岂。 傳聞我的和親對象是個殘疾皇子较木,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,522評論 25 707
  • 當你挺著啤酒肚胡吃海塞致开,整晚坐在大排檔里吆五喝六、神吹胡哨的時候萎馅,當你對堅持健身運動的人不屑一顧双戳、嗤之以鼻的時候,...
    Ninfa女巫閱讀 715評論 0 6
  • 依諾言: 沈園傷糜芳, 不思量飒货, 自難忘。 春依舊峭竣, 人空守塘辅。 陸游再回沈園,初戀情人不在了皆撩,有多傷扣墩,是無法計量的...
    依諾king閱讀 197評論 0 1
  • 小時候的冬天,我們姐弟三人都是穿媽媽做的花棉鞋扛吞,既保暖又輕快呻惕,但小孩子都奢望那櫥窗里擺著的高腰紅色棉靴。 終...
    秋水伊人8244閱讀 126評論 0 0
  • 2013年9月13日滥比,王菲發(fā)布一條“這一世 夫妻緣盡至此 我還好 你也保重”的微博亚脆。隨后不到一個小時,李亞鵬也發(fā)了...
    寫譯人生閱讀 2,072評論 0 0