#本代码基于kaggle平台tensorflow2.0
#数据来自fashion_mnist数据集
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
#1 导入数据
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels),(test_images, test_labels) = fashion_mnist.load_data()
#2 对数据进行预处理,补充第四维
train_images = np.expand_dims(train_images, -1)
test_images = np.expand_dims(test_images, -1)
train_images.shape #因为图片只有一层,channel为1,
#第一维度为batch (一般为none)
#第二维度为height
#第三维度为width
#第四维度为channel
#3 建立模型
model = tf.keras.Sequential() #顺序模型,
model.add(tf.keras.layers.Conv2D(32,(3,3),input_shape=train_images.shape[1:],activation='relu'))
#卷积层作为第一层,特征提取能力远远大于其他,第一层很重要
#建立32个卷积核,大小为3*3(一般为3或5)
#输入形状为输入图像的后几列(第1维为个数)
#激活函数一般为relu
#默认padding方式为不填充
model.add(tf.keras.layers.MaxPool2D())
#用来缩小图像
#默认keysize为2*2(即变为原来一半)
model.add(tf.keras.layers.Conv2D(64,(3,3),activation='relu'))
#和第一个卷积层相同,卷积核数量按2的倍数增加,2的n次方拟合能力比较好
model.add(tf.keras.layers.GlobalAveragePooling2D())
#这种池化层,为全局平均池化,将四维数据处理为二维数据
model.add(tf.keras.layers.Dense(10, activation='softmax'))
#4 编译模型
model.compile(optimizer = 'adam',
loss = 'sparse_categorical_crossentropy',
metrics=['acc']
)
#5 模型训练
history = model.fit(train_images, train_labels, epochs=30,
validation_data=(test_images, test_labels))
#6 模型评价
plt.plot(history.epoch, history.history.get('acc'), label='acc')
plt.plot(history.epoch, history.history.get('val_acc'), label='val_acc')
#测试集上正确率出现震荡,出现过拟合,要进行优化
plt.plot(history.epoch, history.history.get('loss'), label='loss')
plt.plot(history.epoch, history.history.get('val_loss'), label='val_loss')
#出现了过拟合
#要增大隐藏层的单元数,不能设置太小
#在池化层后面添加Dropout层,可以用来
---------------------------------------------------------------------------
#出现过拟合,对模型进行优化
#建立模型
model = tf.keras.Sequential() #顺序模型,
model.add(tf.keras.layers.Conv2D(64,(3,3),input_shape=train_images.shape[1:],activation='relu', padding='same'))
model.add(tf.keras.layers.Conv2D(64,(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(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())
model.add(tf.keras.layers.Dense(256, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
#模型编译
model.compile(optimizer = 'adam',
loss = 'sparse_categorical_crossentropy',
metrics=['acc']
)
#模型训练
history = model.fit(train_images, train_labels, epochs=,
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.plot(history.epoch, history.history.get('loss'), label='loss')
plt.plot(history.epoch, history.history.get('val_loss'), label='val_loss')
#出现了过拟合
#要增大隐藏层的单元数,不能设置太小
#在池化层后面添加Dropout层,用来抑制过拟合
机器学习:【12】卷积神经网络实践及优化
于 2020-02-08 20:59:24 首次发布