Как написать лямбда-слой keras, чтобы превратить векторный входной слой в слой «image» с бэкэндом keras? - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть два входа для модели:

input_img = Input(shape=(self.img_rows, self.img_cols, self.channels,))
input_cond = Input(shape=(self.cond_dim,))

Их формы различны, я хочу расширить каждый элемент input_cond в изображение того же размера, что и [img_rows,img_cols].

Я написал:

def conv_cond_concat(tensors):
    x_shapes = tensors[0].get_shape()
    y_shapes = tensors[1].get_shape()
    print (x_shapes,y_shapes)
    return tensors[1]*K.ones([x_shapes[0], x_shapes[1], x_shapes[2], y_shapes[1]])

Тогда:

lamb_layer = Lambda(conv_cond_concat)
cond_img = lamb_layer([input_img,input_cond])

Я получил жалобы, как:

  File "/homeXXXXanaconda2/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py", line 708, in ones
    return variable(tf.constant_initializer(1., dtype=tf_dtype)(shape),
  File "/home/XXXXanaconda2/lib/python2.7/site-packages/tensorflow/python/ops/init_ops.py", line 200, in __call__
    self.value, dtype=dtype, shape=shape, verify_shape=verify_shape)
  File "/home/XXXanaconda2/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 208, in constant
    value, dtype=dtype, shape=shape, verify_shape=verify_shape))
  File "/home/XXXanaconda2/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", line 380, in make_tensor_proto
    if shape is not None and np.prod(shape, dtype=np.int64) == 0:
  File "/home/XXXanaconda2/lib/python2.7/site-packages/numpy/core/fromnumeric.py", line 2566, in prod
    out=out, **kwargs)
  File "/home/XXXanaconda2/lib/python2.7/site-packages/numpy/core/_methods.py", line 35, in _prod
    return umr_prod(a, axis, dtype, out, keepdims)
TypeError: __long__ returned non-long (type NoneType)

Как это правильно сделать?

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Вы можете сделать что-то вроде этого:

def broadcast(input):
    img = input[0]
    cond = input[1]
    return K.tf.broadcast_to(cond, K.concatenate([K.shape(img), K.shape(cond)[-1:]]))

## Test the implementation
input_img = Input(shape=(4,4,3,))
input_cond = Input(shape=(2,))
output = Lambda(broadcast)([input_img, input_cond])

model = Model([input_img, input_cond], output)
model.predict([np.zeros((1,4,4,3)), np.random.random(2)[None]])
### output shape is (4, 4, 3, 2) 
0 голосов
/ 30 апреля 2019

Ошибка вызвана x_shapes [0].Первое измерение соответствует размеру партии, и оно Нет.

Я переписал функцию conv_cond_concat, которая добавит динамическое измерение.

def conv_cond_concat(tensors):
    x_shapes = tensors[0].get_shape()
    y_shapes = tensors[1].get_shape()
    print (x_shapes,y_shapes)
    tmp = K.placeholder((None, x_shapes[1], x_shapes[2], y_shapes[1]))
    return tensors[1]*K.ones_like(tmp)

Я не уверен, что есть лучший способ добавить динамическое измерение.Если это так, я хотел бы знать.

...