keras模型构建中介绍,通过Sequential类可快速堆叠出一个神经网络模型。完成一个模型搭建,大致需要三个步骤:创建网络>模型编译>模型训练
1、构建网络
- 构造器创建
model = tf.keras.Sequential([
tf.keras.layers.Dense(32, input_shape=(784,)),
tf.keras.layers.Activation('relu'),
tf.keras.layers.Dense(10),
tf.keras.layers.Activation('softmax'),
])
- 通过add方法构建
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(32, input_dim=784))
model.add(tf.keras.layers.Activation('relu'))
-
确定模型中数据规格
keras中只有第一层需要通过参数传递的方式告知模型数据的规格,后面各层是不需要的,因为可以通过推导的方式是获得上一层的输出格式,即下一层的输入格式;
a、通过input_shape参数 ,如input_shape=(784,)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(32, input_shape=(784,)))
b、通过input_dim参数,在二维神经网络层中,也可通过input_dim=784的方式实现类似a的定义
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(32, input_dim=784))
2、模型编译
模型编译过程需要用到三个组件,模型优化器、损失函数、模型评估标准。
-
优化器
常见的优化器有很多,如rmsprop、adagrad,这些优化器在keras中都有对应的实现; -
损失函数
损失函数主要反映模型与实际数据的差距,常见的损失函数有categorical_crossentropy、mse; -
评估标准
通过该数据可直观反映模型在某个层面的质量;评估函数可指定多个,可以是keras已经实现的评估函数,也可以是自定义的。
# 多分类问题
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 二分类问题
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 均方误差回归问题
model.compile(optimizer='rmsprop',
loss='mse')
# 自定义评估标准函数
def mean_pred(y_true, y_pred):
return tf.keras.backend.mean(y_pred)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy', mean_pred])
3、模型训练
通过调用fit函数,对模型进行训练;fit函数需要用到4个参数,特征数据、标签、迭代次数、批次大小。
- 二分类
# 对于具有 2 个类的单输入模型(二进制分类):
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(32, activation='relu', input_dim=100))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 生成虚拟数据
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))
# 训练模型,以 32 个样本为一个 batch 进行迭代
model.fit(data, labels, epochs=10, batch_size=32)
- 多分类
# 对于具有 10 个类的单输入模型(多分类分类):
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(32, activation='relu', input_dim=100))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 生成虚拟数据
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(10, size=(1000, 1))
# 将标签转换为分类的 one-hot 编码
one_hot_labels = tf.keras.utils.to_categorical(labels, num_classes=10)
# 训练模型,以 32 个样本为一个 batch 进行迭代
model.fit(data, one_hot_labels, epochs=10, batch_size=32)
4、小结
一个完成的例子 ,模仿Vgg
import numpy as np
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPooling2D
from tensorflow.keras.optimizers import SGD
# 生成虚拟数据
x_train = np.random.random((100, 100, 100, 3))
y_train = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
x_test = np.random.random((20, 100, 100, 3))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(20, 1)), num_classes=10)
model = Sequential()
# 输入: 3 通道 100x100 像素图像 -> (100, 100, 3) 张量。
# 使用 32 个大小为 3x3 的卷积滤波器。
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
#Flatten对特征进行扁平化处理
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)
model.fit(x_train, y_train, batch_size=32, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=32)
网友评论