神经网络八股
本讲目标:使用八股搭建神经网络
- 神经网络搭建八股
- iris 代码复现
- MNIST数据集
- Fashion数据集
1、搭建神经网络八股sequential
用TensorFlow API:tf.keras搭建网络八股
六步法:
- 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()打印出网络的结构和参数统计)
以上六步是以后写代码的提纲。
Sequential()
model = tf.keras.models.Sequential([网络结构]) # 描述各层网络
Sequential() 可以认为是个容器,这个容器里封装了一个神经网络结构。
在Sequential()中要描述从输入层到输出层每一层的网络结构,每一层的网络结构可以是以下几种:
- 拉直层:
tf.keras.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(fliters = 卷积核个数, kernel_size = 卷积核尺寸, strides = 卷积步长, padding = "valid" or "same")
- LSTM层(循环神经网络):
tf.keras.layers.LSTM()
compile()
model.compile(optimizer = 优化器, loss = 损失函数, metrics = ["准确率"])
optimizer可选:
- ‘sgd’ 或
tf.keras.optimizers.SGD(lr = 学习率, momentum = 动量参数)
- ‘adagrad’ 或
tf.keras.optimizers.Adagrad(lr = 学习率)
- ‘adadelta’ 或
tf.keras.optimizers.Adadelta(lr = 学习率)
- ‘adam’ 或
tf.keras.optimizers.Adam(lr = 学习率, beta_1 = 0.9, beta_2 = 0.999)
loss可选:
- ‘mse’ 或
tf.keras.losses.MeanSquaredError()
- ‘sparse_categorical_crossentropy’ 或
tf.keras.losses.SparseCategoricalCrossentropy(from_logits = False)
有些神经网络的输出经过了softmax等函数的概率分布,有些则不经概率分布直接输出。可以认为from_logits在询问输出是否是原始数据。如果神经网络预测结果输出前经过概率分布,则为false,否则是true。
Metrics可选(告知网络评测指标):
fit()
model.fit(训练集的输入特征, 训练集的标签, batch_size = , epochs = ,
validation_data =(测试集的输入特征, 测试集的标签),
validation_split = 从训练集划分多少比例给测试集,
validation_freq = 多少次epoch测试一次)
summary()
可以打印出网格的结构和参数统计
改写鸢尾花的代码
import tensorflow as tf
from sklearn import datasets
import numpy as np
# train, test
# test可以选择在这里指定,也可以在fit函数中指定
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'