3 keras搭建神经网络
3.1 神经网络搭建八股
- import
- train data, test data
- model = tf.keras.models.Sequential
- model.compile 设置优化器,损失函数,评价指标
- model.fit 设置训练过程,输入输出 epoch,batch
- 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()
|