Изменить форму модели Keras - PullRequest
0 голосов
/ 08 марта 2019

Я работаю над моделью встраивания слов, которая ломается, когда я пытаюсь добавить окончательный Reshape.Ниже приведена модель с Reshape, которая выдает:

ValueError: total size of new array must be unchanged

Я не могу понять, почему эти размеры не складываются.

embedding_size = 50
input_size = 46
# Both inputs are 1-dimensional
ingredients = Input(
     name='ingredients',
    shape=(input_size,)
)
documents = Input(
    name='documents',
    shape=(input_size,)
)


ingredients_embedding = Embedding(name='ingredients_embedding',
                                  input_dim=training_size,
                                  output_dim=embedding_size)(ingredients)

# Embedding the document (shape is (None, 46, 50))
document_embedding = Embedding(name='documents_embedding',
                               input_dim=training_size,
                               output_dim=embedding_size)(documents)

# Merge the layers with a dot product along the second axis (shape is (None, 46, 46))
merged = Dot(name='dot_product', normalize=True, axes=2)([ingredients_embedding, document_embedding])

# ~ This like breaks ~
# Reshape to be a single number (shape will be (None, 1))
merged = Reshape(target_shape=(1,))(merged) # <-- ValueError: total size of new array must be unchanged


m = Model(inputs=[ingredients, documents], outputs=merged)
m.compile(optimizer='Adam', loss='mse')

return m

1 Ответ

2 голосов
/ 08 марта 2019

Типичным способом представления документа в виде вектора является суммирование матрицы document_embedding вдоль измерения предложения.

from keras.layers import Input, Embedding, Dot, Reshape, Lambda
from keras.models import Model
import keras.backend as K

embedding_size = 50
input_size = 46

ingredients = Input(
    name='ingredients',
    shape=(input_size,)
)
documents = Input(
    name='documents',
    shape=(input_size,)
)

ingredients_embedding = Embedding(name='ingredients_embedding',
                                  input_dim=input_size,
                                  output_dim=embedding_size)(ingredients)

document_embedding = Embedding(name='documents_embedding',
                               input_dim=input_size,
                               output_dim=embedding_size)(documents)

#sum over the sentence dimension
ingredients_embedding = Lambda(lambda x: K.sum(x, axis=-2))(ingredients_embedding)
#sum over the sentence dimension
document_embedding = Lambda(lambda x: K.sum(x, axis=-2))(document_embedding)

merged = Dot(name='dot_product', normalize=True, axes=-1)([ingredients_embedding, document_embedding])

merged = Reshape(target_shape=(1,))(merged) 

m = Model(inputs=[ingredients, documents], outputs=merged)
m.compile(optimizer='Adam', loss='mse')
m.summary()

document_embedding имеет форму (None, input_size, embedding_size), поэтому -2 является второй последней осью, которая является осью измерения предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...