深度学习-Tensorflow使用Keras进行模型训练

本文介绍了如何利用tf.keras在tensorflow2中构建和训练神经网络模型,以fashionMNIST数据集解决分类问题,以及使用加州房价数据集进行回归问题的建模。重点讲述了数据预处理、SequentialAPI、模型编译、训练、评估和保存的过程。
摘要由CSDN通过智能技术生成

tf.keras 是 tensorflow2 引入的高封装度的框架,可以用于快速搭建神经网络模型,keras 为支持快速实验而生,能够把想法迅速转换为结果,是深度学习框架之中最终易上手的一个,它提供了一致而简洁的 API,能够极大地减少一般 应用下的工作量,提高代码地封装程度和复用性

本文以FasionMNIST/加州房价数据集为例,介绍KerasAPI进行分类问题/回归问题模型训练的方法

Tensorflow版本

Tensorflow和keara都需要2.0及以上版本

import tensorflow as tf
from tensorflow import keras
print(tf.__version__)
print(keras.__version__)

分类MLP构建

数据集

fashion MNIST dataset,数据集有60000张衣服鞋子的图片,大小为28X28。

Keras可以通过keras.datasets方法来下载主流的数据集,fashion MNIST dataset已经区分了训练集(50000张)和测试集(10000张), 但最好从训练集中划出一部分作为验证集(Validation set)

import tensorflow as tf
from tensorflow import keras
fashion_mnist = keras.datasets.fashion_mnist
(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()

# 由于数据是最大值为255的灰度图像,除于255进行归一化
X_valid, X_train = X_train_full[:5000] / 255., X_train_full[5000:] / 255.
y_valid, y_train = y_train_full[:5000], y_train_full[5000:]
X_test = X_test / 255.

模型训练

定义网络层

Sequential API方法

Sequential网络层定义有两种方法,一种是add layers方法,有点笨拙

model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28, 28]))
model.add(keras.layers.Dense(300, activation="relu"))
model.add(keras.layers.Dense(100, activation="relu"))
model.add(keras.layers.Dense(10, activation="softmax"))

另外一种整体括号内定义网络层,推荐这种方法

model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28, 28]),
    keras.layers.Dense(300, activation="relu"),
    keras.layers.Dense(100, activation="relu"),
    keras.layers.Dense(10, activation="softmax")
])

解释:

  1. Sequential是Keras最简单的网络结构定义方式,按照从上到下(代码文本)将单层的网络连接起来

  1. Flatten称为“拉直层”,作用是将28X28的数组转化为1D的格式

  1. 第3/4行分别定义了两个全联接层(隐藏层),大小为300/100个神经元,激活函数为relu,其格式通常为:

tf.keras.layers.Dense( 神经元个数,
                       activation=”激活函数”, kernel_regularizer=”正则化方式”)    
  1. 第5行定义输出层,由于是多分类问题,使用了“softmax”作为激活函数。

  • 使用model_summary()可以查看模型的结构

  • 使用model.get_layer(), layer.get_weight()可以查看模型的参数

定义损失函数、优化器等

model.compile(loss="sparse_categorical_crossentropy",
              optimizer="sgd",
              metrics=["accuracy"])

Metrics选择:

  • ‘accuracy’:y_和 y 都是数值,如 y_=[1] y=[1]

  • ‘categorical_accuracy’:y_和 y 都是以独热码和概率分布表示。如y_=[0, 1, 0], y=[0.256, 0.695, 0.048]。

  • ‘sparse_ categorical_accuracy’:y_是以数值形式给出,y 是以独热码形式 给出。如 y_=[1],y=[0.256, 0.695, 0.048]。

模型训练

和sk-learn一样调用fit()方法

history = model.fit(X_train, y_train, epochs=30,
                    validation_data=(X_valid, y_valid))

'''
model.fit(训练集的输入特征, 训练集的标签, batch_size, epochs, 
            validation_data = (测试集的输入特征,测试集的标签),
            validataion_split = 从测试集划分多少比例给训练集,
            validation_freq = 测试的 epoch 间隔次数)
'''

可以方便的运用history数据进行训练过程的可视化

import pandas as pd
pd.DataFrame(history.history).plot(figsize=(8, 5))
plt.grid(True)
plt.gca().set_ylim(0, 1)

测试集评估

model.evaluate(X_test, y_test)

模型保存

测试集上能达到要求就可以进行模型保存了,也可以将其部署到生产环境。

# kears模型的格式为h5
model.save("my_keras_FasionMNist_model.h5")

模型预测

# 载入模型
model = keras.models.load_model("my_keras_FasionMNist_model.h5")

X_new = X_test[:1] # 以一个样本为例子,输入是28X28的数组
y_proba = model.predict(X_new) # 由于是10分类问题,softmax输出结果是一个在10分类上概率和为1的10维数组
y_proba.round(2)

y_pred = np.argmax(model.predict(X_new), axis=-1)# 求概率和最大,axis=-1为在每个10维度数组内求
y_pred

回归MLP构建

以加州房价预测数据集为例,模型开发和分类问题类似,就不分模块一一介绍了。

主要区别:

  1. 由于输出房价是1维数据,只需要一个神经元,且训练label也是房价,因此不需要激活函数

  1. loss function为MSE

  1. 由于数据集比较简单,为防止过拟合,仅适用一个hidden layer,且神经元的个数设置为更低的值

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# load数据集
housing = fetch_california_housing()

X_train_full, X_test, y_train_full, y_test = train_test_split(housing.data, housing.target, random_state=42)
X_train, X_valid, y_train, y_valid = train_test_split(X_train_full, y_train_full, random_state=42)

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_valid = scaler.transform(X_valid)
X_test = scaler.transform(X_test)

# 模型定义和训练
model = keras.models.Sequential([
    keras.layers.Dense(30, activation="relu", input_shape=X_train.shape[1:]),
    keras.layers.Dense(1)
])
model.compile(loss="mean_squared_error", optimizer=keras.optimizers.SGD(lr=1e-3))
history = model.fit(X_train, y_train, epochs=20, validation_data=(X_valid, y_valid))

#模型训练epoch过程MSE可视化
plt.plot(pd.DataFrame(history.history))
plt.grid(True)
plt.gca().set_ylim(0, 1)
plt.show()

mse_test = model.evaluate(X_test, y_test)

X_new = X_test[:3]
y_pred = model.predict(X_new)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值