import tensorflow as tf
import tensorflow.keras as keras
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
#導入數據
fashion_mnist = keras.datasets.fashion_mnist
(X_train_all, y_train_all), (X_test, y_test) = fashion_mnist.load_data()
X_valid, X_train = X_train_all[:5000], X_train_all[1000:]
y_valid, y_train = y_train_all[:5000], y_train_all[1000:]
#歸一化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train.astype(np.float32).reshape(-1,28*28)).reshape(-1,28,28)
X_valid_scaled = scaler.transform(X_valid.astype(np.float32).reshape(-1,28*28)).reshape(-1, 28, 28)
#構建模型
model = keras.Sequential([
keras.layers.Flatten(input_shape=[28, 28]),
keras.layers.Dense(300, activation='sigmoid'),
keras.layers.Dense(100, activation='sigmoid'),
keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
history = model.fit(X_train_scaled, y_train, epochs=10)
print(history.history)
scaler = StandardScaler()定義一個對象用於標准化
scaler.fit_transform(X_train.astype(np.float32).reshape(-1,28*28)).reshape(-1,28,28)調用fit_transform函數,該函數由兩部人份組成,第一部分是fit函數,這個函數產生了每一列的均值和標准差,存入scarler對象中,然后調用transform函數對矩陣進行標准化。而fit_transform函數是對這兩個函數的整合。所以可以看到
X_valid_scaled = scaler.transform(X_valid.astype(np.float32).reshape(-1,28*28)).reshape(-1, 28, 28)直接調用transform而不是fit_transform,因為scaler中已經有相應的均值和方差了,所以以后只要直接transform就行。因為不管是對驗證集還是測試集,都是用的訓練集的均值和方差。
可以通過
print(scaler.mean_)
print(scaler.scale_)
查看訓練集中每一列(每一個特征)的均值和標准差。