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


邏輯回歸實現

相關庫引用

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()


觀察發現,最后一列(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()

這個模型第一層,有4個神經元,因為輸入是15個參數,因此參數個數為\(4*15+4=64\)。這里使用ReLU作為激活函數;
模型第二層,有4個神經元,輸入是4個參數,因此參數個數為\(4*4+4=20\)。這里使用ReLU作為激活函數;
模型第三層,有1個神經元,輸入是4個參數,因此參數個數為\(1*4+1=5\)。這里使用Sigmoid作為激活函數。
這里總共有89個參數

模型編譯

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

這里是二分類問題,因此損失函數可以設置為binary_crossentropy

訓練模型

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

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

history.history.keys()

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

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

loss變化曲線圖:

acc變化曲線圖:

softmax多分類實現

加載數據

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

數據歸一化:

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可以同時查看測試集的正確率和損失

模型評價

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

model.evaluate(test_image, test_label)

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM