Как получить форму предыдущего слоя и передать его следующему слою? - PullRequest
5 голосов
/ 19 сентября 2019

Я хочу взять форму входных данных, которые передаются в слой ввода с формой (None,), и использовать ее в цикле for для какой-то цели.

Вот часть моей реализации кода:

lst_rfrm = []
Inpt_lyr = keras.Input(shape = (None,))
for k in range(tm_stp):
  F = keras.layers.Lambda(lambda x, i, j: x[:, None, j : j + i])
  F.arguments = {'i' : sub_len, 'j' : k}
  tmp_rfrm = F(Inpt_lyr)
  lst_rfrm.append(tmp_rfrm)
cnctnt_lyr = keras.layers.merge.Concatenate(axis = 1)(lst_rfrm)
#defining other layers ...

потому что форма ввода (Нет), я не знаю, что дать для цикла for в качестве диапазона (в коде, который я описываю с помощью 'tm_stp').Как я могу получить форму входного слоя (данные, которые передаются на входной слой) в этой ситуации?любая помощь высоко ценится

1 Ответ

1 голос
/ 20 сентября 2019

Вы можете попробовать другой тип цикла.Кажется, вы пытаетесь раздвижные окна, верно?Вы не знаете «длину» запуска, но вы знаете размер окна и количество границ, которые нужно удалить ... так что ...

Slicing differently

Эта функция получает срезы в соответствии с этим принципом:

windowSize = sub_len
def getWindows(x):
    borderCut = windowSize - 1 #lost length in the length dimension

    leftCut = range(windowSize) #start of sequence
    rightCut = [i - borderCut for i in leftCut] #end of sequence - negative
    rightCut[-1] = None #because it can't be zero for slicing

    croppedSequences = K.stack([x[:, l: r] for l,r in zip(leftCut, rightCut)], axis=-1)
    return croppedSequences

Запуск теста:

from keras.layers import *
from keras.models import Model
import keras.backend as K
import numpy as np

windowSize = 3
batchSize = 5

randomLength = np.random.randint(5,10)
inputData = np.arange(randomLength * batchSize).reshape((batchSize, randomLength))

def getWindows(x):
    borderCut = windowSize - 1

    leftCut = range(windowSize)
    rightCut = [i - borderCut for i in leftCut]
    rightCut[-1] = None

    croppedSequences = K.stack([x[:, l: r] for l,r in zip(leftCut, rightCut)], axis=-1)
    return croppedSequences

inputs = Input((None,))
outputs = Lambda(getWindows)(inputs)
model = Model(inputs, outputs)

preds = model.predict(inputData)

for i, (inData, pred) in enumerate(zip(inputData, preds)):
    print('sample: ', i)
    print('input sequence: ', inData)
    print('output sequence: \n', pred, '\n\n')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...