本文共 12224 字,大约阅读时间需要 40 分钟。
本文将介绍:
关于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__)
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)
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)
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"]) # 其他衡量指标
model.summary()
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)
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)
print(model.evaluate(x_test_scaled, y_test, verbose = 0))
#!/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]
训练曲线图如下:
我们从图中可以看到,训练过程中已经出现了过拟合的现象。添加了如下改动:
#!/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/