watch: TF2 - PKU 03 | NN Building Steps

3 keras搭建神经网络

3.1 神经网络搭建八股

  1. import
  2. train data, test data
  3. model = tf.keras.models.Sequential
  4. model.compile 设置优化器,损失函数,评价指标
  5. model.fit 设置训练过程,输入输出 epoch,batch
  6. model.summary 打印网络结构和参数统计

model = tf.keras.models.Sequential([网络结构]) # 描述各层网络

网络结构举例:

拉直层:tf.keras.layers.Flatten() 把输入特征变成一维数组

全连接层:tf.keras.layers.Dense(神经元个数,activation="激活函数",kernel_regularizer=哪种正则化) 。激活函数可选:‘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’ 或 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’ or tf.keras.losses.MeanSquaredError()
  • ‘sparse_categorical_crossentropy’ or tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False) , from_logits 为True表示没经过softmax,是网络的直接结果

Metrics 可选:

  • ‘accuracy’:y_ 和 y 都是数值,类别是数字,如 y_=[1], y=[1]
  • ‘categorical_accuracy’,target是独热码,pred是概率分布,如 y_=[0,1,0], y=[0.256, 0.695, 0.048]
  • ‘sparse_categorical_accuracy’: target是数值,pred是独热码 (概率分布),如 y_ = [1], y=[0.256, 0.695, 0.048]

model.fit(训练集的输入特征,训练集的标签,batch_size= , epoches= , validation_data=(测试集的输入特征,测试集的标签)【或用 validation_split=从训练集划分多少比例给测试集】,validation_freq=多少次epoch测试一次)

3.2 Iris 代码用keras重写

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import tensorflow as tf
from sklearn import datasets
import numpy as np

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', kernel_regularize=tf.keras.regularizers.l2())
])

# 配置训练方法
model.compile(optimizer = tf.keras.optimizers.SGD(lr=0.1),
             loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
             metrics=['sparse_categorical_accuracy'])

# 训练过程
model.fit(x_train, y_train, batch_size=32, epoches=500, validataion_split=0.2, validation_freq=20) # 训练集的20%做测试集

model.summary()

Sequential 搭建上层输出就是下层输入的顺序网络结构,但无法写出带有跳连接的非顺序网络结构,

继承Model类 自定义:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from tensorflow.keras.layers import Dense
from tensorflow.keras import Model

class MyModel(Model):
    def __init__(self):
        super(MyModel, self).__init__()
        #定义网络结构块
        self.d1 = Dense(3, activation='sigmoid')
    def call(self, x):
        #调用网络结构块,实现前向传播
        y = self.d1(x)
        return y

model = MyModel()

MNIST 数据集

总共7万张图片,6万的训练集,1万作为测试集

使用Sequential

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import tensorflow as tf
from matplotlib import pyplot as plt

# 读取MNIST数据集
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	# 输入数值变小更适合神经网络

model = tf.keras.models.Sequential([
    # 将输入样本拉直为一维向量,784个像素点的灰度值
	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=(x_test, y_test), validation_freq=1)

model.summary()

使用 Model类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras import Model

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

class MyModel(Model):
    def __init__(self):
        super(MyModel, 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 = MyModel()
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=(x_test, y_test), validation_freq=1)
model.summary()

FASHION 数据集

1
2
fashion = tf.keras.datasets.fashion_mnist
(x_train, y_train), (x_test,y_test) = fashion.load_data()