<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 1、基本模型构建
1.1 准备数据集
在这里我们使用了fashion_mnist数据集，里面是70000张28*28的图片，图片分为衣服、鞋子等10类。
Step1:  我们看一下图片是什么样子的：
Step2:  1.2 构建模型
构建模型主要分成2部分：
（1）指定模型的各层节点数及其连接
（2）编译模型，指定损失函数、优化方法、metrics等
Step3:  如果sigmoid改成relu的话，精度就会降低非常的多。为啥呢？
这样我们的模型就构建完成了，我们看一下模型长什么样子的：
Step4:  1.3 训练模型
训练模型fit()返回的是一个History对象，用于保存中间计算过程的数据。
Step5:  我们把训练过程中的loss及accuracy打印出来
Step6:  1.4 evaluate模型
Step7:  1.5 完整代码
Step8:  2、归一化
Step9:  现有数据在0~255之间，下面我们对数据做归一化。
我们使用均值是0，方差为1的标准正则归一化（也叫Z-score归一化），即： x = (x-u)/std
还有一种常见的归一化方式：Min-max归一化：x*=(x-min)/(max-min),取值在[0,1]之间。
Step10:  上述代码的几个说明：
（1）fit_transform/transform接受的是一个二维浮点数向量作为参数，所以需要先转成2维向量再转回三维。
（2）fit_transform()和transform()：fit_transform()除了transform的归一化功能外，还把数据集的均值和方差记录下来，供下面的验证集、测试集使用。
然后我们再训练时使用上面经过归一化的数据：
Step11:  3、回调函数：TensorBoard EarlyStopping ModelCheckpoint
Callbacks
Step12:  启动tensorborad的方式很简单：
tensorboard --logdir=callbacks
然后打开http
Step13:  DNN在前几个ecpochs的训练时，loss降低的很慢，导致这个问题的原因主要有：
（1）参数众多、训练不足
（2）梯度消失 多层符合函数的链式法则导致的。
5、批归一化、dropout、激活函数
5.1 批归一化
归一化是对训练、测试数据做了归一化，就是模型的输入数据做了归一化。
而批归一化是对每一层激活函数的输出（也就是下一层的输入）都做了归一化。
Step14:  5.2 selu
上述relu+批归一化也可以通过直接使用selu激活函数代替：
Step15:  5.3 dropout
Step16:  6、完整代码
<ASSISTANT_TASK:>
Python Code:
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:]
y_valid,y_train = y_train_all[:5000],y_train_all[5000:]
print(x_train.shape,y_train.shape)
print(x_valid.shape,y_valid.shape)
print(x_test.shape,y_test.shape)
Explanation: 1、基本模型构建
1.1 准备数据集
在这里我们使用了fashion_mnist数据集，里面是70000张28*28的图片，图片分为衣服、鞋子等10类。
End of explanation
def show_single_image(img_arr):
    plt.imshow(img_arr, cmap='binary')
    plt.show()
    
show_single_image(x_train[0])
def show_imgs(n_rows, n_cols, x_data, y_data, class_names):
    assert len(x_data) == len(y_data)
    assert n_rows * n_cols < len(x_data)
    plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))
    for row in range(n_rows):
        for col in range(n_cols):
            index = n_cols * row + col 
            plt.subplot(n_rows, n_cols, index+1)
            plt.imshow(x_data[index], cmap="binary",
                       interpolation = 'nearest')
            plt.axis('off')
            plt.title(class_names[y_data[index]])
    plt.show()
class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',
               'Coat', 'Sandal', 'Shirt', 'Sneaker',
               'Bag', 'Ankle boot']
show_imgs(3, 5, x_train, y_train, class_names)
Explanation: 我们看一下图片是什么样子的：
End of explanation
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28])) #将输入的二维数组展开成一维向量
model.add(keras.layers.Dense(300,activation='sigmoid'))
model.add(keras.layers.Dense(100,activation='sigmoid'))
model.add(keras.layers.Dense(10,activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy',
             optimizer='sgd',
             metrics=['accuracy'])
Explanation: 1.2 构建模型
构建模型主要分成2部分：
（1）指定模型的各层节点数及其连接
（2）编译模型，指定损失函数、优化方法、metrics等
End of explanation
model.layers
model.summary()
Explanation: 如果sigmoid改成relu的话，精度就会降低非常的多。为啥呢？
这样我们的模型就构建完成了，我们看一下模型长什么样子的：
End of explanation
history = model.fit(x_train,y_train,epochs=10,validation_data=(x_valid,y_valid))
type(history)
history.history
Explanation: 1.3 训练模型
训练模型fit()返回的是一个History对象，用于保存中间计算过程的数据。
End of explanation
def print_learning_curves(history):
    pd.DataFrame(history.history).plot(figsize=(10,5))
    plt.grid(True)
    plt.gca().set_ylim(0,1)
    plt.show()
    
print_learning_curves(history)
Explanation: 我们把训练过程中的loss及accuracy打印出来:
End of explanation
model.evaluate(x_test,y_test)
Explanation: 1.4 evaluate模型
End of explanation
import numpy as tf
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow as tf
from tensorflow import keras
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:]
y_valid,y_train = y_train_all[:5000],y_train_all[5000:]
print(x_train.shape,y_train.shape)
print(x_valid.shape,y_valid.shape)
print(x_test.shape,y_test.shape)
def show_single_image(img_arr):
    plt.imshow(img_arr, cmap='binary')
    plt.show()
    
show_single_image(x_train[0])
def show_imgs(n_rows, n_cols, x_data, y_data, class_names):
    assert len(x_data) == len(y_data)
    assert n_rows * n_cols < len(x_data)
    plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))
    for row in range(n_rows):
        for col in range(n_cols):
            index = n_cols * row + col 
            plt.subplot(n_rows, n_cols, index+1)
            plt.imshow(x_data[index], cmap="binary",
                       interpolation = 'nearest')
            plt.axis('off')
            plt.title(class_names[y_data[index]])
    plt.show()
class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',
               'Coat', 'Sandal', 'Shirt', 'Sneaker',
               'Bag', 'Ankle boot']
show_imgs(3, 5, x_train, y_train, class_names)
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28])) #将输入的二维数组展开成一维向量
model.add(keras.layers.Dense(300,activation='sigmoid'))
model.add(keras.layers.Dense(100,activation='sigmoid'))
model.add(keras.layers.Dense(10,activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy',
             optimizer='sgd',
             metrics=['accuracy'])
model.layers
model.summary()
history = model.fit(x_train,y_train,epochs=10,validation_data=(x_valid,y_valid))
type(history)
history.history
def print_learning_curves(history):
    pd.DataFrame(history.history).plot(figsize=(10,5))
    plt.grid(True)
    plt.gca().set_ylim(0,1)
    plt.show()
    
print_learning_curves(history)
model.evaluate(x_test,y_test)
Explanation: 1.5 完整代码
End of explanation
print(np.max(x_train), np.min(x_train))
Explanation: 2、归一化
End of explanation
#scaler = sklearn.preprocessing.StandardScaler()
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
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)
Explanation: 现有数据在0~255之间，下面我们对数据做归一化。
我们使用均值是0，方差为1的标准正则归一化（也叫Z-score归一化），即： x = (x-u)/std
还有一种常见的归一化方式：Min-max归一化：x*=(x-min)/(max-min),取值在[0,1]之间。
End of explanation
history = model.fit(x_train_scaler,y_train,epochs=10,validation_data=(x_valid_scaler,y_valid))
model.evaluate(x_test_scaler,y_test)
Explanation: 上述代码的几个说明：
（1）fit_transform/transform接受的是一个二维浮点数向量作为参数，所以需要先转成2维向量再转回三维。
（2）fit_transform()和transform()：fit_transform()除了transform的归一化功能外，还把数据集的均值和方差记录下来，供下面的验证集、测试集使用。
然后我们再训练时使用上面经过归一化的数据：
End of explanation
logdir = './callbacks'
if not os.path.exists(logdir):
    os.mkdir(logdir)
output_model_file = os.path.join(logdir,"fashion_mnist_model.h5")
callbacks = [
    keras.callbacks.TensorBoard(logdir),
    keras.callbacks.ModelCheckpoint(output_model_file, save_best_only = True),
    keras.callbacks.EarlyStopping(patience=5,min_delta=1e-3)
]
history = model.fit(x_train_scaler, y_train, epochs=10, 
                   validation_data=(x_valid_scaler,y_valid),
                   callbacks = callbacks)
Explanation: 3、回调函数：TensorBoard EarlyStopping ModelCheckpoint
Callbacks: utilities called at certain points during model training.
也就是说模型训练过程中在某些点会触发一些功能或者操作。
最常用的就是TensorBoard EarlyStopping ModelCheckpoint这3类，以下会分别介绍。完整的callback请参考官方文档的
tf.keras.callback：https://www.tensorflow.org/api_docs/python/tf/keras/callbacks?hl=zh-cn
End of explanation
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
for _ in range(20):
    model.add(keras.layers.Dense(10,activation='relu'))
model.add(keras.layers.Dense(10,activation='softmax'))
Explanation: 启动tensorborad的方式很简单：
tensorboard --logdir=callbacks
然后打开http://localhost:6006/ 即可。
4、深度神经网络
DNN也没什么特别，就是层数比较多：
End of explanation
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
for _ in range(20):
    model.add(keras.layers.Dense(10,activation='relu'))
    model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Dense(10,activation='softmax'))
Explanation: DNN在前几个ecpochs的训练时，loss降低的很慢，导致这个问题的原因主要有：
（1）参数众多、训练不足
（2）梯度消失 多层符合函数的链式法则导致的。
5、批归一化、dropout、激活函数
5.1 批归一化
归一化是对训练、测试数据做了归一化，就是模型的输入数据做了归一化。
而批归一化是对每一层激活函数的输出（也就是下一层的输入）都做了归一化。
End of explanation
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
for _ in range(20):
    model.add(keras.layers.Dense(10,activation='selu'))
model.add(keras.layers.Dense(10,activation='softmax'))
Explanation: 5.2 selu
上述relu+批归一化也可以通过直接使用selu激活函数代替：
End of explanation
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
for _ in range(20):
    model.add(keras.layers.Dense(10,activation='selu'))
model.add(keras.layers.AlphaDropout(rate=0.5))# 只在最后一层添加了dropout
# AlphaDropout: 1. 均值和方差不变 2. 归一化性质也不变
# model.add(keras.layers.Dropout(rate=0.5))
model.add(keras.layers.Dense(10,activation='softmax'))
Explanation: 5.3 dropout
End of explanation
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow as tf
from tensorflow import keras
import sklearn
import os
#导入数据
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:]
y_valid,y_train = y_train_all[:5000],y_train_all[5000:]
#训练数据归一化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
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)
#构建及compile模型
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
for _ in range(20):
    model.add(keras.layers.Dense(100,activation='selu'))
model.add(keras.layers.AlphaDropout(rate=0.5))
model.add(keras.layers.Dense(10,activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy',
             optimizer='sgd',
             metrics=['accuracy'])
#定义callback
logdir = './callbacks'
if not os.path.exists(logdir):
    os.mkdir(logdir)
output_model_file = os.path.join(logdir,"fashion_mnist_model.h5")
callbacks = [
    keras.callbacks.TensorBoard(logdir),
    keras.callbacks.ModelCheckpoint(output_model_file, save_best_only = True),
    keras.callbacks.EarlyStopping(patience=5,min_delta=1e-3)
]
#训练模型
history = model.fit(x_train_scaler, y_train, epochs=10, 
                   validation_data=(x_valid_scaler,y_valid),
                   callbacks = callbacks)
#检查模型效果
def print_learning_curves(history):
    pd.DataFrame(history.history).plot(figsize=(10,5))
    plt.grid(True)
    plt.gca().set_ylim(0,1)
    plt.show()
    
print_learning_curves(history)
model.evaluate(x_test_scaler,y_test)
Explanation: 6、完整代码
End of explanation
<END_TASK>