北大MOOC——TF2.0笔记
以下是我的听课笔记,供以后回忆(大多内容来自ppt)
六步法
import :引入相关模块train, test:告知要喂如网络的训练集和测试集是什么,要指定训练集以及测试集的的输入特征和标签
model = tf.keras.models.Sequential :在Sequential中搭建网络结构,逐层描述每层网络(=一次前向传播)
model.compile :在compile()中配置训练方法,训练时使用哪种优化器,哪个损失函数,哪种评测指标
model.fit :在fit 中执行训练过程,告知训练集和测试集的输入特征和标签,每个batch是多少,要迭代epoch多少次数据集
model.summary:使用summary()打印出网络的结构和参数统计
以上六步操作就是写代码的提纲。
可以将其看作是一个容器,要描述从输入层到输出层每一层的网络结构。
每层的网络结构可以是 :
拉直层 :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()
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=0.9, beta_2=0.999)
loss可选:
‘mse’or tf.keras.losses.MeanSquaredError() ‘sparse_categorical_crossentropy’ortf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
#有些神经网络的输出是经过softmax等函数的概率分布则from_logits=False,若不经过概率分布直接输出则from_logits=Ture
#若是十分类,预测概率是10分之一,则可能是from_logits参数设置错误
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]
以后都是以数值形式给出标签,以概率分布形式表示输出,则常用 ‘sparse_categorical_accuracy’
model.fit (训练集的输入特征, 训练集的标签, batch_size= , epochs= , validation_data=(测试集的输入特征,测试集的标签), validation_split=从训练集划分多少比例给测试集, validation_freq= 多少次epoch后,使用一次测试集)
import tensorflow as tf
from sklearn import datasets
import numpy as np
#训练集的输入特征和标签
x_train = datasets.load_iris().data
y_train = datasets.load_iris().target
#测试集的输入特征和标签也可以在此处给定,或者在fit中指定validation_split=0.2给出比例,选择从训练集中划分
np.random.seed(116)
np.random.shuffle(x_train)
np.random.seed(116)
np.random.shuffle(y_train)
tf.random.set_seed(116)
#tf.keras.models.Sequential搭建网络结构
#此处的3代表神经元的个数,(神经元个数,激活函数,正则化方法)
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())])
#model.compile配置训练方法
#(优化器,损失函数,评测指标)
#由于神经网络末端使用了激活函数softmax,使得输出是概率分布不是原始输出,所以此处的from_logits=False
#由于输入是数值,输出是概率分布则使用'sparse_categorical_accuracy'作为评测指标
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
#model.fit执行训练过程
#执行训练过程(训练集输入特征,训练集标签,训练时一次喂入网络的数据个数batch,训练集迭代次数epochs,
# 从训练集中选取测试集的比例 validation_split,每迭代20次数据集验证一次正确率alidation_freq=20)
model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)
model.summary() #打印网络,参数
输出:
类class可搭建非顺序神经网络与顺序神经网络,我们现在所见到的都是顺序神经网络。
顺序网络:每层都只有一个前驱和后继,即上层的输出,是此层的输入,此层的输出,是下次的输入数据。
非顺序神经网络:在某些情况下,会合并多个输入,产生一个输出。