博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Keras(十九)卷积神经网络实战
阅读量:4203 次
发布时间:2019-05-26

本文共 12224 字,大约阅读时间需要 40 分钟。

本文将介绍:

  • 如何实现tensorflow动态按需分配GPU
  • 实现卷积神经网络实战代码

一、实现tensorflow动态按需分配GPU

关于tf动态分配内存可参考文章

import matplotlib as mplimport matplotlib.pyplot as pltimport numpy as npimport sklearnimport pandas as pdimport osimport sysimport timeimport tensorflow as tffrom tensorflow import keras# 1,实现tensorflow动态按需分配GPUfrom tensorflow.compat.v1 import ConfigProtofrom tensorflow.compat.v1 import InteractiveSessionconfig = ConfigProto()config.gpu_options.allow_growth = Truesession = InteractiveSession(config=config)# 打印使用的python库的版本信息print(tf.__version__)print(sys.version_info)for module in mpl, np, pd, sklearn, tf, keras:    print(module.__name__, module.__version__)

二,实现卷积神经网络实战代码

1,从tf.keras.datasets中取数据
fashion_mnist = keras.datasets.fashion_mnist(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()x_valid, x_train = x_train_all[:5000], x_train_all[5000:]y_valid, y_train = y_train_all[:5000], y_train_all[5000:]print(x_valid.shape, y_valid.shape)print(x_train.shape, y_train.shape)print(x_test.shape, y_test.shape)
2,将数据整合为标准化数据
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()# 整合数据为1通道数据x_train_scaled = scaler.fit_transform(    x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)x_valid_scaled = scaler.transform(    x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)x_test_scaled = scaler.transform(    x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)
3,构建CNN模型
model = keras.models.Sequential()model.add(keras.layers.Conv2D(filters=32, kernel_size=3,# 32个神经元;卷积核尺寸为3                              padding='same',   # padding填充像素至与原来相同                              activation='selu',    # 或者使用relu激活函数                              input_shape=(28, 28, 1))) # 输入层为1通道28*28的图像model.add(keras.layers.Conv2D(filters=32, kernel_size=3,                              padding='same',                              activation='selu'))model.add(keras.layers.MaxPool2D(pool_size=2))model.add(keras.layers.Conv2D(filters=64, kernel_size=3,                              padding='same',                              activation='selu'))model.add(keras.layers.Conv2D(filters=64, kernel_size=3,                              padding='same',                              activation='selu'))model.add(keras.layers.MaxPool2D(pool_size=2))model.add(keras.layers.Conv2D(filters=128, kernel_size=3,                              padding='same',                              activation='selu'))model.add(keras.layers.Conv2D(filters=128, kernel_size=3,                              padding='same',                              activation='selu'))model.add(keras.layers.MaxPool2D(pool_size=2))model.add(keras.layers.Flatten())model.add(keras.layers.Dense(128, activation='selu'))model.add(keras.layers.Dense(10, activation="softmax"))model.compile(loss="sparse_categorical_crossentropy",# 损失函数              optimizer = "sgd",    # 优化器              metrics = ["accuracy"])   # 其他衡量指标
4,查看模型层级和参数
model.summary()
5,定义callback 并 训练模型
logdir = './cnn-relu-callbacks'if not os.path.exists(logdir):    os.mkdir(logdir)output_model_file = os.path.join(logdir,                                 "fashion_mnist_model.h5")callbacks = [    keras.callbacks.TensorBoard(logdir),    keras.callbacks.ModelCheckpoint(output_model_file,                                    save_best_only = True),    keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3),]history = model.fit(x_train_scaled, y_train,epochs=10,                    validation_data=(x_valid_scaled, y_valid),                    callbacks = callbacks)
6,打印训练曲线
def plot_learning_curves(history):    pd.DataFrame(history.history).plot(figsize=(8, 5))    plt.grid(True)    plt.gca().set_ylim(0, 1)    plt.show()plot_learning_curves(history)
7,打印估计器结果
print(model.evaluate(x_test_scaled, y_test, verbose = 0))

三,总结代码

1,总结代码-未做过拟合处理
#!/usr/bin/env python3# -*- coding: utf-8 -*-import matplotlib as mplimport matplotlib.pyplot as pltimport numpy as npimport sklearnimport pandas as pdimport osimport sysimport timeimport tensorflow as tffrom tensorflow import keras# 1,实现tensorflow动态按需分配GPUfrom tensorflow.compat.v1 import ConfigProtofrom tensorflow.compat.v1 import InteractiveSessionconfig = ConfigProto()config.gpu_options.allow_growth = Truesession = InteractiveSession(config=config)# 打印使用的python库的版本信息print(tf.__version__)print(sys.version_info)for module in mpl, np, pd, sklearn, tf, keras:    print(module.__name__, module.__version__)    # 2,从tf.keras.datasets中取数据fashion_mnist = keras.datasets.fashion_mnist(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()x_valid, x_train = x_train_all[:5000], x_train_all[5000:]y_valid, y_train = y_train_all[:5000], y_train_all[5000:]print(x_valid.shape, y_valid.shape)print(x_train.shape, y_train.shape)print(x_test.shape, y_test.shape)# 3,将数据整合为标准化数据from sklearn.preprocessing import StandardScalerscaler = StandardScaler()# 整合数据为1通道数据x_train_scaled = scaler.fit_transform(    x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)x_valid_scaled = scaler.transform(    x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)x_test_scaled = scaler.transform(    x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)# 4,构建CNN模型model = keras.models.Sequential()model.add(keras.layers.Conv2D(filters=32, kernel_size=3,# 32个神经元;卷积核尺寸为3                              padding='same',   # padding填充像素至与原来相同                              activation='selu',    # 或者使用relu激活函数                              input_shape=(28, 28, 1))) # 输入层为1通道28*28的图像model.add(keras.layers.Conv2D(filters=32, kernel_size=3,                              padding='same',                              activation='selu'))model.add(keras.layers.MaxPool2D(pool_size=2))model.add(keras.layers.Conv2D(filters=64, kernel_size=3,                              padding='same',                              activation='selu'))model.add(keras.layers.Conv2D(filters=64, kernel_size=3,                              padding='same',                              activation='selu'))model.add(keras.layers.MaxPool2D(pool_size=2))model.add(keras.layers.Conv2D(filters=128, kernel_size=3,                              padding='same',                              activation='selu'))model.add(keras.layers.Conv2D(filters=128, kernel_size=3,                              padding='same',                              activation='selu'))model.add(keras.layers.MaxPool2D(pool_size=2))model.add(keras.layers.Flatten())model.add(keras.layers.Dense(128, activation='selu'))model.add(keras.layers.Dense(10, activation="softmax"))model.compile(loss="sparse_categorical_crossentropy",# 损失函数              optimizer = "sgd",    # 优化器              metrics = ["accuracy"])   # 其他衡量指标# 5,查看模型层级和参数model.summary()# 6,定义callback 并 训练模型logdir = './cnn-relu-callbacks'if not os.path.exists(logdir):    os.mkdir(logdir)output_model_file = os.path.join(logdir,                                 "fashion_mnist_model.h5")callbacks = [    keras.callbacks.TensorBoard(logdir),    keras.callbacks.ModelCheckpoint(output_model_file,                                    save_best_only = True),    keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3),]history = model.fit(x_train_scaled, y_train,epochs=10,                    validation_data=(x_valid_scaled, y_valid),                    callbacks = callbacks)# 7,打印训练曲线def plot_learning_curves(history):    pd.DataFrame(history.history).plot(figsize=(8, 5))    plt.grid(True)    plt.gca().set_ylim(0, 1)    plt.show()plot_learning_curves(history)# 8,打印估计器结果print(model.evaluate(x_test_scaled, y_test, verbose = 0))# ---output------[0.3523516479730606, 0.9085]

训练曲线图如下:

我们从图中可以看到,训练过程中已经出现了过拟合的现象。
在这里插入图片描述

2,总结代码-过拟合处理

添加了如下改动:

  • set_seed - 使多次对比训练中,随机参数初始化为固定值。
  • L2正则化 - 解决过拟合问题
  • Dropout - 解决过拟合问题
#!/usr/bin/env python3# -*- coding: utf-8 -*-import matplotlib as mplimport matplotlib.pyplot as pltimport numpy as npimport sklearnimport pandas as pdimport osimport sysimport timeimport tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras import regularizersmy_seed = 666np.random.seed(my_seed)import random random.seed(my_seed)import tensorflow as tftf.random.set_seed(my_seed)# 1,实现tensorflow动态按需分配GPUfrom tensorflow.compat.v1 import ConfigProtofrom tensorflow.compat.v1 import InteractiveSessionconfig = ConfigProto()config.gpu_options.allow_growth = Truesession = InteractiveSession(config=config)# 打印使用的python库的版本信息print(tf.__version__)print(sys.version_info)for module in mpl, np, pd, sklearn, tf, keras:    print(module.__name__, module.__version__)    # 2,从tf.keras.datasets中取数据fashion_mnist = keras.datasets.fashion_mnist(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()x_valid, x_train = x_train_all[:5000], x_train_all[5000:]y_valid, y_train = y_train_all[:5000], y_train_all[5000:]print(x_valid.shape, y_valid.shape)print(x_train.shape, y_train.shape)print(x_test.shape, y_test.shape)# 3,将数据整合为标准化数据from sklearn.preprocessing import StandardScalerscaler = StandardScaler()# 整合数据为1通道数据x_train_scaled = scaler.fit_transform(    x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)x_valid_scaled = scaler.transform(    x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)x_test_scaled = scaler.transform(    x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)# 4,构建CNN模型model = keras.models.Sequential()model.add(keras.layers.Conv2D(filters=32, kernel_size=3,# 32个神经元;卷积核尺寸为3                              padding='same',   # padding填充像素至与原来相同                              activation='selu',    # 或者使用relu激活函数                              kernel_regularizer=regularizers.l2(0.01),                              input_shape=(28, 28, 1))) # 输入层为1通道28*28的图像model.add(keras.layers.Conv2D(filters=32, kernel_size=3,                              padding='same',                              kernel_regularizer=regularizers.l2(0.01),                              activation='selu'))model.add(keras.layers.MaxPool2D(pool_size=2))model.add(keras.layers.Conv2D(filters=64, kernel_size=3,                               padding='same',                               kernel_regularizer=regularizers.l2(0.01),                              activation='selu'))model.add(keras.layers.Conv2D(filters=64, kernel_size=3,                              padding='same',                               kernel_regularizer=regularizers.l2(0.01),                              activation='selu'))model.add(keras.layers.MaxPool2D(pool_size=2))model.add(keras.layers.Conv2D(filters=128, kernel_size=3,                              padding='same',                               kernel_regularizer=regularizers.l2(0.01),                              activation='selu'))model.add(keras.layers.Conv2D(filters=128, kernel_size=3,                              padding='same',                                kernel_regularizer=regularizers.l2(0.01),                              activation='selu'))model.add(keras.layers.MaxPool2D(pool_size=2))model.add(keras.layers.Flatten())model.add(keras.layers.Dense(128, activation='selu'))# model.add(keras.layers.AlphaDropout(rate=0.5))  # 可以比对训练结果决定是否需要加Dropoutmodel.add(keras.layers.Dense(10, activation="softmax"))model.compile(loss="sparse_categorical_crossentropy",# 损失函数              optimizer = "sgd",    # 优化器              metrics = ["accuracy"])   # 其他衡量指标s# 5,查看模型层级和参数model.summary()# 6,定义callback 并 训练模型logdir = './cnn-relu-callbacks'if not os.path.exists(logdir):    os.mkdir(logdir)output_model_file = os.path.join(logdir,                                 "fashion_mnist_model.h5")callbacks = [    keras.callbacks.TensorBoard(logdir),    keras.callbacks.ModelCheckpoint(output_model_file,                                    save_best_only = True),    keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3),]history = model.fit(x_train_scaled, y_train,epochs=30,                    validation_data=(x_valid_scaled, y_valid),                    callbacks = callbacks)# 7,打印训练曲线def plot_learning_curves(history):    pd.DataFrame(history.history).plot(figsize=(8, 5))    plt.grid(True)    plt.gca().set_ylim(0, 1)    plt.show()plot_learning_curves(history)# 8,打印估计器结果print(model.evaluate(x_test_scaled, y_test, verbose = 0))# ---output-------[0.3523516479730606, 0.9085]

在这里插入图片描述

转载地址:http://vvili.baihongyu.com/

你可能感兴趣的文章
JAX-RS(java restful实现讲解)(转)
查看>>
Spring MVC与JAX-RS比较与分析
查看>>
openstack官方docker介绍
查看>>
头痛与早餐
查看>>
[转]在ASP.NET 2.0中操作数据::创建一个数据访问层
查看>>
Linux命令之chmod详解
查看>>
【java小程序实战】小程序注销功能实现
查看>>
Java中子类能否继承父类的私有属性和方法
查看>>
JVM内存模型详解
查看>>
(六) Git--标签管理
查看>>
建造者模式(Builder)-设计模式(三)
查看>>
Linux-网络运维基础
查看>>
Verilog编程网站学习——门电路、组合电路、时序电路
查看>>
android——学生信息显示和添加
查看>>
Android——ImageSwitcher轮流显示动画
查看>>
Android——利用手机端的文件存储和SQLite实现一个拍照图片管理系统
查看>>
图像调优1:清晰度相关参数MTF,SFR,MTF50,MTF50P 以及TVL的概念以及换算说明
查看>>
罗永浩欲直播带货,京东说可以帮忙联系
查看>>
B站,正在变成下一个“公众号”?
查看>>
小米启动安心服务月 手机家电产品可免费清洁保养
查看>>