import matplotlib as mpl # Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用
import matplotlib.pyplot as plt # Python数据可视化matplotlib.pyplot
# %matplotlib inline #在使用jupyter notebook 或者 jupyter qtconsole的时候,经常会用到%matplotlib inline。其作用就是在你调用plot()进行画图或者直接输入Figure的实例对象的时候,会自动的显示并把figure嵌入到console中。
import numpy as np # 数值计算扩展。这种工具可用来存储和处理大型矩阵
import sklearn # 机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)等方法。
import pandas as pd # 是python的一个数据分析包
import os # 系统编程的操作模块,可以处理文件和目录
import sys # sys模块包含了与Python解释器和它的环境有关的函数
import time
import tensorflow as tf
from tensorflow import keras
##################################################################################################
# 选择GPU
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
##################################################################################################
print(tf.__version__)
print(sys.version_info)
for module in mpl, np, pd, sklearn, tf, keras:
print(module.__name__, module.__version__)
##################################################################################################
fashion_mnist = keras.datasets.fashion_mnist # 从keras中导入数据集datasets
(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data( )# load_data导入训练集和测试集,x是图片,y是label
x_valid, x_train = x_train_all[:5000], x_train_all[5000: ] # 导入数据集中前x_valid5000个和x_train 为5000之后的
y_valid, y_train = y_train_all[:5000], y_train_all[5000: ] # 导入数据集中前y_valid5000个和y_train 为5000之后的
print(x_valid.shape, y_valid.shape ) # 前5000个训练集
print(x_train.shape, y_train.shape ) # 训练集
print(x_test.shape, y_test.shape ) # 测试集
##################################################################################################
# x = (x - u) / std u是均值,std是方差
# 符合均值是0,方差是1的正态分布
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,1)
x_valid_scaled = scaler.transform(
x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28,1)
x_test_scaled = scaler.transform(
x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28,1)
# 归一化之前的accurary0.1多,归一化之后的accurary0.9多
##################################################################################################
model = keras.models.Sequential()
#添加两个卷积层一个pooling层
model.add(keras.layers.Conv2D(filters=32,kernel_size =3,padding = 'same',activation= 'selu',input_shape=(28,28,1)))
model.add(keras.layers.Conv2D(filters=32,kernel_size =3,padding = 'same',activation= 'selu'))
model.add(keras.layers.MaxPool2D(pool_size = 2))
#添加两个卷积层一个pooling层
model.add(keras.layers.Conv2D(filters=64,kernel_size =3,padding = 'same',activation= 'selu'))
model.add(keras.layers.Conv2D(filters=64,kernel_size =3,padding = 'same',activation= 'selu'))
model.add(keras.layers.MaxPool2D(pool_size = 2))
#添加两个卷积层一个pooling层
model.add(keras.layers.Conv2D(filters=128,kernel_size =3,padding = 'same',activation= 'selu'))
model.add(keras.layers.Conv2D(filters=128,kernel_size =3,padding = 'same',activation= 'selu'))
model.add(keras.layers.MaxPool2D(pool_size = 2))
#添加全连接层
#先flatten
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128,activation='selu'))
model.add(keras.layers.Dense(10, activation="softmax"))
#filters 有多个少个卷积核(输出的通道)
#kernal_size 卷积核的 大小
#padding 边缘补零,same表示输入经过卷积之后输出和输入的大小一样
##################################################################################################
# 配置训练模型
model.compile(loss="sparse_categorical_crossentropy", # 损失函数
optimizer = "sgd", # 优化器名
metrics = ["accuracy"])
# reason for sparse: y->index. y->one_hot->[]
# 原因:y是长度等于样本数目的向量,对于每个样本来说都是一个值,sparse使用y变成一个向量
##################################################################################################
print(model.layers)
"""output:
[<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x0000016444D33688>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x00000164451EA688>, <tensorflow.python.keras.layers.pooling.MaxPooling2D object at 0x00000164450B76C8>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x00000164451C4EC8>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x000001644537C508>, <tensorflow.python.keras.layers.pooling.MaxPooling2D object at 0x000001644537C148>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x000001644539F408>, <tensorflow.python.keras.layers.convolutional.Conv2D object at 0x0000016445393E88>, <tensorflow.python.keras.layers.pooling.MaxPooling2D object at 0x000001644539FCC8>, <tensorflow.python.keras.layers.core.Flatten object at 0x00000164453BC748>, <tensorflow.python.keras.layers.core.Dense object at 0x000001644539F508>, <tensorflow.python.keras.layers.core.Dense object at 0x00000164453C6948>]
"""
print(model.summary())
"""output:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 28, 28, 32) 320
_________________________________________________________________
conv2d_1 (Conv2D) (None, 28, 28, 32) 9248
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 14, 14, 32) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 14, 14, 64) 18496
_________________________________________________________________
conv2d_3 (Conv2D) (None, 14, 14, 64) 36928
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 7, 7, 64) 0
_________________________________________________________________
conv2d_4 (Conv2D) (None, 7, 7, 128) 73856
_________________________________________________________________
conv2d_5 (Conv2D) (None, 7, 7, 128) 147584
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 3, 3, 128) 0
_________________________________________________________________
flatten (Flatten) (None, 1152) 0
_________________________________________________________________
dense (Dense) (None, 128) 147584
_________________________________________________________________
dense_1 (Dense) (None, 10) 1290
=================================================================
Total params: 435,306
Trainable params: 435,306
Non-trainable params: 0
_________________________________________________________________
None
Process finished with exit code 0
"""
##################################################################################################
# 回调函数 Tensorboard, earlystopping, ModelCheckpoint
# logdir = './keras实战/callbacks'#这样运行会报错,可能是在windows下路径导致的问题
logdir = "cnn-selu-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) , # 保存在logdir中
keras.callbacks.ModelCheckpoint(output_model_file, # 模型名称
save_best_only = True), # 保存一个最好的模型
keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3) , # 如果连续5次迭代,loss值达到最小误差1e-3,便停止训练
]
##################################################################################################
# 开始训练
history = model.fit(x_train_scaled, y_train, epochs=10,
validation_data=(x_valid_scaled, y_valid),
callbacks = callbacks)
##################################################################################################
# 绘制结果图
def plot_learning_curves(history):
pd.DataFrame(history.history).plot(figsize=(8 ,5))
plt.grid(True)
plt.gca().set_ylim(0 ,3)
plt.show()
plot_learning_curves(history)
# selu也可以缓解梯度消失
# 标准化的好处可以使椭圆分布的数据(梯度下降时难以拟合出最佳路线)呈现圆的分布
##################################################################################################
# 用训练好的model进行评估
model.evaluate(x_test_scaled ,y_test)
"""output:
2s 169us/sample - loss: 0.2195 - accuracy: 0.9147
"""

版权声明:本文为qq_45391763原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。