tensorflow用高級api實現文本分類初嘗試
之前用tensorflow的套路都是定義出x,y的placeholder,定義出y_predict,再定義出loss,開啟tf.Session(),初始化變數,調optimizer,開for循環來訓練。最近經tobias推薦,嘗試了下用estimator這種高級api來寫一個rnn的text classification.
代碼見:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/learn/text_classification.py#L13
一些關於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里的一個回答,並且也不是那麼準確..
https://stackoverflow.com/questions/45373819/tensorflow-tf-contrib-layers-embed-sequence
但我能確定它肯定不是用預先訓練好的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次。參考了博客https://blog.csdn.net/qq_22238533/article/details/79005221
其他剩下沒提到的我覺得應該是用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 | 自然語言處理 |