我正在使用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
。
答案 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()