深度学习 | Tensorflow2.0函数式建模笔记

深度学习 | 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')

总结

后续会继续完善,用作笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值