深度学习 | Tensorflow2.0函数式建模
Tensorflow2.0主要支持3种建模方式,分别为
- tf.keras.models.Sequential(), 适合比较简单的网络,前一层输出是后一层输入。
- class mymodel(tf.keras.models.Model), 继承Model父类的方法,通过super(), call()等方法实现子类的方法。
- 函数式API,自定义Input_layer,output_layer,适合比较复杂的网络搭建,比如Wide&Deep, xDeepFM等多种模型集成。
本文主要记录Tensorflow函数式API模型搭建的方法
一、搭建思路
1. 输入层Input
库来源
from tensorflow.keras.models import Model
- 单一输入来源
input_1 = Input(shape=(dim,), dtype='int32') # dim,输入数据的维度,默认为ndarray结构, dtype即变量类型
- 多输入来源
inputs = []
for i in range(len(COLUMNS)):
input_i = Input(shape=(1,), dtype='int32')
inputs.append(input_i)
- 输入合并
all_inputs = input_1 + inputs # 要求是对列表进行操作
2. 中间层
中间层API主要来自库:
from tensorflow.keras.layers import Input, Embedding, Dense, Flatten, Activation, concatenate
- Dense(),即全连接层
input_1 = Input(shape(3,))
x = Dense(64, activation='relu')(input_1)
out = Dense(1, activation='softmax')(x)
- Flatten(), 展平层
将tensor铺平为1阶向量,这个没有太多可介绍的,主要用于图像像素矩阵导入后,或Embedding后。
flatten_i = Flatten()(input_1)
- Embedding, 嵌入层
此层主要应用于推荐/NLP领域中,对于类别型特征的处理。由于计算机不能直接处理文本特征,不能直接计算类别型特征的欧氏距离。因此常见的方法是将类别型特征离散化,如One-Hot,LabelCoder等操作,将文本类别映射为高维稀疏的向量,如[0,0,0,1,…,0]等,
但这种操作完全忽略了词与词之间的关联性,如[篮球,足球]和{篮球,小提琴]是完全等距离的,这对于挖掘相关性的算法而言是违背了设计初衷的,因此引入了Embedding的概念。
Embedding,将高维稀疏的特征稠密化,映射为低维稠密的向量,且提供了词与词之间相关性计算的保障,可以通过优化器不断优化词于词之间的权重。
# 类别型特征LabelEncoder
enc = LabelEncoder()
for c in CATEGORICAL_COLUMNS:
all_df[c] = enc.fit_transform(all_df[c])
for i in range(len(CATEGORICAL_COLUMNS)):
# 预计输入是1个维度的数据,即1列
input_i = Input(shape=(1,), dtype='int32') # shape(1,) 等价于 shape(1), 表示输入1维的向量
dim = len(np.unique(self.all_data[CATEGORICAL_COLUMNS[i]])) # 表示输入词的总数,此时的类别特征已经被LabelEncoder离散化过了
embed_dim = int(np.ceil(dim ** 0.25)) # 一个词映射成几个浮点数,取2次开方,表示经过Embedding后输出词的维度
embed_i = Embedding(input_dim=dim, output_dim=embed_dim, input_length=1)(input_i)
flatten_i = Flatten()(embed_i)
categ_inputs.append(input_i)
categ_embeds.append(flatten_i)
3. 模型编译
模型构建 -> model.compile -> model.fit -> model.save/predict
model = Model(inputs=inputs, outputs=output)
model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])
model.fit(input_data, self.y_train, epochs=epochs, batch_size=batch_size)
model.save(r'embedding.h5')
总结
后续会继续完善,用作笔记