邏輯迴歸實現
轉自: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()
觀察發現,最後一列(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=644∗15+4=64。這裡使用ReLU作為啟用函式;
模型第二層,有4個神經元,輸入是4個引數,因此引數個數為4∗4+4=204∗4+4=20。這裡使用ReLU作為啟用函式;
模型第三層,有1個神經元,輸入是4個引數,因此引數個數為1∗4+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次
下面我們來看一下模型的一些引數
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