是否可以在keras层中获取批处理大小

时间:2019-05-29 08:48:49

标签: keras deep-learning

我正在使用lambda函数设计特定的keras图层,如何在该函数中获得动态batch_size

我尝试了很多次来解决这个问题,但都失败了。

def minus(inputs):
    x,y = inputs
    batch_size=K.shape(x)[0]
    e = K.get_variable_shape(x)
    for k in range(e[0]):
        for i in range(e[1]):
            for j in range(e[2]):
                if x[k][i][j]==0:
                   K.update(x[k][i][j], y[k][i][j])
    return x

def mymodel():
    inpA = keras.layers.Input(shape=(10,8),name='InputLayerA')
    inpB = keras.layers.Input(shape=(10,8),name='InputLayerB')
    print(inpA.shape)
    middle = keras.layers.Lambda(minus,name='minus')([inpA,inpB])

    ae = keras.Model([inpA,inpB],middle)
    ae.summary()
    return ae

当我新建一个模型,如ae = mymodel()时,除了一个新的x张量,我实际是错误消息:'NoneType' object cannot be interpreted as an integer

1 个答案:

答案 0 :(得分:0)

当使用tensorflow时,我正在使用tf.shape(x)来获取模型层的批处理大小,所以我认为可以使用K.shape(x)(等效于keras)吗?

如果我了解您要尝试做的事情,这还不够吗?避免了缓慢的python for循环。

import keras
import keras.backend as K

def minus(inputs):
    x,y = inputs
    change_index = K.cast(K.equal(x, 0),'float32')
    return x*(1-change_index)+y*change_index

def mymodel():
    inpA = keras.layers.Input(shape=(10,8),name='InputLayerA')
    inpB = keras.layers.Input(shape=(10,8),name='InputLayerB')
    print(inpA.shape)
    middle = keras.layers.Lambda(minus,name='minus')([inpA,inpB])

    ae = keras.Model([inpA,inpB],middle)
    ae.summary()
    return ae

ae = mymodel()