文章目录
- 一、六步法搭建顺序神经网络(Sequential)
- 1、步骤
- 2、相关介绍
- (1)Sequential
- (2)compile
- (3)fit
- (4)summary
- 3、代码
- 二、六步法搭建非顺序神经网络(class)
- 1、步骤
- 2、class MyModel(Model) model = MyModel定义方式
- 3、代码
- 三、MNIST例子
- 1、mnist_datasets
- 2、mnist_Sequential
tf.keras是Tensorflow的API(应用程序接口),可以快速搭建神经网络模型。
一、六步法搭建顺序神经网络(Sequential)
1、步骤
- import相关模块
- train,test:告知要喂入网络的训练集和测试集是什么,指定训练集的输入特征x_train和训练集的标签y_train,还可以指定测试集的输入特征x_test和测试集的标签y_test
- model=tf.keras.models.Sequential:在Sequential()中搭建网络结构,逐层描述网络,相当于走一遍前向传播
- model.compile:在compile()中配置训练方法,告知训练时选择哪种优化器、损失函数、评测指标
- model.fit:在fit()中执行训练过程,告知训练集和测试集的输入特征和标签,告知每个batch是多少,告知要迭代多少次训练集
- model.summary:用summary()打印出网络的结构和参数统计
2、相关介绍
(1)Sequential
1)描述各层网络
model = tf.keras.models.Sequential([网络结构])
2)网络结构举例
拉直层
tf.keras.layers.Flatten()
全连接层
tf.keras.layers.Dense(神经元个数,activation="激活函数",kernel_regularizer=哪种正则化)
# activation(字符串给出)可选:relu、softmax、sigmoid、tanh
# kernel_regularizer可选:tf.keras.regularizers.l1()、tf.keras.regularizers.l2()
卷积层
tf.keras.layers.Conv2D(filters=卷积核个数,kernel_size=卷积核尺寸,strides=卷积步长,padding="valid"or"same")
LSTM层
tf.keras.layers.LSTM()
(2)compile
model.compile(optimizer=优化器,loss=损失函数,metrics=["准确率"])
optimizer可选:
'sgd' or tf.keras.optimizers.SGD(lr=学习率,momentum=动量参数)
'adagrad' or tf.keras.optimizers.Adagrad(lr=学习率)
'adadelta' or tf.keras.optimizers.Adadelta(lr=学习率)
'adam' or tf.keras.optimizers.Adam(lr=学习率,beta_1=O.9,beta_2=0.999)
loss可选:
'mse' or tf.keras.losses.MeanSquaredError()
'sparse_categorical_crossentropy' or tf.keras,losses.SparseCategoricalCrossentropy(from_logits=False)
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]
(3)fit
model.fit(训练集的输入特征,训练集的标签,batch_size= ,epoch= ,validation_data=(测试集的输入特征,测试集的标签),validation_split=从训练集划分多少比例给测试集,validation_freq=多少次epoch测试一次)
(4)summary
model.summary()
3、代码
# import相关模块
import tensorflow as tf
from sklearn import datasets
import numpy as np
# 交代训练集的输入特征x_train和标签y_train
x_train = datasets.load_iris().data
y_train = datasets.load_iris().target
# 实现了数据集的乱序
# seed是随机种子,保证每次循环生成的随机数是一样的,输入特征和标签一一对应
np.random.seed(116)
np.random.shuffle(x_train)
np.random.seed(116)
np.random.shuffle(y_train)
tf.random.set_seed(116)
# Sequential搭建网络结构
# 参数分别为:神经元个数3,选用的激活函数softmax,选用的正则化方法l2
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
])
# compile配置训练方法
# 参数分别为:
# SGD优化器,学习率0.1
# 损失函数 SparseCategoricalCrossentropy
# from_logits是False:因为神经网络末端选用了softmax函数,使得输出是概率分布而不是原始输出
# sparse_categorical_accuracy作为评测指标:因为鸢尾花数据集给的标签是0 1 2,神经网络前向传播的输出是概率分布
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
# fit执行训练过程
# 参数分别为:
# x_train:训练集输入特征
# y_train:训练集标签
# batch_size:训练时一次喂入神经网络多少组数据
# epochs:训练集迭代循环多少次
# validation_split:告知从训练集中选择20%的数据作为测试集
# validation_freq:每迭代20次训练集,要在测试集中验证一次准确率
model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)
# summary打印网络结构和参数统计
model.summary()
二、六步法搭建非顺序神经网络(class)
1、步骤
- import相关模块
- train,test:告知要喂入网络的训练集和测试集是什么,指定训练集的输入特征x_train和训练集的标签y_train,还可以指定测试集的输入特征x_test和测试集的标签y_test
- class MyModel(Model) model = MyModel
- model.compile:在compile()中配置训练方法,告知训练时选择哪种优化器、损失函数、评测指标
- model.fit:在fit()中执行训练过程,告知训练集和测试集的输入特征和标签,告知每个batch是多少,告知要迭代多少次训练集
- model.summary:用summary()打印出网络的结构和参数统计
2、class MyModel(Model) model = MyModel定义方式
可以理解为__init__函数准备出搭建网络需要的各种积木,call函数调用__init__中搭建好的积木
init() 定义所需网络结构块
call() 写出前向传播
class MyModel(Model):
def__init__(self):
super(MyModel,self).__init__()
定义网络结构块
def call(self,x):
调用网络结构块,实现前向传播
return y
model = MyModel()
3、代码
# import相关模块
import tensorflow as tf
# 添加了model模块
from tensorflow.keras.layers import Dense
from tensorflow.keras import Model
from sklearn import datasets
import numpy as np
# 交代训练集的输入特征x_train和标签y_train
x_train = datasets.load_iris().data
y_train = datasets.load_iris().target
# 实现了数据集的乱序
np.random.seed(116)
np.random.shuffle(x_train)
np.random.seed(116)
np.random.shuffle(y_train)
tf.random.set_seed(116)
# 搭建网络结构
# 定义了IrisModel类
class IrisModel(Model):
def __init__(self):
super(IrisModel, self).__init__()
# 定义了要在call函数中调用的,具有三个神经元的全连接网络Dense
self.d1 = Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
def call(self, x):
# 调用self.d1实现了从输入x到输出y的前向传播
y = self.d1(x)
return y
# 实例化model
model = IrisModel()
# compile配置训练方法
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
# fit执行训练过程
model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)
# summary打印网络结构和参数统计
model.summary()
三、MNIST例子
1、mnist_datasets
import tensorflow as tf
from matplotlib import pyplot as plt
# 导入mnist数据集
mnist = tf.keras.datasets.mnist
# 使用load_data从数据集中读取训练集和测试集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 可视化训练集输入特征的第一个元素
plt.imshow(x_train[0], cmap='gray') # 绘制灰度图
plt.show()
# 打印出训练集输入特征的第一个元素
print("x_train[0]:\n", x_train[0])
# 打印出训练集标签的第一个元素
print("y_train[0]:\n", y_train[0])
# 打印出整个训练集输入特征形状:60000张图片,每张图片是28*28
print("x_train.shape:\n", x_train.shape)
# 打印出整个训练集标签的形状
print("y_train.shape:\n", y_train.shape)
# 打印出整个测试集输入特征的形状
print("x_test.shape:\n", x_test.shape)
# 打印出整个测试集标签的形状
print("y_test.shape:\n", y_test.shape)
结果
2、mnist_Sequential
import tensorflow as tf
# 导入mnist数据集
mnist = tf.keras.datasets.mnist
# 使用load_data从数据集中读取训练集和测试集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 输入特征归一化,使像素值集中在0到1之间
x_train, x_test = x_train / 255.0, x_test / 255.0
# 搭建网络结构
# 作为输入特征,输入神经网络时,将数据拉伸为一维数组
# 第一层网络128个神经元,激活函数relu
# 第二层网络10个神经元,激活函数softmax
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# 配置训练方法
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
# 执行训练过程
model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
# 打印出网络结构和参数统计
model.summary()