分类模型的实战

数据没有归一化的模型:

import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import os
import sys
import time

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[5000:10000]
y_valid , y_train = y_train_all[:5000],y_train_all[5000:10000]

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

#;另一种方法:
'''
model = keras.Sequential(
    keras.layers.Flatten(input_shape=[28,28])
    keras.layers.Dense(300,activation='relu')
    keras.layers.Dense(100,activation='relu')
    keras.layers.Dense(40,activation='relu')
    keras.layers.Dense(10,activation='softmax')
)


'''

model.compile(optimizer=keras.optimizers.SGD(learning_rate=0.001),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics = ['accuracy'])

model.summary()
history = model.fit(x_train,y_train,epochs=5,validation_data=(x_valid,y_valid))

def plt_history(history):
    pd.DataFrame(history.history).plot(figsize=(8,5))
    plt.grid(True)
    plt.gca().set_ylim(0,1)
    plt.show()

plt_history(history)

model.evaluate(x_test,y_test)

数据归一化的好处之一是能够有效的避免过拟和。TensorFlow的框架中有现存的API能够实现数据的归一化。

只需加上一下代码:

# 归一化
# x = (x -mean)/std

from sklearn.preprocessing import StandardScaler

#初始化一个StandarScaler()
scaler = StandardScaler()

#由于每次训练集需要采用不同参数来进行训练,因此使用fit_transform。测试和验证要保持和训练集一样的参数,因此为transform
#fit_transfor和transform的数据必须是二维的,因此将数据集的大小reshape为(-1,1),处理完之后在reshape回来

x_train_scaler  = scaler.fit_transform(
                    x_train.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)

x_valid_scaler = scaler.transform(
             x_valid.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)

x_test_scaler = scaler.transform(
             x_test.astype(np.float32).reshape(-1,1)).reshape(-1,28,28) 

 

 

你可能感兴趣的:(分类模型的实战)