keras Lambda自定义层实现数据的切片方式,Lambda传参数

作者:BYR_jiandong 时间:2021-03-18 09:16:20 

1、代码如下:


import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation,Reshape
from keras.layers import merge
from keras.utils.visualize_util import plot
from keras.layers import Input, Lambda
from keras.models import Model

def slice(x,index):
return x[:,:,index]

a = Input(shape=(4,2))
x1 = Lambda(slice,output_shape=(4,1),arguments={'index':0})(a)
x2 = Lambda(slice,output_shape=(4,1),arguments={'index':1})(a)
x1 = Reshape((4,1,1))(x1)
x2 = Reshape((4,1,1))(x2)
output = merge([x1,x2],mode='concat')
model = Model(a, output)
x_test = np.array([[[1,2],[2,3],[3,4],[4,5]]])
print model.predict(x_test)
plot(model, to_file='lambda.png',show_shapes=True)

2、注意Lambda 是可以进行参数传递的,传递的方式如下代码所述:

def slice(x,index):
return x[:,:,index]

如上,index是参数,通过字典将参数传递进去.

x1 = Lambda(slice,output_shape=(4,1),arguments={'index':0})(a)
x2 = Lambda(slice,output_shape=(4,1),arguments={'index':1})(a)

3、上述代码实现的是,将矩阵的每一列提取出来,然后单独进行操作,最后在拼在一起。可视化的图如下所示。

keras Lambda自定义层实现数据的切片方式,Lambda传参数

补充知识:tf.keras.layers.Lambda()——匿名函数层解析

1. 参数列表

keras Lambda自定义层实现数据的切片方式,Lambda传参数

2. 作用

keras Lambda自定义层实现数据的切片方式,Lambda传参数

可以把任意的一个表达式作为一个“Layer”对象

Lambda层之所以存在是因为它可以在构建Squential时使用任意的函数或者说tensorflow 函数。

在我们需要完成一些简单的操作(例如VAE中的重采样)的情况下,Lambda层再适合不过了。

3. 举个栗子(VAE)

可以看到通过在encoder和decoder中间加入一个Lambda层使得encoder和decoder连接起来,很方便


def sampling(agrs):
 mean,logvar = agrs[0],agrs[1]
 eps = tf.random.normal(tf.shape(mean))
 return mean + eps*tf.exp(logvar * 0.5)

# 编码阶段

x = layers.Input(shape=(784,)) # 输入层

h1 = layers.Dense(200,activation='softplus')(x)
h2 = layers.Dense(200,activation='softplus')(h1)
# 均值和方差层不需要激活函数
mean = layers.Dense(latent_dimension)(h2)
log_var = layers.Dense(latent_dimension)(h2)

# 将采样过程看成一个Lambda层,这里利用自定义的sampling函数
z = layers.Lambda(sampling,output_shape=(latent_dimension,))([mean,log_var])

# 解码阶段
h3 = layers.Dense(200,activation='softplus')
h4 = layers.Dense(200,activation='softplus')
h5 = layers.Dense(200,activation='softplus')
# No activation
end = layers.Dense(784)
z1 = h3(z)
z2 = h4(z1)
z3 = h5(z2)
out = end(z3)

# 建立模型
model = tf.keras.Model(x,out)

4. Lambda层的缺点

Lambda层虽然很好用,但是它不能去更新我们模型的配置信息,就是不能重写'model.get_config()'方法

所以tensorflow提议,尽量使用自定义层(即tf.keras.layers的子类)

关于自定义层,我的博客有一期会专门讲

总结

当网络需要完成一些简单的操作时,可以考虑使用Lambda层。

来源:https://blog.csdn.net/lujiandong1/article/details/54936185

标签:keras,Lambda,自定义层,切片
0
投稿

猜你喜欢

  • Python 中面向接口编程详情

    2022-05-06 19:55:41
  • Jquery 切换不同图片示例代码

    2024-04-16 09:31:33
  • 在Mac OS上安装Go语言编译器的方法

    2024-05-22 17:48:40
  • Python入门教程(一)Python简单介绍

    2023-10-25 03:19:16
  • JavaScript 设计模式 富有表现力的Javascript(一)

    2023-08-25 07:42:15
  • 关于 Python json中load和loads区别

    2021-04-24 20:30:51
  • js实现(层,表格)元素圆角的函数

    2008-01-01 16:40:00
  • mysql 8.0.28 安装配置方法图文教程

    2024-01-16 16:40:26
  • Vue2.0实现1.0的搜索过滤器功能实例代码

    2024-05-09 10:40:30
  • 详解Pymongo常用查询方法总结

    2022-06-01 09:13:30
  • python 字典常用方法超详细梳理总结

    2023-06-29 05:48:40
  • css去掉checkbox边框的方法

    2011-06-06 10:32:00
  • JavaScript实现弹出DIV层同时页面背景渐变成半透明效果

    2024-04-30 10:09:27
  • Spring Data JPA的Audit功能审计数据库的变更

    2024-01-21 18:30:29
  • Python解析命令行读取参数--argparse模块使用方法

    2023-06-28 22:48:45
  • XML简易教程之二

    2008-09-05 17:19:00
  • 利用python实现平稳时间序列的建模方式

    2022-08-31 03:35:30
  • pandas数据清洗实现删除的项目实践

    2021-09-02 16:44:17
  • sql中设置联合主键的具体方法

    2024-01-13 06:19:10
  • python读取mat文件生成h5文件的实现

    2022-08-06 08:43:28
  • asp之家 网络编程 m.aspxhome.com