Можно ли получить размер партии в слое керас - PullRequest
0 голосов
/ 29 мая 2019

Я создаю определенный слой 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() .I, за исключением нового тензора x, но на самом деле это сообщение об ошибке: 'NoneType' object cannot be interpreted as an integer.

1 Ответ

0 голосов
/ 29 мая 2019

При использовании tenorflow я использую tf.shape (x), чтобы получить размер пакета для слоев модели, поэтому я думаю, что вы правы, что K.shape (x) (эквивалент керас?) Можно использовать.

Если я понимаю, что вы пытаетесь сделать правильно, разве этого не будет достаточно?С бонусом избегания медленных петель фор-петля.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...