0518學習記錄(CNN文本分類)

遇到的問題:
python3.5以上似乎不支持直接pip tensorflow,所以先把whl下下來然後本地pip install了
https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/tensorflow-1.9.0-cp37-cp37m-win_amd64.whl
引入其他文件中的方法有下劃紅線,右鍵文件夾——mark directory as source root
一直遇到問題“ModuleNotFoundError: No module named ‘tensorflow’”,不知道怎麼解決,但是把整個project文件全放進去就能運行,不知道哪裏藏着依賴文件或者設置?

代碼說明:
四個文檔:訓練集,測試集,驗證集,單字詞典。
從run_cnn.py開始執行(以主文件爲開始文件,main)
config=TCNNconfig 調用配置文件
seq_length序列長度:詞長度,一句話有多少長度
kernel_size:卷積核尺寸,一次卷積的維度,即n-gram的n值

read_category:函數,讀入類別,調用native_content進行utf-8轉碼,用cat_to_id每一個類別建立一個類別和id的字典
read_vocab:函數讀取詞彙表,_.strip()去掉裏面的換行
word_to_id:爲每一個字創建id,建立一個字典
config.vocab_size:詞彙表長度
model=TextCNN(config):初始化一個CNN分類模型
option='train’調用訓練模式

train:訓練函數
配置tensorboard
tf.summary.scalar(“loss"和"accuracy”):保存準確率和損失信息
saver:保存模型
載入訓練集
process_file:將文件轉換爲id
read_file函數:打開文件,按行加載,並按\t分隔成label和content。label裏內容是“體育”等類別標籤。contents裏是新聞內容的每個字的 列表。
for i in range(len(contents)):遍歷內容
data_id.append([word_to_id[x] for x in contents[i] if x in word_to_id]):把contents裏的文字轉化爲ID
label_id.append([cat_to_id[labels[i]):把label裏的標籤文字轉化爲ID
使用keras提供的pad_sequences將文本pad爲固定長度:
sequence:所有樣本
lengths.append(len(x)):將每句話的長度存成一個數組
for s in sequences:再遍歷每句話
x=(np.ones((num_samples,maxlen)+sample_shape)value).astype(dtype):生成一個50000600的全是0的數組
truncating:pre_sequences裏”的一個屬性,預定義爲“pre
truncating=pre,則trunc=s[-maxlen:]:從最後取maxlen個元素
=post,嘖trunc=s[:maxlen]:從開頭取maxlen個元素
trunc=np.asarray(trunc,dtype=dtype):轉換爲array
padding=post/pre,x[idx,:len(trunc)]=trunc:對於每一行x(之前全是0),用相應行的前或後maxlen(600)個元素寫入
y_pad:將標籤編碼成onehot形式
x_val,y_val:驗證集,同樣方法處理
至此預處理完成:內容只取後(前)600個編碼,標籤編碼爲one-hot

創建session,寫入默認graph(session.graph)
訓練過程:
num_epochs:訓練次數
batch_train=batch_iter(x_train,y_train,config.batch_size):每次放入batch_size個句子進行訓練(這裏設置爲64)
x_batch:64600的數組,y_batch:6410的數組
feed_dict:用x_batch和y_batch創建字典
if total_batch % config.save_per_batch0:每多少輪將訓練結果寫入tensorboard scalar
if total_batch % config.print_per_batch
0:每多少輪輸出在訓練集和驗證集上的性能(損失和精確度和評價),如果比之前最好的好,則保存新模型。

sesson.run(model.optim,feed_dict=feed_dict):輸入feed_dict的數據開始運行。
model.optim:tf.name_scope(“optimize”)裏的優化器,self.optim=tf.train.AdamOptimizer("learning_rate=self.config.learning_rate).minimize(self.loss)
讓訓練的損失函數最小,以誤差最小的方式更新整個網絡的模型參數

內存爆炸,把參數全部改小

    embedding_dim = 64  # 詞向量維度
    seq_length = 600  # 序列長度
    num_classes = 10  # 類別數
    num_filters = 256  # 卷積核數目
    kernel_size = 5  # 卷積核尺寸
    vocab_size = 5000  # 詞彙表達小

    embedding_dim = 32  # 詞向量維度
    seq_length = 300  # 序列長度
    num_classes = 10  # 類別數
    num_filters = 64  # 卷積核數目
    kernel_size = 3  # 卷積核尺寸
    vocab_size = 5000  # 詞彙表達小

cnn_mode.pyl
模型初始化:main函數裏model=TextCNN(config)
TexTCNN方法:把config參數傳進去,三個待輸入的數據:x/y/keep_prob
self.input_x=tf.placeholder(tf.int32,[None,self.config.seq_length],name=‘input_x’)
None:batch_size
self.config.seq_length:序列長度(600)
self.config.num_classes:標籤數(10)
keep_prob:dropout

cnn函數:
device:
vocab_size:字的個數(5000)
embedding_dim:詞向量維度(64)
get_variable:創建一個5000*64的總表
通過隨機初始化的方法,將每一個字變成一個64維的向量
name_scope:
cnn卷積層,由於詞向量在橫向是不能移動的(卷積核長度=詞向量長度),只能縱向卷積,故是一維卷積。256個卷積核,卷積核大小爲5,得到一個256維的列向量,池化(max pooling)後得到一個最大的值,共256個值
進行全連接
score:全連接層,y=w(z o r)+b乘以權重加上偏置值後變成128維
再一次進行全連接logits,輸入128,輸出10,輸入softmax進行預測,每一個類別的概率是多少,取一個概率最大的類別
optimize:交叉熵和損失函數,
優化器:self.optim=tf.train.AdamOptimizer(learning_rate=self.config.learning_rate).minimize(self.loss):設定學習率爲損失最小
accuracy:計算準確率和均值,先將預測值與輸入的y值進行對比獲得True False,然後通過self.acc轉化爲0和1,之後計算均值。

test函數
讀取測試集,開啓一個session
saver.restore讀取模型
batch_size設置爲128,做成一個feed_dict餵給模型,session.run(model.y_pred_cls)輸出一個類別的最大值賦值給y_pred_cls
打印混淆矩陣和評估值

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