Tensorflow2.1入门 第三章:使用“八股”搭建神经网络
一、tf.keras搭建网络八股
1. 六步法
- import:导入相关模块。
- train, test:导入训练集、测试集的特征及标签。
- model=tf.keras.models.Sequential:在Sequential中逐层描述网络,相当于走一遍前向传播。
- model.compile:配置训练方法(优化器、损失函数、训练指标)。
- model.fit:执行训练过程。
- model.summary:打印出网络结构和参数统计。
2. Sequential方法
models = tf.keras.models.Sequential([网络结构]) # 描述各层网络
网络结构:
-
拉直层:
tf.keras.layers.Flatten()
本身不含计算,仅能改变形状,将数据变为一位数组(拉直)。 -
全连接层:
tf.keras.layers.Dense(神经元个数,activation="激活函数",kernel_regularizer=正则化方式)
activation(字符串给出)可选:relu、softmax、sigmoid、tanh
kernel_regularizer可选:tf.keras.regularizer.l1()、tf.keras.regularizer.l2()
''' 课程内方法'''
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
])
'''之前学到的方法'''
model = tf.keras.Sequential(name="MnistSequential")
model.add(layers.Dense(128, activation="relu", input_shape=(784,), name="inputs_layer"))
model.add(layers.Dense(64, activation="relu", name="mid_layer"))
model.add(layers.Dense(10, activation="softmax", name="outputs_layer")) # 搭建完三层的神经网络
p8_iris_sequential.py
3. Class方法
class MyModel(Model): #继承了Tensorflow中的Model类
def __init__(self):
super(MyModel, self).__init__()
定义网络结构块
def call(self, x):
调用网络结构块,实现前向传播
return y
model = MyModel()
使用class类封装一个神经网络结构。
import tensorflow as tf
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()
p11_iris_class.py
4. 配置训练方法
model.compile(optimizer=优化器,loss=损失函数,metrics=["准确率"])
(1)优化器
- ‘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)
建议初学时先使用字符串,之后再通过tensorflow官网查看函数,来调节超参数。
(2)损失函数
- ‘mse’ 或者 tf.keras.losses.MeanSquaredError()
- ‘sparse_categorical_crossentropy’ 或者 tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
from_logits参数是在询问是否是原始输入(还是经过softmax变成概率分布的输出),若经过概率分布是False,否则是True。
(3)评判标准
- ‘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]
在callback中想要保存最佳模型,好像只能在评判标准初选择’acc’,然后callback的monitor选择’val_acc’?
二、Mnist:手写数字训练集
进行归一化:把输入特征的数值变小更适合神经网络吸收。
p13_mnist_datasets.py
p14_mnist_sequential.py
p15_mnist_class.py’
似乎不需要声明输入维数??
三、Fashion:衣裤图片训练集
p16_fashion_class.py
p16_fashion_sequential.py