【tensorflow】tf.keras + 神经网络类class 6 步搭建神经网络
tf.keras + Sequential() 可以搭建出上层输入就是下层输出的顺序网络结构,但是无法写出一些带有跳连的非顺序网络结构。
这时候可以选择用类 class 搭建神经网络结构,即使用 class 类封装一个网络结构:
...
class MyModel(Model):
def __init__(self):
super(MyModel, self).__init__()
定义网络结构块
def call(self, x):
调用网络结构块,实现前向传播
return y
model = MyModel()
...
可以认为 __init__() 函数准备出了搭建网络所需的各种积木,call() 函数调用积木完成了神经网络的搭建,即实现前向传播,从输入x到输出y。
六步:
- import 相关模块。
- 指定要喂入网络的训练集和测试集。
- class MyModel(Model) model = MyModel()
- 在 compile() 中配置训练方法。
- 在 fit() 中执行训练过程。
- 用 summary() 打印出网络的结构和参数统计。
代码:
import tensorflow as tf from tensorflow.keras.layers import Dense from tensorflow.keras import Model from sklearn import datasets import numpy as np # 读取训练用的输入特征和标签 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) # 定义神经网络类 class IrisModel(Model): def __init__(self): super(IrisModel, self).__init__() # 定义第一层网络结构:含有三个神经元的全连接层 self.d1 = Dense(3, activation="softmax", kernel_regularizer=tf.keras.regularizers.l2()) def call(self, x): # 调用网络结构,实现前向传播 y = self.d1(x) return y # 声明神经网络模型对象 model = IrisModel() # 配置训练方法 model.compile(optimizer=tf.optimizers.SGD(lr=0.1), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=[tf.keras.metrics.sparse_categorical_accuracy]) # 执行训练过程 model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20) # 打印网络的结构和参数 model.summary()