说明:这篇文章来自 2020-2021 年的 WordPress 备份。原始图片附件未随 XML 一起保存,旧服务器图片地址也已失效,因此这里保留正文并移除了失效图片。

一 神经网络搭建八股

用Tensorflow API:tf.keras搭建网络八股

六步法

  1. import 导入相关模块
  2. train, test 指定训练集和测试集
  3. model = tf.keras.models.Squential 搭建网络结构,逐层描述每层网络,相当于前向传播
  4. model.compile 配置训练方法,告知训练时选择哪种优化器、损失函数、评测指标
  5. model.fit 执行训练过程
  6. 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 tf

mnist = 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