from keras.datasets import imdb
(train_data,train_labels),(test_data,test_labels) = imdb.load_data(num_words = 10000)
num_words=10000意思是只去頻率最高的10000個詞,這樣可以減少工作量,剔除不常用的詞。
import numpy as np
def vertorized_sequences(sequences,dimensions = 10000):
result = np.zeros((len(sequences),dimensions))
for i,sequence in enumerate(sequences):
result[i,sequence] = 1.
return result
x_train = vertorized_sequences(train_data)
x_test = vertorized_sequences(test_data)
將資料編為one-hot編碼,one-hot編碼比較適合用在分類問題中。
keras有內建的直接轉換成one-hot編碼的方法:
from keras.utils.np_utils import to_categorical
one_hot_train_labels = to_categorical(train_labels)
one_hot_test_labels = to_categorical(test_labels)
因為y標籤是二分類問題,所以只有0或1兩種類別,如果是多分類問題,y標籤也需要進行one-hot編碼。
from keras import models
from keras import layers
model = models.sequential()
model.add(layers.dense(32,activation = 'relu',input_shape = (10000,)))#input_dim = 10000也可以
model.add(layers.dense(32,activation = 'relu'))
model.add(layers.dense(32,activation = 'relu'))
model.add(layers.dense(1,activation = 'sigmoid'))
sequential是序貫模型,是最基礎的模型,是多個網路層的線性堆疊,也就是「一條路走到黑」。
如果應用到多輸入多輸出的模型或者共享層等,需要使用函式式模型。
這裡使用到了4層神經網路,都是使用的dense層,dense是全連線層,也就是說該層的每乙個神經網路單元都和下一層的每個神經網路單元相連線。
前三層神經網路啟用函式都使用relu,啟用函式就是將該層的輸出經過啟用函式轉換以後,作為下一層的輸入,這樣能避免多層網路都是線性模型。
最後一層網路啟用函式是sigmoid,是因為要輸出的是乙個概率值,這個概率值接近0則劃分為0類別,接近1則劃分為1類別。
model.compile(optimizer = 'rmsprop',loss = 'binary_crossentropy',metrics = ['accuracy'])
模型優化器,optimizer是優化函式,使用rmsprop即可,這是一種梯度下降優化函式,關於keras優化函式以後再詳細記錄。
loss是損失函式,可以自定義,也可以使用內建函式。
metrics是評判標準,也可以認為是評價指標或者效能評估函式,可以自定義。
x_val = x_train[:10000]
partial_x_train = x_train[10000:]
y_val = y_train[:10000]
partial_y_train = y_train[10000:]
擬合之前,
將資料切分成兩部分,用於選擇模型時的驗證。
history = model.fit(partial_x_train,partial_y_train,epochs = 20,batch_size = 512,validation_data=(x_val,y_val))
history是乙個history物件,包含accuracy,loss以及驗證集的accuracy和loss,可以根據這些指標的值選擇第二代的次數。
epochs就是迭代的次數,迭代越多次,訓練集上的正確率會越高,但是也會過擬合。
batch_size是每一批的資料個數,在這裡就是每批512個資料。這個值越小,耗費的計算能力越多,因為權值的更新過於頻繁。但是太大,有缺少隨機性,容易陷入區域性最優。
我們可以根據這兩張圖象選擇合適的迭代次數來訓練我們最終的模型。
最後,多分類問題與二分類問題類似,區別在於
1.最後一層網路需要使用softmax啟用函式,這樣才能輸出多分類的概率分布。
2.損失函式需要使用categorical_crossentropy或者sparse_categorical_crossentropy,兩者的區別在於後者需要時整型資料。
3.注意最後一層的輸出單元要超過所分類別,不然結果不準確。
Keras入門級實戰 MNIST手寫體識別
手寫體識別 這裡要解決的問題是,將手寫數字的灰度影象 28 畫素 28 畫素 劃分到 10 個類別 中 0 9 這個資料集包含 60 000 張訓練影象和 10 000 張測試圖 像,由美國國家標準與技術研究院 national institute of standards and technolo...
入門級演算法
今天我想記錄的是一些關於入門級別的演算法。將乙個字串s對映為乙個整數,使得該整數可以唯一的代表字串s。先假設字串均由大寫字母a z構成,不妨設a z為0 25,即將26個大寫字母對應到了二十六進製制中。按照將二十六進製制轉換為十進位制的思路,即可實現將字串對映為整數的需求。題目 給出n個字串 恰好由...
PKI入門級介紹
隨著電子商務的迅速發展,資訊保安已成為焦點問題之一,尤其是網上支付和網路銀行對資訊保安的要求顯得更為突出。為了能在網際網路上開展安全的電子商務活動,公開金鑰基礎設施 pki,public key infrastructure 逐步在國內外得到廣泛應用。我們是否真的需要 pki pki 究竟有什麼用?...