美文网首页机器学习
Keras Lambda层陷阱

Keras Lambda层陷阱

作者: 梦里茶 | 来源:发表于2017-10-20 14:52 被阅读373次

作者: 梦里茶

Keras中的Layer和Tensor

  • Keras的最小操作单位是Layer,每次操作的是整个batch

定义如下一个InputLayer:

a = Input(shape=(2,))

实际上相当于定义了一个shape为(batch_size, 2)大小的placeholder(如果不是InputLayer,就是定义了一个variable)

a = tf.placeholder(tf.float32, shape=(batch_size, 2))
  • Backend中Tensorflow的最小操作单位是Tensor,每次操作的数据是batch中的所有数据
    定义如下一个Model,做简单的减法
a = Input(shape=(2,))
b = Input(shape=(2,))
def minus(inputs):
    x, y = inputs
    return K.mean(x - y, axis=1) # 在batch里,对一个Input里的元素做平均
    # return K.mean(x - y) # 会在整个batch级别做平均
m = Lambda(minus, name='minus')([a, b])
model = Model(inputs=[a, b], outputs=[m])
- 使用Lambda自定义Layer时,Lambda中使用Backend语法操作对象,操作的是Tensor
- 当使用K.mean时,默认axis=None,会在整个batch级别做平均

完整的测试代码,可以尝试变更Lamda层的注释体会默认batch级别平均的坑爹之处

from keras import Input
from keras import backend as K
from keras.engine import Model
from keras.layers import Lambda

import numpy as np
import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"  # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = "2"

a = Input(shape=(2,))
b = Input(shape=(2,))

def minus(inputs):
    x, y = inputs
    return K.mean(x - y, axis=1)
    # return K.mean(x - y)

m = Lambda(minus, name='minus')([a, b])
model = Model(inputs=[a, b], outputs=[m])

v0 = np.array([1,2])
v1 = np.array([3,4])
v2 = np.array([5,6])
print model.predict([v0.reshape(1,2), v1.reshape(1,2)])
print model.predict([v0.reshape(1,2), v2.reshape(1,2)])
print model.predict([np.array([v0, v0]), np.array([v1, v2])])

相关文章

网友评论

    本文标题:Keras Lambda层陷阱

    本文链接:https://www.haomeiwen.com/subject/atkvuxtx.html