tensorflow用高級api實現文本分類初嘗試

之前用tensorflow的套路都是定義出x,y的placeholder,定義出y_predict,再定義出loss,開啟tf.Session(),初始化變數,調optimizer,開for循環來訓練。最近經tobias推薦,嘗試了下用estimator這種高級api來寫一個rnn的text classification.

代碼見:github.com/tensorflow/t

一些關於python語法的細節我沒有去深究,但是了解了tensorflow某些函數的作用。

首先從if __name__ == __main__的

tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)

進到main函數里,這個我覺得是這種寫法的定式,沒去管。

現在從上至下地來看main。

tf.logging.set_verbosity(tf.logging.INFO)

這句可以用來顯示訓練時候的信息,loss。

這句是用來導入數據的,但這個test_with_fake_data的具體含義還搞不懂。

dbpedia = tf.contrib.learn.datasets.load_dataset( dbpedia, test_with_fake_data=FLAGS.test_with_fake_data )

得到的dbpedia.train.data是一個shape為(560,2)的ndarray。

舉個例子,560中的某一條為[E. D. Abbott Ltd Abbott of Farnham E D Abbott Limited was a British coachbuilding business based in Farnham Surrey trading under that name from 1929. A major part of their output was under sub-contract to motor vehicle manufacturers. Their business closed in 1972.]

我觀察了下,發現前面的字元串都是個人名,後面的數據才是需要classify的。

所以有如下語句

x_train = pandas.Series(dbpedia.train.data[:, 1])

pandas.Series是一個類,我之前以為只是一個函數。現在發現大寫的都是類,比如說tf.Variable.

列印出來大概是這種形式

0 句子0

1 句子1

...

vocab_processor = tf.contrib.learn.preprocessing.VocabularyProcessor(MAX_DOCUMENT_LENGTH)x_transform_train = vocab_processor.fit_transform(x_train)x_transform_test = vocab_processor.transform(x_test)

上面這句是將句子中的詞轉換為數字編號(並不是one hot,是1,2,3,4這種)

model_fn = rnn_model

由上面這句來看看函數rnn_model

word_vectors = tf.contrib.layers.embed_sequence( features[WORDS_FEATURE], vocab_size=n_words, embed_dim=EMBEDDING_SIZE )

tf.contrib.layers.embed_sequnce能將以編號表示的詞轉換為embedding形式。

但關於它的具體實現形式我查了好多網上的資料,得到的最有用的答案也只是stackoverflow里的一個回答,並且也不是那麼準確..

stackoverflow.com/quest

但我能確定它肯定不是用預先訓練好的embedding集實現的。

word_list = tf.unstack(word_vectors, axis=1)

tf.unstack將目標維度分解,其他維度保留,形成一個list。

cell = tf.nn.rnn_cell.GRUCell(EMBEDDING_SIZE)

GRU為RNN的一種擴展,傳入的參數為隱藏層節點數。

這個rnn_model差不多等於用RNN將句子的每個詞編碼,再全連接+softmax輸出分類。

看完了rnn_model,再回到main。

train_input_fn = tf.estimator.inputs.numpy_input_fn( x={WORDS_FEATURE: x_train}, y=y_train, batch_size=len(x_train), num_epochs=None, shuffle=True) classifier.train(input_fn=train_input_fn,steps=1000)

這裡有三個重要的參數,num_epochs(遍歷訓練集的次數),batch_size(批訓練量大小),steps(迭代次數).

因為整個訓練過程可以由batach_size與任一個參數決定,所以當num_epochs=None,或steps=None,比較直觀。當兩個都不是None時,迭代次數不超過steps時,以num_epochs為準,超過時,就以steps為準。舉個例子,當num_epochs=4 batch_size=100 steps=100 train_size=1000 由num_epochs決定的迭代次數為4*1000/100=40<steps,所以實際只迭代40次,若改num_epochs=16,則由其決定的迭代次數為160,超過steps,所以只迭代最多100次。參考了博客blog.csdn.net/qq_222385

其他剩下沒提到的我覺得應該是用tensorflow的高級api編程的定式,比如說test_input_fn的num_epochs=1,shuffle=false等等。

總結:

1.對很多庫的語句用法,函數參數設置很不熟悉,個人覺得這點應當通過多敲代碼,遇到有疑惑的去用搜索引擎解決,通過直接閱讀大量文檔去記住各種細節的做法是划不來的

2.對基本的RNN模型如GRU, LSTM不熟悉,只停留在視頻講的概念與編程作業里的公式階段。


推薦閱讀:

show and tell 代碼閱讀筆記
《Dialogue Act Sequence Labeling using Hierarchical encoder with CRF》閱讀筆記
python學習之文章數據分析
嶺回歸-嶺回歸
NLP——自然語言處理(三)text2vec包

TAG:TensorFlow | 自然語言處理 |