import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
fashion_mnist=keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels)=fashion_mnist.load_data()
train_images=np.expand_dims(train_images,-1)
test_images=np.expand_dims(test_images,-1) #扩展第4维,要保存通道编号
model=tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(64,(3,3),padding='same',input_shape=(28,28,1),activation='relu'))
model.add(tf.keras.layers.MaxPool2D())
model.add(tf.keras.layers.Conv2D(128,(3,3),padding='same',activation='relu'))
model.add(tf.keras.layers.MaxPool2D())
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax'))
model.summary()
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc']
)
history=model.fit(train_images,train_labels,epochs=30,validation_data=(test_images,test_labels))
plt.plot( history.epoch, history.history.get('acc'),label='acc')
plt.plot( history.epoch, history.history.get('val_acc'),label='val_acc')
plt.legend()
plt.plot( history.epoch, history.history.get('loss'),label='loss')
plt.plot( history.epoch, history.history.get('val_loss'),label='val_loss')
plt.legend()
重点代码说明:
tf.keras.layers.Conv2D(64,(3,3),padding='same',input_shape=(28,28,1),activation='relu')) Conv2D是进行一层卷积操作。
参数padding的两个选择:same与valid模式的区别:在卷积时,如果input与filter卷积时存在残余行列时,valid模式下会自动抛弃剩下没有卷积内容,而same模式下会自动边界填充,边界外填充0,满足卷积条件。
train_images=np.expand_dims(train_images,-1),原始数据为255*255的矩阵,在进行卷积时,一个卷积核会重新得到一个矩阵。多个卷积核就得到多个矩阵。所以先将维度扩充。最后一个维度保留为卷积核的ID,一个矩阵经过多个卷积核操作之后就需要保留原始的二维矩阵在加上一个唯一id来表明时不同的卷积核操作的结果。
|