机器学习:【12】卷积神经网络实践及优化

#本代码基于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层,用来抑制过拟合

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex-YiWang

不要打赏,想要一个赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值