说明:这篇文章来自 2020-2021 年的 WordPress 备份。原始图片附件未随 XML 一起保存,旧服务器图片地址也已失效,因此这里保留正文并移除了失效图片。
一 神经网络搭建八股
用Tensorflow API:tf.keras搭建网络八股
六步法
- import 导入相关模块
- train, test 指定训练集和测试集
- model = tf.keras.models.Squential 搭建网络结构,逐层描述每层网络,相当于前向传播
- model.compile 配置训练方法,告知训练时选择哪种优化器、损失函数、评测指标
- model.fit 执行训练过程
- model.summary 打印网络的结构和参数统计
Squential
Squential可以认为是个容器,其中封装了一个神经网络结构,要描述从输入层到输出层每一层的网络结构
- 网络结构举例:
拉直层:tf.keras.layers.Flatten()
全连接层:tf.keras.layers.Dense(神经元个数,activation = "激活函数", kernel_regularizer = 哪种正则化) 激活函数和正则化方法见上一节
卷积层:tf.keras.layers.Conv2D(filters = 卷积核个数, kernel_size = 卷积核尺寸, strides = 卷积步长, padding = "valid" or "same")
LSTM层:tf.keras.layers.LSTM()
compile
model.compile(optimizer = 优化器, loss = 损失函数, metrics = ["准确率"]) 其中参数可以选择上一节介绍的名字,例如优化器的"sgd"、"adagrad"等,也可以使用函数形式,比如tf.keras.optimizers.SGD(lr = 学习率, momentum = 动量参数),使用函数的形式可以设定学习率、动量等超参数,具体的:
- 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’ or tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
- 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],其中from_logits参数表示神经网络预测结果输出前是否经过概率分布,有 = False, 没有 = True
fit
model.fit(训练集的输入特征, 训练集的标签, batch_size= , epochs= , validation_data = (测试集的输入特征, 测试集的标签), validation_split = 从训练集划出多少比例给测试集, validation_freq = 多少次epoch测试一次 )
class MyModel
Squential可以搭出顺序网络结构,无法写出一些带有跳连的非顺序网络结构,这时可以选择用类class搭建神经网络结构 class MyModel(Model) model = MyModel
二 iris代码复现
Squential
# 1 import import tensorflow as tf from sklearn import datasets import numpy as np # 2 train test 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) # 3 models.Squential model = tf.keras.models.Sequential([ tf.keras.layers.Dense(3, activation='softmax', ker nel_regularizer=tf.keras.regularizers.l2()) ]) # 4 model.compile model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['sparse_categorical_accuracy']) # 5 model.fit model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20) # 6 model.summary model.summary()
### class 非顺序网络结构时 将上面的代码中的Squential部分改为class ```python #class MyModel class IrisModel(Model): def __init__(self): #如果想在进行子类的初始化的同时也继承父类的__init__(), 就需要在子类中显示地通过super()来调用父类的__init__()函数。 super(IrisModel, self).__init__() #super()是用于调用父类(超类)的一个方法 self.d1 = Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())def call(self, x): y = self.d1(x) return y
model = IrisModel()
三 MNIST数据集
MNIST数据集一共有7万张图片,都是28*28像素的手写数字图片,6万用于训练,1万用于测试。
- 导入MNIST数据集:
mnist = tf.keras.datasets.mnist(x_train, y_train), (x_test, y_test) = mnist.load_data() - 作为输入特征,输入神经网络时,要先将数据拉伸为一维数组(784个像素点)
tf.keras.layers.Flatten()
四 训练MNIST数据集
Squential代码如下:
import tensorflow as tfmnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 #归一化,使数据变为0-1之间的数值,更适合神经网络吸收
model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation=‘relu’), tf.keras.layers.Dense(10, activation=‘softmax’) ])
model.compile(optimizer=‘adam’, loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=[‘sparse_categorical_accuracy’])
model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1) model.summary()
class方法
将squential部分改写成class:
class MnistModel(Model): def __init__(self): super(MnistModel, self).__init__() self.flatten = Flatten() self.d1 = Dense(128, activation='relu') self.d2 = Dense(10, activation='softmax')def call(self, x): x = self.flatten(x) x = self.d1(x) y = self.d2(x) return y
model = MnistModel()
五 Fashion数据集
Fashion数据集数据集一共有7万张图片,都是28*28像素的灰度值数据,6万用于训练,1万用于测试。一共有是十个分类
训练方法同上mnist