2017-03-16 58 views
4

我想实现一个层(通过拉姆达层),这是做了以下numpy的过程:如何获得拉姆达层内批量大小

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) 
+0

您必须在代码的某处设置'batch_size',只需使用该变量即可。我错过了什么吗? –

+0

在我的设置中,每个批次都有其自己的大小。 – felagund

+0

我试过了,但是K.int_shape(x)[0] =无。我怀疑int_shape返回的大小不是用于变化的批次,而是图层的输入形状。这是(无,n1,n2,...),因为第一维是批量大小,它可以是任何值。 – felagund

回答

0

创建一个仿函数,并给它批量大小在初始化。

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

在我的设置中,每批都有自己的大小。我使用model.fit_generator来训练模型,所以我有一个生成批次的生成器(并且在我的问题中自然会出现不同的批量大小)。所以,我需要每次都将新的批处理大小传递给函子。有没有办法做到这一点? – felagund