tf2.0 是要力推 keras,最近将之前的代码改造成 keras(挤时间自己改的,还在测试),这中间看着 keras 官方文档加上搜索,有些点其实还是存在一定的疑问。
其实主要的问题就是在这模型输入输出这块,keras 在构造网络这块还是比较简单的,看着官网的例子关于函数式 api 提供的例子都是非常的简单。
基本上套路就是一个 Input 然后 FC 之类的就到 Output,然后建立模型,fit 数据就完成了。
输入的数据格式是数据都事先构造好了,就是现成的不需要经过任何的变换就可以直接使用,不需要做额外的变换。
但是在工程上可就不止这么简单了,现在数据流的获取是使用 pipline 来实现数据的读取,数据都是存在 hdfs 上。
tf.data 模块去解析,然后返回的是一个迭代器,具体到每一个输入就是一个字典,在 pipline 读取到数据之后我们需要对这些元数据做一些处理:
- category 特征 embedding
- 数值特征
- sparse 特征处理
目前主要的是这三类特征,这么多特征都是需要指定相应的输入去作为模型的输入。官网的例子虽然提到多输入与多输出,但是在这里说一下是因为第一次看完真的还是不知道怎么下手,说是知道有这个动心,但是吧还是不知道怎么做,可能现在就是对 keras 还是不太熟悉导致。
现在就说一下处理这个的工程的思路:
#定义 inputs 这个列表就是把所有的 Input 记录下来作为 model 的输入 inputs=[] #处理 category 类型 for cate in your_category_list: input=Input((1,),name=cate) inputs.add(input) #embedding 处理之类的 #数值类特征 for num in your_numerical_list: input=Input(your_shape) inputs.add(input) #sparse 特征,这个处理起来稍微有点麻烦,因为有些 sparse 特征后续需要处理成 embedding 向量 你需要构造两个 Input (1)indices (2)values #在获得输入之后你需要 transform 操作,你需要自定义 layer 去处理这个问题,因为 keras 还没有 sparse_embedding_lookup 的功能,你要使用 tf 的东西那么你就需要自定义 layer 去处理这个,这就是需要注意的地方
之前就像在网上有没有类似的教程就是上面这样去说明一下多输入的问题,但是大部分都是照搬官方教程,其实上面的处理过程实际上包含了多输入与自定义 layer 的过程。
如果你遇到 keras 多输入多输出相关的问题,可以留言。