본문 바로가기

공부

Deep Learning Cookbook을 따라해보자

본 포스트는 (주)느린생각으로부터 후원을 받아 작성한 글입니다. 다만 책만 받았을 뿐, 실제 저의 삽질일 들어감은 변하지 않음을 알립니다.


 판매처 : http://www.yes24.com/24/goods/68385763?scode=032&OzSrank=1




 본 책에서의 예제를 따라하기 위해서 아나콘다, 쥬피터 노트북을 사용할 수도 있다. 하지만 그러면 따라하는 것 이상의 의미를 지니지 못한다고 생각한다. 나는 Visual Studio에서 개발환경을 세팅(tensorflow-gpu && anaconda3)하여 따라해 보았다. 만약 나와 같은 길을 따르게 된다면, 따라하는 도중 생긴 수많은 경고와 에러들을 해결하면서 자연스럽게 코드도 이해가 되지 않을까 조심스럽게 생각을 해 본다. 

 지금부터는 위 링크대로 개발환경을 구성했다는 가정 하에 실제로 예제 따라하기 시작해 보겠다.


물론, 나도 GIT을 쓰긴 하지만(써야 하지만...) 사실, 쥬피터 노트북을 사용하지 않는다고 가정하면 clone을 할 필요가 없다. 나는 저자의 GitHub에서 직접 복붙으로 소스를 따와서 오류들을 잡으며 따라해 보았다.


03.1 Using pre trained word embeddings


 설치해 주어야 할 패키지들 


-     keras(어차피 케라스도 tensorflow를 기반으로 하긴 한다.)

-     gensim(3.6.0버전)

-     numpy

-     matplotlib

-     IPython

 

  Binary data를 미리 다운받는다.(1.5G정도로 다운받는데 상당한 시간이 걸림.)


링크 : https://deeplearning4jblob.blob.core.windows.net/resources/wordvectors/%s.gz




그럼 첫 번째 예제부터 살펴본다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import os
import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')
from keras.utils import get_file
from gensim import models
import subprocess
import numpy as np
import matplotlib.pyplot as plt
from IPython.core.pylabtools import figsize
figsize(1010)
 
from sklearn.manifold import TSNE
import json
from collections import Counter
from itertools import chain
 
os.environ["CUDA_VISIBLE_DEVICES"]= ""
 
#model = models.KeyedVectors.load_word2vec_format(unzipped) #, binary=True
model = models.KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
cs


결과


1
2
3
4
5
6
7
8
9
10
('cappuccino', 0.6888186931610107)
('mocha', 0.6686209440231323)
('coffee', 0.6616827249526978)
('latte', 0.6536753177642822)
('caramel_macchiato', 0.6491268277168274)
('ristretto', 0.648554801940918)
('espressos', 0.6438628435134888)
('macchiato', 0.6428250074386597)
('chai_latte', 0.6308028697967529)
('espresso_cappuccino', 0.6280542612075806)
cs



 두 번째 예제 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def A_is_to_B_as_C_is_to(a, b, c, topn=1):
    a, b, c = map(lambda x:x if type(x) == list else [x], (a, b, c))
    res = model.most_similar(positive=+ c, negative=a, topn=topn)
    if len(res):
        if topn == 1:
            return res[0][0]
        return [x[0for x in res]
    return None
 
print(A_is_to_B_as_C_is_to('man''woman''king'))
 
for country in 'Italy''France''India''China':
    print('%s is the capital of %s' % 
          (A_is_to_B_as_C_is_to('Germany''Berlin', country), country))
 
for company in 'Google''IBM''Boeing''Microsoft''Samsung':
    products = A_is_to_B_as_C_is_to(
        ['Starbucks''Apple'], 
        ['Starbucks_coffee''iPhone'], 
        company, topn=3)
    print('%s -> %s' % 
          (company, ', '.join(products)))
 
cs

 결과


1
2
3
4
5
6
7
8
9
10
queen
Rome is the capital of Italy
Paris is the capital of France
Delhi is the capital of India
Beijing is the capital of China
Google -> personalized_homepage, app, Gmail
IBM -> DB2, WebSphere_Portal, Tamino_XML_Server
Boeing -> Dreamliner, airframe, aircraft
Microsoft -> Windows_Mobile, SyncMate, Windows
Samsung -> MM_A###, handset, Samsung_SCH_B###
cs


 마지막 예제 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
beverages = ['espresso''beer''vodka''wine''cola''tea']
countries = ['Italy''Germany''Russia''France''USA''India']
sports = ['soccer''handball''hockey''cycling''basketball''cricket']
 
items = beverages + countries + sports
len(items)
 
item_vectors = [(item, model[item]) 
                    for item in items
                    if item in model]
len(item_vectors)
 
vectors = np.asarray([x[1for x in item_vectors])
lengths = np.linalg.norm(vectors, axis=1)
norm_vectors = (vectors.T / lengths).T
 
tsne = TSNE(n_components=2, perplexity=10, verbose=2).fit_transform(norm_vectors)
 
x=tsne[:,0]
y=tsne[:,1]
 
fig, ax = plt.subplots()
ax.scatter(x, y)
 
for item, x1, y1 in zip(item_vectors, x, y):
    ax.annotate(item[0], (x1, y1), size=14)
 
plt.show()
cs


 결과