使用tf.keras搭建CNN卷积神经网络识别Fashionmnist数据集。
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
#加载fishion mnist数据集
(train_image,train_lable),(test_image,test_lable)=tf.keras.datasets.fashion_mnist.load_data()
#原始数据--train
print('train_image的形状:\r\n',train_image.shape)
print('train_lable的形状:\r\n',train_lable.shape)
#原始数据--test
print('test_image的形状:\r\n',test_image.shape)
print('test_lable的形状:\r\n',test_lable.shape)
#之前多层感知器,对于数据的预处理是 把图0片进行扁平化(把图片变成一维的数组)
#而,卷积神经网络需要的是一个图片数据(实际上是一个四维的图片)--(num,height,width,channel通道数)
train_image=np.expand_dims(train_image,-1)#进行扩张维度
print('train_image_4的形状:\r\n',train_image.shape)
test_image=np.expand_dims(test_image,-1)#进行扩张维度
print('train_image_4的形状:\r\n',test_image.shape)
#建立模型:
model=tf.keras.Sequential()#顺序模型
#添加一个卷积层:(第一层非常的关键,第一层一定要是卷积层)
model.add(tf.keras.layers.Conv2D(64,
(3,3),
input_shape=(28,28,1),
activation='relu',
padding='same'))
model.add(tf.keras.layers.Conv2D(64,
(3,3),
activation='relu',
padding='same'))
#添加一个池化层 #使得卷积层的视野在不断扩大
model.add(tf.keras.layers.MaxPool2D()) #Maxpool2D之后的 height和width都会变成原来的一半
#过拟合:
model.add(tf.keras.layers.Dropout(0.5))
#再添加一个卷积层
model.add(tf.keras.layers.Conv2D(128, (3,3), activation='relu',padding='same'))
model.add(tf.keras.layers.Conv2D(128, (3,3), activation='relu',padding='same'))
model.add(tf.keras.layers.MaxPool2D())
model.add(tf.keras.layers.Dropout(0.5))
#再添加一个卷积层
model.add(tf.keras.layers.Conv2D(256, (3,3), activation='relu',padding='same'))
model.add(tf.keras.layers.Conv2D(256, (3,3), activation='relu',padding='same'))
model.add(tf.keras.layers.MaxPool2D())
model.add(tf.keras.layers.Dropout(0.5))
#再添加一个卷积层
model.add(tf.keras.layers.Conv2D(512, (3,3), activation='relu',padding='same'))
model.add(tf.keras.layers.Conv2D(512, (3,3), activation='relu',padding='same'))
model.add(tf.keras.layers.Dropout(0.5))
#全局的平均池化:
model.add(tf.keras.layers.GlobalAveragePooling2D())#将原来的四维-变成二维
#dense层接收的是一个二维的数据:
model.add(tf.keras.layers.Dense(256,activation='relu'))
#dense层接收的是一个二维的数据:
model.add(tf.keras.layers.Dense(10,activation='softmax'))
model.summary()
#编译
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc']
)
#训练
print('训练:\r\n')
history=model.fit(train_image,train_lable,epochs=20,validation_data=(test_image,test_lable))