如何在lambda层中获取批量大小

时间:2017-03-16 17:35:45

标签: keras

我正在尝试实现一个正在执行以下numpy过程的图层(通过lambda图层):

def func(x, n):
    return np.concatenate((x[:, :n], np.tile(x[:, n:].mean(axis = 0), (x.shape[0], 1))), axis = 1)

我被卡住了,因为我不知道如何获得x的第一个维度的大小(这是批量大小)。后端函数int_shape(x)返回(None, ...)

因此,如果我知道batch_size,相应的Keras程序将是:

def func(x, n):
    return K.concatenate([x[:, :n], K.tile(K.mean(x[:, n:], axis=0), [batch_size, 1])], axis = 1)

3 个答案:

答案 0 :(得分:0)

创建一个仿函数,并在初始化时为其指定批量大小。

class SuperLoss:
    def __init__(self,batch_size):
        self.batch_size = batch_size
    def __call__(self,y_true,y_pred):
        self.batch_size ....

答案 1 :(得分:0)

你不应该使用K.int_shape,而是tf.shape之类的东西,它会给你一个动态的形状。

答案 2 :(得分:0)

就像@pitfall所说的那样,K.tile的第二个参数应该是张量。 根据{{​​3}},K.shape返回张量,而K.int_shape返回int或None条目的元组。因此正确的方法是使用K.shape。以下是MWE:

import keras.backend as K
from keras.layers import Input, Lambda
from keras.models import Model
import numpy as np

batch_size = 8
op_len = ip_len = 10

def func(X):
    return K.tile(K.mean(X, axis=0, keepdims=True), (K.shape(X)[0], 1))

ip = Input((ip_len,))
lbd = Lambda(lambda x:func(x))(ip)

model = Model(ip, lbd)
model.summary()

model.compile('adam', loss='mse')

X = np.random.randn(batch_size*100, ip_len)
Y = np.random.randn(batch_size*100, op_len)
#no parameters to train!
#model.fit(X,Y,batch_size=batch_size)

#prediction
np_result = np.tile(np.mean(X[:batch_size], axis=0, keepdims=True), 
                    (batch_size,1))
pred_result = model.predict(X[:batch_size])
print(np.allclose(np_result, pred_result))