用Tensorflow API:tf.keras搭建八股
六步法
1.import相关模块
2.给出训练集和测试集的相关特征
3.models.Sequential 搭建网络结构 逐层描述每层网络(或使用class定义)
4.model.compile 配置训练方法(选择优化器、损失函数、评测指标等)
5.model.fit 执行训练过程 (输入:训练集和测试集的输入特征和标签、batch、epoch)
6.model.summary 打印网络结构和参数统计
Sequential()
model = tf.keras.models.Sequential([ 网络结构 ])
#描述各层网络 Sequential可以理解为一个容器
拉直层:
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()
若网络结构比较复杂,则可以使用class类定义model(不复杂也可以hhh)
类包含__init__和call函数,其中__init__() 定义所需网络结构块,call() 写出向前传播
代码示例
from tensorflow.keras.layers import Dense
from tensorflow.keras import Model
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()
compile()
model.compile(optimizer = 优化器, loss = 损失函数, metrics =[“准确率”])
Optimizer可选:
'sgd' or tf.keras.optimizers.SGD(Ir=学习率,momentum=动量参数)
'adagrad' or tf.keras.optimizers.Adagrad (lr=学习率)
'adadelta' or tfkeras.optimizers.Adadelta (lr=学习率)
'adam' or tf.keras.optimizers.Adam (r=学习率, beta_1=0.9, beta_2=0.999)
loss可选:
'mse' or tf.keras.losses.MeanSquaredError()
'sparse_categorical_crossentropy' or tf.keras.losses.SparseCategoricalCrossentropy(from_logits = False) # from_logits: 是否经过了概率分布转化
Metrics可选:
'accuracy': y_和y都是数值
'categorical accuracy' : y_和y都是独热码(概率分布)
'sparse_categorical_accuracy': y_是数值, y是独热码(概率分布)
fit()
model.fit (训练集的输入特征, 训练集的标签, batch_size= ,epochs= ,
validation_data=(测试集的输入特征,测试集的标签),
validation_split=从训练集划分多少比例给测试集,
validation_freq = 多少次epoch使用测试集验证一次结果)
#validation_data 和 validation_split 二选一
代码示例
import tensorflow as tf
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)
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
])
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)
model.summary()