Tensorflow實現LSTM文字分類

2021-09-13 18:18:54 字數 3595 閱讀 4900

最近需要寫乙個神經網路模型來做分類。

作為此前沒有實戰過深度學習,只寫過svm之類的,學習過一些理論知識的新手,為了快速上手,第一想法就是找乙個簡單的demo跑通,對整個流程和結構有乙個初步體驗。於是在網上找了乙個tensorflow實戰系列:手把手教你使用lstm進行文字分類

但是教程存在乙個問題,是沒有把資料集分成訓練和**兩個部分,導致學習過程中學習資料和**資料產生混淆,讓我有些迷茫,然後通過學習單個函式和嘗試,跑通了**。新增內容:

遺留問題:之前寫機器學習的時候習慣使用交叉驗證(cross validation),在這個**中沒有看到有驗證部分,後續會開始寫需要寫的**,並看一些比這個稍微再複雜一些的**,進一步了解深度學習程式設計。

# -*- coding: utf-8 -*-

import tensorflow as tf

from tensorflow.contrib import learn

import numpy as np

from tensorflow.python.ops.rnn import static_rnn

from tensorflow.python.ops.rnn_cell_impl import basiclstmcell

# 資料

positive_texts =

["我 今天 很 開心"

,"我 很 高興"

,"他 很 高興"

,"他 很 開心"

]negative_texts =

["我 不 高興"

,"我 不 開心"

,"他 很 不 高興"

,"他 很 生氣"

]label_name_dict =

pre_texts =

["誰 今天 不 開心"

,"開心 嗎"

,"在 嗎"

]# 配置資訊

embedding_size =

50num_classes =

2# 將文字和標籤向量化

all_texts = positive_texts + negative_texts

labels =[0

]*len(positive_texts)+[

1]*len

(negative_texts)

max_document_length =

4vocab_processor = learn.preprocessing.vocabularyprocessor(max_document_length)

datas = np.array(

list

(vocab_processor.fit_transform(all_texts)))

# 按詞建立字典

pre = np.array(

list

(vocab_processor.transform(pre_texts)))

vocab_size =

len(vocab_processor.vocabulary_)

# 字典長度

# 容器

datas_placeholder = tf.placeholder(tf.int32,

[none

, max_document_length]

)#自適應行數,列數為max_document_length

labels_placeholder = tf.placeholder(tf.int32,

[none])

# 構建隨機的詞向量矩陣

# tf.get_variable(name, shape, initializer): name變數的名稱,shape變數的維度,initializer變數初始化的方式

embeddings = tf.get_variable(

"embeddings"

,[vocab_size, embedding_size]

, initializer=tf.truncated_normal_initializer)

embedded = tf.nn.embedding_lookup(embeddings, datas_placeholder)

# 將資料處理成lstm的輸入格式(時序)

rnn_input = tf.unstack(embedded, max_document_length, axis=1)

# 定義lstm

lstm_cell = basiclstmcell(

20, forget_bias=

1.0)

rnn_outputs, rnn_states = static_rnn(lstm_cell, rnn_input, dtype=tf.float32)

#predict

logits = tf.layers.dense(rnn_outputs[-1

], num_classes)

predicted_labels = tf.argmax(logits, axis=1)

losses = tf.nn.softmax_cross_entropy_with_logits(

labels=tf.one_hot(labels_placeholder, num_classes)

, logits = logits

)mean_loss = tf.reduce_mean(losses)

optimizer = tf.train.adamoptimizer(learning_rate=1e-

2).minimize(mean_loss)

with tf.session(

)as sess:

sess.run(tf.global_variables_initializer())

feed_dict =

print

("begin training"

)# 訓練

for step in

range

(100):

_, mean_loss_val = sess.run(

[optimizer, mean_loss]

, feed_dict=feed_dict)

if step%

10==0:

print

("step = {}\t mean loss ={}"

.format

(step, mean_loss_val)

)print

("predict"

)# **

predicted_labels_val = sess.run(predicted_labels, feed_dict=

)for i, text in

enumerate

(pre_texts)

: label = predicted_labels_val[i]

label_name = label_name_dict[label]

print

("{} => {}"

.format

(text, label_name)

)

執行結果

反卷積實現 tensorflow 實現

deconv解卷積,實際是叫做conv transpose,conv transpose實際是卷積的乙個逆向過程,tf中,編寫conv transpose 的時候,心中想著乙個正向的卷積過程會很有幫助。想象一下我們有乙個正向卷積 input shape 1,5,5,3 kernel shape 2,...

Tensorflow實現嶺回歸

嶺回歸可以看作是線性回歸的一種增強版,實現的時候無非就是加入乙個二範數正則化項,但是應當注意,這裡只對於權重進行懲罰,偏置項是不加入正則化的,具體理論可以參見相關的 和blog,在此不贅述。這裡還是使用tf實現了嶺回歸演算法,並實際應用在了乙個真實資料集而非人工資料集上,資料及規模相比於之前的資料也...

Tensorflow實現邏輯回歸

import tensorflow as tf 匯入mnist資料集 from tensorflow.examples.tutorials.mnist import input data mnist input data.read data sets temp data one hot true 定...