通过Sequential快速搭建tensorflow模型

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)

你可能感兴趣的:(通过Sequential快速搭建tensorflow模型)