tensorflow實現word2vec報錯&解決集

先是從書上學習,然後利用隨書代碼實現word2vec,代碼在此:https://github.com/PacktPublishing/Natural-Language-Processing-with-TensorFlow/blob/master/ch3/ch3_word2vec.ipynb

因爲想做領域詞的識別,故沒有用已有的英文數據試驗,用的自己找的專業領域的小段語料做實驗,先用jieba分詞,然後開始Word2vec,這篇就寫寫報的錯以及解決,有時間再詳解代碼。

1、在Generating Batches of Data for Skip-Gram階段,報錯:

  print('    batch:', [reverse_dictionary[bi] for bi in batch])
KeyError: 326960996

原因是:batch一開始是通過np.ndarray隨機初始化的任意數值數組,當2倍window_size的大小沒有被batch_size整除時,batch裏剩下的值(如上面報錯的326960996)作爲reverse_dictionary的索引必然報錯。舉個例子如下,一切瞭然:

# data=[44,45,46,47,48,49,0,0,0,5,0,0,0,15,16.......]
# 示例:batchsize=16, windowsize=1,buffer隊列長度=3,numsamples=2的時候
# batch=[45,45,46,46,47,47,48,48,49,49,0,0,0,0,0,0]
# labels=[44,46,45,47,46,48,47,49,48,0,49,0,0,0,0,5]
# 示例:batchsize=16, windowsize=2,buffer隊列長度=5,numsamples=4的時候
# batch=[46,46,46,46,47,47,47,47,48,48,48,48,49,49,49,49]
# labels=[44,45,47,48,45,46,48,49,46,47,49,0,47,48,0,0]
# 示例:batchsize=16, windowsize=3,buffer隊列長度=7,numsamples=6的時候
# batch=[47,47,47,47,47,47,48,48,48,48,48,48,隨機數四個]
# labels=[44,45,46,47,48,49,45,46,47,49,0,0,隨機數四個]
# 所以,batchsize不能整除 2*windowsize(numsamples)的時候,print('    batch:', [reverse_dictionary[bi] for bi in batch])會報錯,同print labels

解決:設置window_size和batch_size值時,注意batch_size要可以整除2*window_size(num_samples)。爲此我加了assert batch_size % num_samples == 0

2、在Running the Skip-Gram Algorithm階段,執行sim = similarity.eval()時報錯:

InvalidArgumentError (see above for traceback): indices[16] = 1013 is not in [0, 100)
     [[Node: embedding_lookup_1 = GatherV2[Taxis=DT_INT32, Tindices=DT_INT32, Tparams=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](truediv, Const, embedding_lookup_1/axis)]]

原因是:在構建valid_examples時,因爲valid_examples = np.append(valid_examples,random.sample(range(1000, 1000+valid_window), valid_size),axis=0),官方的說明是不僅需要考慮詞頻較高的,也需要考慮少見的詞(因此+了1000),所以valid_samples大概長成這樣:[13 10 27 29....1008 1025 1016 1007 ...1014],similarity的計算中(比較複雜,不贅述)又涉及到了vocabulary_size,當初我設置的這個值是100,後來在網上查了一下結合報錯的內容覺得是這個值設小了的原因。

解決:把這個值設大(官方代碼是50000。。好吧),至少設置成大於這個數:1000+valid_window。1000是官方少見詞的閾值,自己也可以修改一下(根據語料庫大小調整吧),比如我改成100,那麼vocabulary_size設成100+valid_window就行

備註一下:計算詞向量間相似度時,如果不加.eval()的話,在執行後續代碼 nearest = (-sim[i, :]).argsort()[1:top_k + 1] 時會報錯:AttributeError: 'Tensor' object has no attribute 'argsort'   這是因爲similarity是tensor對象,沒有argsort屬性,.eval()之後變成了ndarray對象,這樣就可以通過argsort來找到相似度最近的詞向量了。

3、在Running the Skip-Gram Algorithm階段,執行close_word = reverse_dictionary[nearest[k]]時報錯:

   close_word = reverse_dictionary[nearest[k]]
KeyError: 892

原因是:舉例:通過nearest = (-sim[i, :]).argsort()[1:top_k + 1],計算的nearest數組是[71 892 125 132 759],而len(reverse_dictionary)才180,當然報錯啦!

解決:因爲sim的shape是(len(valid_examples),vocabulary_size),因此將vocabulary_size控制在len(reverse_dictionary)左右就差不多,根據實驗調參數吧,超參數就是要不斷調的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章