1. 程式人生 > >基於tensorflow實現word2vec

基於tensorflow實現word2vec

使用NCE作為損失函式,SGD優化,skipGram模式
# -*- coding: utf-8 -*-
"""
Created on Sat Jul 22 17:35:12 2017

@author: bryan
"""

import collections
import math
import os
import random
import zipfile
import numpy as np
import urllib
import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE


url='http://mattmahoney.net/dc/'
def maybe_download(filename,expected_bytes):
    if not os.path.exists(filename):
        filename,_=urllib.request.urlretrieve(url+filename,filename)
    statinfo=os.stat(filename)
    if statinfo.st_size==expected_bytes:
        print('Found and verified', filename)
    else:
        print(statinfo.st_size)
        raise Exception('Failed to verify '+filename+' .Can you get to it with a browser?')
    return filename

filename=maybe_download('text8.zip',31344016)

def read_data(filename):
    with zipfile.ZipFile(filename) as f:
        data=tf.compat.as_str(f.read(f.namelist()[0])).split()
    return data

words=read_data(filename)
print('Data size',len(words))

vocabulary_size=50000

def build_dataset(words):
    count=[['UNK',-1]]
    count.extend(collections.Counter(words).most_common(vocabulary_size-1))
    dictionary=dict()
    for word,_ in count:
        dictionary[word]=len(dictionary)
    
    data=list()
    unk_count=0
    for word in words:
        if word in dictionary:
            index=dictionary[word]
        else:
            index=0
            unk_count+=1
        data.append(index)
    count[0][1]=unk_count
    reverse_dictionary=dict(zip(dictionary.values(),dictionary.keys()))
    return data,count,dictionary,reverse_dictionary

data,count,dictionary,reverse_dictionary=build_dataset(words)

del words
print('Most common words (+UNK)',count[:5])
print('Sample data ',data[:10],[reverse_dictionary[i] for i in data[:10]])

data_index=0

def generate_batch(batch_size,num_skips,skip_window):#num_skips 為對每個單詞生成多少個樣本, skpi_window為單詞最遠可以聯絡的距離
    global data_index
    assert batch_size%num_skips==0
    assert num_skips<=2*skip_window
    
    batch=np.ndarray(shape=(batch_size),dtype=np.int32)
    labels=np.ndarray(shape=(batch_size,1),dtype=np.int32)
    span=2*skip_window+1
    buffer = collections.deque(maxlen=span)
    
    for _ in range(span):
        buffer.append(data[data_index])
        data_index=(data_index+1)%len(data)
    
    for i in range(batch_size//num_skips):
        target=skip_window
        targets_to_avoid=[skip_window]
        for j in range(num_skips):
            while target in targets_to_avoid:
                target=random.randint(0,span-1)
            targets_to_avoid.append(target)
            batch[i*num_skips+j]=buffer[skip_window]
            labels[i*num_skips+j,0]=buffer[target]
        buffer.append(data[data_index])
        data_index=(data_index+1)%len(data)
    return batch,labels
    
batch,labels=generate_batch(batch_size=8,num_skips=2,skip_window=1)
for i in range(8):
    print(batch[i],reverse_dictionary[batch[i]],'->',labels[i,0],reverse_dictionary[labels[i,0]])
    
batch_size=128
embedding_size=128 #生成的向量維度
skip_window=1
num_skips=2

valid_size=16
valid_window=100
valid_examples=np.random.choice(valid_window,valid_size,replace=False)
num_sampled=64
    
gragh=tf.Graph()
with gragh.as_default():
    train_inputs=tf.placeholder(tf.int32,shape=[batch_size])
    train_labels=tf.placeholder(tf.int32,shape=[batch_size,1])
    valid_dataset=tf.constant(valid_examples,dtype=tf.int32)
    
    with tf.device('/cpu:0'):
        embeddings=tf.Variable(tf.random_uniform([vocabulary_size,embedding_size],-1.0,1.0))
        embed=tf.nn.embedding_lookup(embeddings,train_inputs)
        nce_weights=tf.Variable(tf.truncated_normal([vocabulary_size,embedding_size],stddev=1.0/math.sqrt(embedding_size)))
        nce_biases=tf.Variable(tf.zeros([vocabulary_size]))
    loss=tf.reduce_mean(tf.nn.nce_loss(weights=nce_weights,
                                       biases=nce_biases,
                                       labels=train_labels,
                                       inputs=embed,
                                       num_sampled=num_sampled,
                                       num_classes=vocabulary_size))
    
    optimizer=tf.train.GradientDescentOptimizer(1.0).minimize(loss)
    norm=tf.sqrt(tf.reduce_sum(tf.square(embeddings),1,keep_dims=True))
    normalized_embeddings=embeddings/norm
    valid_embeddings=tf.nn.embedding_lookup(normalized_embeddings,valid_dataset)
    similarity=tf.matmul(valid_embeddings,normalized_embeddings,transpose_b=True)
    
    init=tf.global_variables_initializer()
    
num_steps=100001
with tf.Session(graph=gragh) as session:
    init.run()
    print("Initialized")
    average_loss=0
    for step in range(num_steps):
        batch_inputs,batch_labels = generate_batch(batch_size,num_skips,skip_window)
        feed_dict={train_inputs:batch_inputs,train_labels:batch_labels}
        _,loss_val=session.run([optimizer,loss],feed_dict=feed_dict)
        average_loss+=loss_val
        
        if step% 2000==0:
            if step>0:
                average_loss/=2000
            print('Average loss at step',step,':',average_loss)
            average_loss=0
        
        if step % 10000==0:
            sim=similarity.eval()
            for i in range(valid_size):
                valid_word=reverse_dictionary[valid_examples[i]]
                top_k=8
                nearest=(-sim[i,:]).argsort()[1:top_k+1]
                log_str='Nearest to %s:' % valid_word
                for k in range(top_k):
                    close_word=reverse_dictionary[nearest[k]]
                    log_str='%s %s,' % (log_str,close_word)
                print(log_str)
    final_embeddings=normalized_embeddings.eval()
                

def plot_with_labels(low_dim_embs,labels,filename='tsne.png'):
    assert low_dim_embs.shape[0] >= len(labels),'More labels than embeddings'
    plt.figure(figsize=(18,18))
    for i , label in enumerate(labels):
        x,y=low_dim_embs[i,:]
        plt.scatter(x,y)
        plt.annotate(label,
                     xy=(x,y),
                     xytext=(5,2),
                     textcoords='offset points',
                     ha='right',
                     va='bottom')
    plt.savefig(filename)



tsne=TSNE(perplexity=30,n_components=2,init='pca',n_iter=5000)
plot_only=100
low_dim_embs=tsne.fit_transform(final_embeddings[:plot_only,:])
labels=[reverse_dictionary[i] for i in range(plot_only)]
plot_with_labels(low_dim_embs,labels,'F:\\learning\\tf\\tsne.png')

相關推薦

基於tensorflow實現word2vec

使用NCE作為損失函式,SGD優化,skipGram模式# -*- coding: utf-8 -*- """ Created on Sat Jul 22 17:35:12 2017 @author: bryan """ import collections impor

tensorflow實現Word2vec

while brush ber ear same split max ems red # coding: utf-8 ‘‘‘ Note: Step 3 is missing. That‘s why I left it. ‘‘‘ from __future__ impor

1.CNN圖片單標籤分類(基於TensorFlow實現基礎VGG16網路)

本文所使用的開源資料集(kaggle貓狗大戰): www.kaggle.com/c/dogs-vs-c… 國內百度網盤下載地址: pan.baidu.com/s/12ab32UNY… 利用本文程式碼訓練並生成的模型(對應專案中的model資料夾): pan.baidu.com/s/1tBkVQKoH

2.CNN圖片多標籤分類(基於TensorFlow實現驗證碼識別OCR)

上一篇實現了圖片CNN單標籤分類(貓狗圖片分類任務) 地址:juejin.im/post/5c0739… 預告:下一篇用LSTM+CTC實現不定長文字的OCR,本質上是一種不固定標籤個數的多標籤分類問題 本文所用到的10w驗證碼資料集百度網盤下載地址(也可使用下文程式碼自行生成): pan.baidu

Keras基於TensorFlow實現的簡單分類問題

神經網路是可以用來模擬分類問題。 首先先說一下什麼是分類問題,分類問題是用於將事物打上一個標籤,通常結果為離散值。例如判斷一個學生是好學生還是壞學生,其結果是離散的,即好學生、壞學生。而回歸問題是給出一個值去逼近正確值。但是分類通常是建立在迴歸之上,例如上面的

CNN字元級中文文字分類-基於TensorFlow實現

本章旨在使用TensorFlow API實現卷積神經網路文字分類。 如今,TensorFlow大版本已經升級到了1.3,對很多的網路層實現了更高層次的封裝和實現,甚至還整合瞭如Keras這樣優秀的一些高層次框架,使得其易用性大大提升

TensorFlow實現word2vec 詳細程式碼解釋

參考1:http://blog.csdn.net/mylove0414/article/details/69789203 參考2:《TensorFlow實戰》 參考3:http://www.jianshu.com/p/f682066f0586 程式碼配合參考3的圖形說明,可

基於Tensorflow實現多分類支援向量機

1、匯入必要的程式設計庫; import matplotlib.pyplot as plt import numpy as np import tensorflow as tf from sklearn import datasets sess = tf.Se

tensorflow實現Word2Vec解析

根據自己的理解寫的讀書筆記。 import collections import math import os import random import zipfile import urllib import numpy as np import tensorflow as tf #定義下載文字資料的

tensorflow實現Word2Vec(找到目標英文單詞的相近詞)

根據自己的理解寫的讀書筆記。 import collections import math import os import random import zipfile import urllib import numpy as np import tensorflow a

基於Tensorflow實現基本的線性迴歸(Linear regression)

線性迴歸(Linear_regression) 本文基於Tensorflow實現基本的線性迴歸 1.numpy匯入資料 train_X = numpy.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779

基於tensorflow實現影象風格的變換

      Leon A. Gatys, Alexander S. Ecker, 和 Matthias Bethge 等人的論文“A Neural Algorithm of Artistic S

Keras上基於TensorFlow實現簡單線性迴歸模型

神經網路可以用來模擬迴歸問題。 首先回歸問題是什麼,迴歸問題通常是用來預測一個值,如預測房價、未來的天氣情況等等,例如一個產品的實際價格為500元,通過迴歸分析預測值為499元,我們認為這是一個比較好的迴歸分析。一個比較常見的迴歸演算法是線性迴歸演算法(LR)

RNN-LSTM講解-基於tensorflow實現

cnn卷積神經網路在前面已經有所瞭解了,目前博主也使用它進行了一個影象分類問題,基於kaggle裡面的food-101進行的影象識別,識別率有點感人,基於資料集的關係,大致來說還可行。下面我就繼續學習rnn神經網路。rnn神經網路(遞迴/迴圈神經網路)模式如下: 我們在處理文字等問題的時候,我們的輸入會把上

BP神經網路基於Tensorflow實現(程式碼註釋詳細)

BP(back propagation)神經網路是1986年由Rumelhart和McClelland為首的科學家提出的概念,是一種按照誤差逆向傳播演算法訓練的多層前饋神經網路,是目前應用最廣泛的神經網路。 在一般的BP神經網路中,單個樣本有m個輸入和n個輸出,在輸入層

基於Tensorflow的CNN簡單實現

一、概要 基於Tensorflow 1.0+版本實現,利用mnist資料集訓練CNN,達到了99.6%的準確率。 二、CNN結構 1.兩個卷積層、兩個池化層、一個全連線層、一個Dropout層以及一個Softmax層。 2.原始資料為28*28的大小、單通道的圖片。 3.

RNN(二)——基於tensorflow的LSTM的實現

lstm的前向結構,不迭代 最基本的lstm結構。不涉及損失值和bp過程 import tensorflow as tf import numpy as np inputs = tf.placeholder(np.float32, shape=(32,40,5)) # 32 是 batch_size l

基於mtcnn/facenet/tensorflow實現人臉識別登入系統

git地址:github.com/chenlinzhon… 本文主要介紹了系統涉及的人臉檢測與識別的詳細方法,該系統基於python2.7.10/opencv2/tensorflow1.7.0環境,實現了從攝像頭讀取視訊,檢測人臉,識別人臉的功能 由於模型檔案過大,git無法上傳,整個專案放在百度雲盤,地址

基於TensorFlow影象分類實現

train.py 訓練集圖片檔名稱中存在型別即可。根據需分類型別修改# 訓練集生成和# 測試集生成程式碼塊中的讀取方式。 import os import numpy as np import tensorflow as tf from network import Network from

基於Tensorflow的Resnet程式實現(CIFAR10準確率為91.5%)

       在上一篇博文中我重寫了Tensorflow中的CNN的實現,對於CIFAR10的測試集的準確率為85%左右。在這個實現中,用到了2個卷積層和2個全連線層。具體的模型架構如下:        為了進一步提高準確率,我們可以採用一些更先進的模型架構,其中一種很