激活函数:
1.softmax函数
在多分类中常用的激活函数,是基于逻辑回归的,常用在输出一层,将输出压缩在0~1之间,且保证所有元素和为1,表示输入值属于每个输出值的概率大小
2、Sigmoid函数
f
(
x
)
=
1
1
+
e
−
x
f(x)= \frac{1}{1+\\{e^{-x}}}
f(x)=1+e−x1
3.tanh函数:
公式:
tanh(x)
4.relu函数
公式:
f(x)=max(0,x)
5.Leaky Relu函数
公式:
{
x
,
x>=0
e
x
−
1
,
x
<
0
\begin{cases} x, & \text {x>=0} \\ {e^x-1} ,&x<0\end{cases}
{x,ex−1,x>=0x<0
归一化:
把输入数据做一个规整,使得其均值为0,方差为1
Min-max归一化: x=(x-min)/(max-min)
Z-score归一化: x=(x-u)/a
import matplotlib as mpl #导入具有画图功能的库
import matplotlib.pyplot as plt #matplotlib的子类 一个有命令风格的函数集合
%matplotlib inline
import numpy as np #是Python的一种开源的数值计算扩展 用于处理矩阵
import pandas as pd
import os
import sys
import time
import sklearn
import tensorflow as tf
from tensorflow import keras #从tensorflow中引入keras
#打印版本
print(tf.__version__)
print(sys.version_info)
for module in mpl,np,pd,tf,keras,sklearn:
print(module.__name__,module.__version__)
fashion_mnist =tf.keras.datasets.fashion_mnist
# fashion_mnist =fashion_mn.load_data() #从keras中导入数据
#将训练集和测试集拆分出来
(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:] #前5000张数据集作为验证集 将后5000张作为训练集
#y同理做相同操作
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)
#做数据归一化
#x=(x-u) /std (u是均值 std是方差)
from sklearn.preprocessing import StandardScaler # StandardScaler 作用:去均值和方差归一化。且是针对每一个特征维度来做的,而不是针对样本。
scaler = StandardScaler()
#x_train:[None,28,28] (三维矩阵) -->[None,784](转化为二维数据)
x_train_scaled=scaler.fit_transform( #对训练集做归一化 fit_transform(trainData)对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对该trainData进行转换transform,从而实现数据的标准化、归一化等等
x_train.astype(np.float32).reshape(-1,1) #astype() 修改数据类型
).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)
#模型创建
#tf.keras.models.Sequential()
#Sequential()方法是一个容器,描述了神经网络的网络结构,在Sequential()的输入参数中描述从输入层到输出层的网络结构
model=keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
for _ in range(20):#定义了20层的神经网络
model.add(keras.layers.Dense(100,activation='selu')) #selu:自带归一化功能的函数
#AlphaDropout:1、均值和方差不变 2、归一化的性质也不变
model.add(keras.layers.AlphaDropout(rate=0.5)) #0.5的时候 子网数目最大
model.add(keras.layers.Dropout(rate=0.5))
model.add(keras.layers.Dense(10,activation="softmax")) #softmax: 将向量变成概率分布 x=[x1,x2,x3], y=[e^x1/sum,e^x2/sum,e^x3/sum] sum=e^x1+e^x2+e^x3
# labels 是 one-hot 编码,用 categorical_crossentropy one-hot 编码: [[0, 1, 0],[1, 0, 0],[0, 0, 1]]
#tagets 是 数字编码 ,用 sparse_categorical_crossentropy y-index是数字编码
model.compile(loss="sparse_categorical_crossentropy",optimizer="sgd",metrics=["accuracy"]) #model.compile(optimizer=优化器,loss=损失函数,metrics=["准确率"])
model.summary()
#三个callback函数 Tensorboard earlystopping ModelCheckpoint
#Tensorboard需要一个文件夹 ModelCheckpoint需要一个文件名
logdir='./dnn-bn-backs'
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),#TensorBoard是一个可视化工具,它可以用来展示网络图、张量的指标变化、张量的分布情况
keras.callbacks.ModelCheckpoint(output_model_file,save_best_only='True'),
keras.callbacks.EarlyStopping(patience=5,min_delta=1e-3)
#min_delta:阈值:这次训练和上次训练的差距是不是比这个阈值要低,要高的话就不用EarlyStopping,否则就要提前停止掉,patience:当差距比min_delta连续多少次小的时候关闭掉
]
callbacks=[]
history=model.fit(x_train_scaled,y_train,epochs=10,
validation_data=(x_valid_scaled,y_valid),
callbacks=callbacks
)#训练集遍历10次
#将值的变化过程 用图形输出出来
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)
运行结果:
[0.6382496953010559, 0.8701000213623047]