tensorflow2.0學習——tensorflow-keras 歸一化


一、歸一化簡介

在對數據進行預處理時,經常要用到歸一化方法。

在深度學習中,將數據歸一化到一個特定的范圍能夠在反向傳播中獲得更好的收斂。如果不進行數據標准化,有些特征(值很大)將會對損失函數影響更大,使得其他值比較小的特征的重要性降低。因此 數據標准化可以使得每個特征的重要性更加均衡。

公式表達為:

 

二、歸一化實戰 

在這里我們可以將上一節所使用的的圖像分類的代碼,修改為有將數據歸一化的代碼,命名為 ------ tf_keras_classification_model-normalize,

代碼如下:

import進必要的模塊

import matplotlib as mpl
import matplotlib.pyplot as plt
#%matplotlib inline
import numpy as np
import sklearn
import pandas as pd

import os
import sys
import time
import tensorflow as tf
from tensorflow import keras

print(tf.__version__)
print(sys.version_info)

for module in mpl,np,pd,sklearn,tf,keras:
    print(module.__name__,module.__version__)

導入數據

# 導入Keras中的數據
fashion_mnist = keras.datasets.fashion_mnist
(x_train_all,y_train_all),(x_test,y_test) = fashion_mnist.load_data()

# 將數據集拆分成訓練集與驗證集
# 將前5000張圖片作為驗證集,后55000張圖片作為訓練集
x_valid,x_train = x_train_all[:5000],x_train_all[5000:]
y_valid,y_train = y_train_all[:5000],y_train_all[5000:]
print(x_valid.shape,y_valid.shape)
print(x_train.shape,y_train.shape)
print(x_test.shape,y_test.shape)

在這里我們可以查看下數據集中的最大最小值

print(np.max(x_train),np.min(x_train))

代碼執行結果如下:

255 0

即訓練集中最大值為255,最小值為0

接下來我們將數據集中的數據進行歸一化處理

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x_train_scaled = scaler.fit_transform(
x_train.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)
x_valid_scaled = scaler.transform(
x_valid.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)
x_test_scaled = scaler.transform(
x_test.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)

在這里 scaler.fit_transform 即是把 x_train 作歸一化處理的方法,但這個方法的輸入參數要求是二維的,而我們的 x_train 是三維的([None, 28, 28]), 故需先將其轉化為二維的。

上述 x_train.astype(np.float32).reshape(-1, 1) 的作用就是將三維數據轉化為二維([None, 784])。

但是在將數據轉換為二維進行歸一化之后,還需在轉化回三維,這樣才能傳入模型中進行訓練。reshape(-1, 28, 28)的作用就是如此。

這里還需注意的是訓練集的歸一化方法為 scaler.fit_transform,驗證集和測試集的歸一化方法為scaler.transform。

歸一化后我們可以再查看下訓練集中的最大最小值:

print(np.max(x_train_scaled),np.min(x_train_scaled))

結果為:

2.0231433 -0.8105136

這樣一來將數據歸一化處理就做好了。

再構建同樣的模型進行訓練

model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28,28]),
    keras.layers.Dense(300,activation='relu'),
    keras.layers.Dense(100,activation='relu'),
    keras.layers.Dense(10,activation='softmax')
])


#配置學習過程
model.compile(loss = 'sparse_categorical_crossentropy',
             optimizer='sgd',
             metrics=['accuracy'])
#開啟訓練
history = model.fit(x_train_scaled,y_train,epochs=10,
                   validation_data=(x_valid_scaled,y_valid))

訓練過程打印如下:

Train on 55000 samples, validate on 5000 samples
Epoch 1/10
55000/55000 [==============================] - 10s 175us/sample - loss: 0.5347 - accuracy: 0.8103 - val_loss: 0.4324 - val_accuracy: 0.8478
Epoch 2/10
55000/55000 [==============================] - 8s 149us/sample - loss: 0.3912 - accuracy: 0.8603 - val_loss: 0.3692 - val_accuracy: 0.8670
Epoch 3/10
55000/55000 [==============================] - 15s 273us/sample - loss: 0.3520 - accuracy: 0.8729 - val_loss: 0.3528 - val_accuracy: 0.8742
Epoch 4/10
55000/55000 [==============================] - 11s 195us/sample - loss: 0.3269 - accuracy: 0.8804 - val_loss: 0.3582 - val_accuracy: 0.8714
Epoch 5/10
55000/55000 [==============================] - 10s 185us/sample - loss: 0.3080 - accuracy: 0.8878 - val_loss: 0.3339 - val_accuracy: 0.8806
Epoch 6/10
55000/55000 [==============================] - 11s 202us/sample - loss: 0.2919 - accuracy: 0.8942 - val_loss: 0.3576 - val_accuracy: 0.8726
Epoch 7/10
55000/55000 [==============================] - 7s 136us/sample - loss: 0.2793 - accuracy: 0.8981 - val_loss: 0.3159 - val_accuracy: 0.8872
Epoch 8/10
55000/55000 [==============================] - 8s 149us/sample - loss: 0.2661 - accuracy: 0.9031 - val_loss: 0.3157 - val_accuracy: 0.8828
Epoch 9/10
55000/55000 [==============================] - 9s 166us/sample - loss: 0.2552 - accuracy: 0.9083 - val_loss: 0.3118 - val_accuracy: 0.8820
Epoch 10/10
55000/55000 [==============================] - 8s 152us/sample - loss: 0.2455 - accuracy: 0.9110 - val_loss: 0.2982 - val_accuracy: 0.8920

可以看出相比上一節的訓練結果,使用歸一化后的訓練效果更好。

也可以將訓練結果可視化

#變化過程可視化
def plot_learning_curves(history):
    pd.DataFrame(history.history).plot(figsize=(8,5))
    plt.grid(True) #打印網格
    plt.gca().set_ylim(0,1)
    plt.show()
plot_learning_curves(history)

打印結果為:

 

 

 

最后可以對測試集進行評估

#測試,評估
model.evaluate(x_test_scaled,y_test)

輸出結果為:

loss: 0.2733 - accuracy: 0.8825

即精度為0.8825

 


免責聲明!

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



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