Объединить единичную матрицу с каждым вектором - PullRequest
0 голосов
/ 27 октября 2018

Я хочу изменить свой ввод, добавив несколько различных суффиксов к входным векторам. Например, если (одиночный) вход имеет значение [1, 5, 9, 3], я хочу создать три вектора (сохраненных в виде матрицы) следующим образом:

[[1, 5, 9, 3, 1, 0, 0],
 [1, 5, 9, 3, 0, 1, 0],
 [1, 5, 9, 3, 0, 0, 1]]

Конечно, это всего лишь одно наблюдение, поэтому в данном случае вход для модели (None, 4). Простой способ - подготовить входные данные в другом месте (скорее всего, numpy) и соответствующим образом изменить форму ввода. Что я могу сделать, но я бы предпочел сделать это внутри TensorFlow / Keras.

Я выделил проблему в этот код:

import keras.backend as K
from keras import Input, Model
from keras.layers import Lambda


def build_model(dim_input: int, dim_eye: int):
    input = Input((dim_input,))
    concat = Lambda(lambda x: concat_eye(x, dim_input, dim_eye))(input)
    return Model(inputs=[input], outputs=[concat])


def concat_eye(x, dim_input, dim_eye):
    x = K.reshape(x, (-1, 1, dim_input))
    x = K.repeat_elements(x, dim_eye, axis=1)
    eye = K.expand_dims(K.eye(dim_eye), axis=0)
    eye = K.tile(eye, (-1, 1, 1))
    out = K.concatenate([x, eye], axis=2)
    return out


def main():
    import numpy as np

    n = 100
    dim_input = 20
    dim_eye = 3

    model = build_model(dim_input, dim_eye)
    model.compile(optimizer='sgd', loss='mean_squared_error')

    x_train = np.zeros((n, dim_input))
    y_train = np.zeros((n, dim_eye, dim_eye + dim_input))
    model.fit(x_train, y_train)


if __name__ == '__main__':
    main()

Кажется, проблема в аргументе -1 in shape в функции tile. Я пытался заменить его на 1 и None. У каждого своя ошибка:

  • -1: ошибка во время model.fit

    tensorflow.python.framework.errors_impl.InvalidArgumentError: Expected multiples[0] >= 0, but got -1
    
  • 1: приглушение ошибки model.fit

    tensorflow.python.framework.errors_impl.InvalidArgumentError: ConcatOp : Dimensions of inputs should match: shape[0] = [32,3,20] vs. shape[1] = [1,3,3]
    
  • None: ошибка при build_model:

    Failed to convert object of type <class 'tuple'> to Tensor. Contents: (None, 1, 1). Consider casting elements to a supported type.
    

1 Ответ

0 голосов
/ 29 октября 2018

Вам нужно использовать K.shape() вместо этого, чтобы получить символическую форму входного тензора, поскольку размер пакета равен None и, следовательно, передается K.int_shape(x)[0] или None или -1 как часть второго аргумента K.tile() не будет работать:

eye = K.tile(eye, (K.shape(x)[0], 1, 1))
...