1.IMDB數(shù)據(jù)集:
本次使用的IMDB數(shù)據(jù)集包含來自IMDB的50000條嚴(yán)重兩級分化的評論。
數(shù)據(jù)集被分為用于訓(xùn)練的25000條評論和用于測試的25000條評論,其中訓(xùn)練集和測試集都包含50%的正面評論和50%的負(fù)面評論。
與MNIST數(shù)據(jù)集一樣,IMDB數(shù)據(jù)集也內(nèi)置到了Keras庫中,并且已經(jīng)經(jīng)過了預(yù)處理,評論(單詞序列)已經(jīng)被轉(zhuǎn)換為整數(shù)序列,其中每個整數(shù)代表字典中的某個單詞。
2.分步驟實(shí)現(xiàn):
- 1.加載IMDB數(shù)據(jù)集

- 2.將評論解碼為英文單詞


- 3.數(shù)據(jù)預(yù)處理

- 4.構(gòu)建網(wǎng)絡(luò)

- 5.訓(xùn)練模型

- 6.可視化監(jiān)控參數(shù)


- 7.重新訓(xùn)練模型,并在測試數(shù)據(jù)上評估模型效果

3.全流程代碼:
import numpy as np
from keras.datasets import imdb
from keras import models
from keras import layers
# 參數(shù)num_words=10000表示僅保留訓(xùn)練數(shù)據(jù)中前10000個最常出現(xiàn)的單詞,其他低頻單詞將被舍棄,這樣得到的向量數(shù)據(jù)就不會太大,便于后續(xù)處理
(train_data , train_labels) , (test_data , test_labels) = imdb.load_data(num_words=10000)
# 因?yàn)椴荒軐⒄麛?shù)序列直接輸入神經(jīng)網(wǎng)絡(luò),因此需要先對數(shù)據(jù)進(jìn)行預(yù)處理,將列表轉(zhuǎn)換為張量。
# 這里對列表進(jìn)行one-hot編碼,將其轉(zhuǎn)換為0和1組成的向量。
def vectorize_sequences(sequences,dimension=10000):
results = np.zeros((len(sequences),dimension)) # 創(chuàng)建一個形狀為(len(sequences),dimension)的全零矩陣
for i , sequence in enumerate(sequences):
results[i ,sequence] = 1 # 將results[i]的指定索引設(shè)為1
return results
# 將訓(xùn)練和測試數(shù)據(jù)向量化
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
# 將標(biāo)簽數(shù)據(jù)向量化 就是將list轉(zhuǎn)換為array數(shù)組
y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')
# 構(gòu)建模型
model = models.Sequential()
model.add(layers.Dense(16,activation='relu',input_shape=(10000,)))
model.add(layers.Dense(16,activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))
# 編譯模型
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 訓(xùn)練模型
history = model.fit(x_train,y_train,epochs=20,batch_size=512)
# 評估模型
results = model.evaluate(x_test,y_test)
print(results)
# 使用訓(xùn)練好的模型在新數(shù)據(jù)上生成預(yù)測結(jié)果
# print(model.predict(x_test))
Reference:
《Deep Learning with Python》