卷积:用原始像素数据与过滤器中的值相乘,以后加起来。
如下是增强水平特征的过滤器。
MaxPooling:每次卷积结束以后用一个MaxPooling用来增强图像的特征。
可以看出经过MaxPooling以后的图像,竖直特征增强了很多,像素也小了一半。
#设置显卡内存使用率,根据使用率占用
import os
os.environ["TF_FORCE_GPU_ALLOW_GROWTH"] = "true"
#引入必要的库
import tensorflow as tf
print(tf.__version__)
from tensorflow import keras
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns #基于matplotlib绘制图像封装的
import numpy as np
fashion_mnist = keras.datasets.fashion_mnist #导入数据集
(train_images,train_labels),(test_images,test_labels) = fashion_mnist.load_data() #导入数据集
model = keras.Sequential() #创建一个前向传播模型
#输入层,平铺展开,28*28个参数输入
model.add(keras.layers.Conv2D(64,(3,3),#添加一个卷积层64个过滤器,每个过滤器的尺寸3*3
activation = tf.nn.relu, #添加激活函数
input_shape = (28,28,1)) #输入参数为28*28*1一个通道的数据
)
model.add(keras.layers.MaxPooling2D(2,2))
#第二层卷积
model.add(keras.layers.Conv2D(64,(3,3),#添加一个卷积层64个过滤器,每个过滤器的尺寸3*3
activation = tf.nn.relu) #添加激活函数
)
model.add(keras.layers.MaxPooling2D(2,2))
model.add(keras.layers.Flatten()) #展开层
model.add(keras.layers.Dense(128,activation=tf.nn.relu))
#输出层使用softmax做分类
model.add(keras.layers.Dense(10,activation=tf.nn.softmax))
model.summary() #展示层的样子
#第一层 卷积少两个像素26*26 (3*3+1)*64
#第二层 MaxPooling 长宽变成1/4
#第三层 再少两个像素
#
#为模型装配优化器,损失函数
train_images_scaled = train_images/255 #归一化变成0~1之间数
#使用Adam优化器,交叉熵损失函数
model.compile(optimizer=tf.optimizers.Adam(),loss=tf.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
history = model.fit(train_images_scaled.reshape(-1,28,28,1), #按照列来变成n*28*28,-1,表示由世纪情况而定
train_labels,epochs=20,
validation_split=0.3,shuffle=True
)
epochs = len(history.history['loss']) #获取X轴长度
fig, axes = plt.subplots(2, sharex=True, figsize=(12, 8))
fig.suptitle('Training Metrics')
axes[0].set_ylabel("Loss", fontsize=14)
axes[0].set_xlabel("Epoch", fontsize=14)
axes[0].plot(range(epochs),history.history['loss'], label='Loss')
axes[0].plot(range(epochs),history.history['val_loss'], label='Loss')
plt.legend()
axes[1].set_ylabel("Accuracy(%)", fontsize=14)
axes[1].set_xlabel("Epoch", fontsize=14)
axes[1].plot(range(epochs),history.history['accuracy'], label='Accuracy')
axes[1].plot(range(epochs),history.history['val_accuracy'], label='Val_accuracy')
# plt.savefig('./epoch.jpg')
# plt.suptitle('自定义图表', fontsize=400, ha='center') # 即标题在x轴和y轴形成的方框内部,如下图(详细用法见下注释)。如果需要标题在这上方,使用 plt.title(blabla)
plt.legend()
plt.show()