tf.keras實現邏輯迴歸和softmax多分類

有何m不可發表於2024-05-31

邏輯迴歸實現

轉自:https://www.cnblogs.com/miraclepbc/p/14311509.html

相關庫引用

import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

載入資料

data = pd.read_csv("E:/datasets/dataset/credit-a.csv", header = None) # 獲取資料
x = data.iloc[:, :-1]
y = data.iloc[:, -1].replace(-1, 0)
data.head()

tf.keras實現邏輯迴歸和softmax多分類
觀察發現,最後一列(label)非0即1。因此,這是一個二分類問題。可以考慮把-1全都替換成0

定義模型

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(4, input_shape = (15, ), activation = 'relu'))
model.add(tf.keras.layers.Dense(4, activation = 'relu'))
model.add(tf.keras.layers.Dense(1, activation = 'sigmoid'))
model.summary()

tf.keras實現邏輯迴歸和softmax多分類

這個模型第一層,有4個神經元,因為輸入是15個引數,因此引數個數為415+4=644∗15+4=64。這裡使用ReLU作為啟用函式;
模型第二層,有4個神經元,輸入是4個引數,因此引數個數為44+4=204∗4+4=20。這裡使用ReLU作為啟用函式;
模型第三層,有1個神經元,輸入是4個引數,因此引數個數為14+1=51∗4+1=5。這裡使用Sigmoid作為啟用函式。
這裡總共有89個引數

模型編譯

model.compile(
    optimizer = 'adam',
    loss      = 'binary_crossentropy',
    metrics   = ['acc'] # 設定顯示的引數
)

這裡是二分類問題,因此損失函式可以設定為binary_crossentropy

訓練模型

history = model.fit(x, y, epochs = 1000) # 訓練1000次

tf.keras實現邏輯迴歸和softmax多分類

下面我們來看一下模型的一些引數

history.history.keys()

發現有loss和acc兩個引數
然後,我們再畫出隨著訓練輪數的增加,loss和acc的變化曲線圖

plt.plot(history.epoch, history.history.get('loss'))
plt.plot(history.epoch, history.history.get('acc'))

loss變化曲線圖:
tf.keras實現邏輯迴歸和softmax多分類
acc變化曲線圖:
tf.keras實現邏輯迴歸和softmax多分類

softmax多分類實現

載入資料

(train_image, train_label), (test_image, test_label) = tf.keras.datasets.fashion_mnist.load_data() # 獲取資料
plt.imshow(train_image[0]) # 顯示第一張圖片

tf.keras實現邏輯迴歸和softmax多分類

資料歸一化:

train_image = train_image / 255
test_image = test_image / 255

定義模型

model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape = (28, 28)))
model.add(tf.keras.layers.Dense(128, activation = 'relu'))
# model.add(tf.keras.layers.Dropout(0.5)) 新增一個dropout層,防止過擬合
model.add(tf.keras.layers.Dense(10, activation = 'softmax'))

因為輸入影像是二維的(28*28),因此需要先將其變換成一維向量。
第一層128個神經元,啟用函式為ReLU
第二層10個神經元,啟用函式為softmax

模型編譯

model.compile(
    optimizer = 'adam',
    loss      = 'sparse_categorical_crossentropy',
    metrics   = ['acc']
)

這裡因為是多分類問題,並且標籤是一般的數值標籤,因此損失函式使用sparse_categorical_crossentropy

訓練模型

model.fit(train_image, train_label, epochs = 10) # 訓練10次
# model.fit(train_image, train_label, epochs = 10, validation_data = (test_image, test_label)) # validation_data可以同時檢視測試集的正確率和損失

tf.keras實現邏輯迴歸和softmax多分類

模型評價

在測試集上評估訓練的模型

model.evaluate(test_image, test_label)

tf.keras實現邏輯迴歸和softmax多分類

one-hot編碼

one-hot編碼的轉換

train_label_onehot = tf.keras.utils.to_categorical(train_label)
test_label_onehot = tf.keras.utils.to_categorical(test_label)

模型的編譯

model.compile(
    optimizer = 'adam',
    loss      = 'categorical_crossentropy',
    metrics   = ['acc']
)

因為使用的是one-hot編碼,因此損失函式使用categorical-crossentropy

相關文章