keras-二分類、多分類

旨在使用keras構(gòu)建出二分類和多分類模型,給出相關(guān)代碼。

機(jī)器學(xué)習(xí)問題中,二分類和多分類問題是最為常見,下面使用keras在imdb和newswires數(shù)據(jù)上進(jìn)行相應(yīng)的實(shí)驗(yàn)。

[code: https://github.com/zylhub/More_Python/blob/master/keras_TOT/simple-network-imdb.py ]

imdb 二分類

  1. 文本獲取
  2. 文本預(yù)處理
  3. 定義模型/神經(jīng)網(wǎng)絡(luò)
  4. 定義評價(jià)指標(biāo)和優(yōu)化方法
  5. 劃分?jǐn)?shù)據(jù)集,進(jìn)行訓(xùn)練
  6. 測試集對模型進(jìn)行測試
# coding=utf-8
# @Time   : 17-12-22 下午11:01
# @Author : knight
# @File   : simple-network-imdb.py

from keras import layers
from keras import models
from keras.datasets import imdb
import numpy as np

# 1. 加載數(shù)據(jù)
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

# 2. 定義模型
model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

######################
# input_tensor = layers.Input(shape=(784,))
# x = layers.Dense(32, activation='relu')(input_tensor)
# output_tensor = layers.Dense(10, activation='softmax')(x)
# model = models.Model(input=input_tensor, output=output_tensor)

# 3.1  文本數(shù)據(jù)預(yù)處理
word_index = imdb.get_word_index()  # 獲取詞索引  id to word
reverse_word_index = dict((value, key) for key, value in word_index.items())  # word to id
decoded_review = ' '.join([reverse_word_index.get(i-3, '?') for i in train_data[0]])

# 3.2 特征向量化
def vectorize_sequences(sequences, dim=10000):
    """
    詞袋模型,獲取詞向量
    :param sequences: [[sentence1], [sentence2], [...]]
    :param dim: 詞袋大小,詞特征維度
    :return:
    """
    results = np.zeros((len(sequences), dim))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1.0
    return results

x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)

y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')

from keras import metrics, losses
model.compile(optimizer='rmsprop',
              loss=losses.binary_crossentropy,
              metrics=[metrics.binary_accuracy])  # metrics 傳入list,可以使用多種評價(jià)方式

# 劃分驗(yàn)證集
x_val = x_train[:10000]
partial_x_train = x_train[10000:]

y_val = y_train[:10000]
partial_y_train = y_train[10000:]

# 4. 訓(xùn)練模型
history = model.fit(partial_x_train, partial_y_train,
                      epochs=20,
                      batch_size=512,
                      validation_data=(x_val, y_val))  # 驗(yàn)證集

# history 獲取訓(xùn)練過程的acc loss val_acc val_loss


history_dict = history.history
print(history_dict.keys())

# 5. Plotting the training and validation loss

import matplotlib.pyplot as plt

# 畫出訓(xùn)練集和驗(yàn)證集的損失和精度變化,分析模型狀態(tài)

acc = history.history['binary_accuracy']  # 訓(xùn)練集acc
val_acc = history.history['val_binary_accuracy']  # 驗(yàn)證集 acc
loss = history.history['loss']  # 訓(xùn)練損失
val_loss = history.history['val_loss']  # 驗(yàn)證損失

epochs = range(1, len(acc)+1)  # 迭代次數(shù)

plt.plot(epochs, loss, 'bo', label='Training loss')  # bo for blue dot 藍(lán)色點(diǎn)
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.show()

plt.clf()  # clar figure


plt.plot(epochs, acc, 'bo', label='Training acc')  # bo for blue dot 藍(lán)色點(diǎn)
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.show()
# ----------------------------------------使用model 定義網(wǎng)絡(luò)
input_tensor = layers.Input(shape=(10000,))
x = layers.Dense(32, activation='relu')(input_tensor)
x = layers.Dense(16, activation='relu')(x)
x = layers.Dense(16, activation='relu')(x)
output_tensor = layers.Dense(1, activation='sigmoid')(x)
network = models.Model(inputs=input_tensor, outputs=output_tensor)

network.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])
network.fit(x_train, y_train, epochs=4, batch_size=512)

print("test data evaluate, epochs=20", model.evaluate(x_test, y_test))
print("test data evaluate, epochs=4 ", network.evaluate(x_test, y_test))
epochs=20_acc.png
epochs=20_loss.png

根據(jù)訓(xùn)練集和驗(yàn)證集的loss和acc,可以判斷出模型過擬合了,此時(shí)應(yīng)該嘗試早停止,比如在Epochs=4的時(shí)候(迭代次數(shù)到4之后,訓(xùn)練集的loss繼續(xù)降低,驗(yàn)證集loss增加了,同時(shí)驗(yàn)證集的acc開始下降,模型學(xué)習(xí)的目的是對未來的數(shù)據(jù)有較好的泛化能力,因此選擇驗(yàn)證集較好的時(shí)候作為可用的模型,會(huì)得到較好的結(jié)果 )。


newswires 多標(biāo)簽多分類

構(gòu)建一個(gè)基本的神經(jīng)網(wǎng)絡(luò)來解決文本分類問題,先給出網(wǎng)絡(luò)結(jié)構(gòu)

Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 64)                640064    
_________________________________________________________________
dense_2 (Dense)              (None, 64)                4160      
_________________________________________________________________
dense_3 (Dense)              (None, 46)                2990      
=================================================================
Total params: 647,214
Trainable params: 647,214
Non-trainable params: 0
_________________________________________________________________
# coding=utf-8
# ---------------------------
# @Time   : 17-12-23 下午10:05
# @Author : knight
# @File   : simple-network-newswires.py       
# ---------------------------
from __future__ import absolute_import

from keras.datasets import reuters
from keras_TOT.utils_text import vectorize_sequences, to_one_hot

(train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words=10000)

# 8,982 training examples and 2,246 test examples:
print('train len :', len(train_data))
print('test len: ', len(test_data))

word_index = reuters.get_word_index()  # 獲取詞袋
revserse_word_index = dict((value, key) for key, value in word_index.items())
decoded_newswire = ' '.join(revserse_word_index.get(i-3, '?') for i in train_data[0])

print('decoded_newswire', decoded_newswire)

x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)

###------------------------------------###
one_hot_train_labels = to_one_hot(train_labels)
one_hot_test_labels = to_one_hot(test_labels)

# 也可以直接使用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)

###------------------------------------###


from keras import models
from keras import layers

network = models.Sequential()  # 序列方式構(gòu)建模型
network.add(layers.Dense(64, activation='relu', input_shape=(10000,)))
network.add(layers.Dense(64, activation='relu'))
network.add(layers.Dense(46, activation='softmax'))  # 多分類問題常用的激活函數(shù)softmax

network.compile(optimizer='rmsprop',
                loss='categorical_crossentropy',  # 交叉熵
                metrics=['accuracy'])

x_val = x_train[:1000]
partial_x_train = x_train[1000:]

y_val = one_hot_train_labels[:1000]
partial_y_train = one_hot_train_labels[1000:]

history = network.fit(partial_x_train, partial_y_train, epochs=20, validation_data=(x_val, y_val))


import matplotlib.pyplot as plt

loss = history.history['loss']
val_loss = history.history['val_loss']

epoch = range(1, len(loss)+1)

plt.plot(epoch, loss, 'bo', label='Training loss')
plt.plot(epoch, val_loss, 'b', label='Training val_loss')
plt.title("Training and validation loss")
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.show()

plt.clf()

acc = history.history['acc']
val_acc = history.history['val_acc']

plt.plot(epoch, acc, 'bo', label='Training acc')
plt.plot(epoch, val_loss, 'b', label='Training val_loss')
plt.title('Training and validation acc')
plt.xlabel('Epochs')
plt.ylabel('acc')
plt.legend()
plt.show()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容