Не может изменить форму после объединения в Керасе - PullRequest
1 голос
/ 11 июля 2019

У меня есть модель с общим кодером, которая использует сцепление Keras для получения всех закодированных значений в один выход для обучения.В идеале мне бы хотелось, чтобы укладывал закодированные значения.

Я не мог заставить это работать, из-за той же ошибки, которую я демонстрирую в этой проблеме.Но так как стек является бэкэнд-функцией, мне показалось, что лучше в моем простом примере просто использовать reshape.

Вот мой код:

import keras.backend as K
from keras.models import Sequential, Model
from keras.layers import Dense, Input, Reshape, Flatten, concatenate
from keras.optimizers import Adam

input_shape = (28, 28)
output_length = 10

anchor_input = Input(shape=input_shape)
positive_input = Input(shape=input_shape)
negative_input = Input(shape=input_shape)

shared_encoder = Sequential()
shared_encoder.add(Flatten())
shared_encoder.add(Dense(output_length * 2))
shared_encoder.add(Dense(output_length, activation='sigmoid'))
# shared_encoder.add(Lambda(lambda x: K.l2_normalize(x, axis=1)))

anchor_encoded = shared_encoder(anchor_input)
positive_encoded = shared_encoder(positive_input)
negative_encoded = shared_encoder(negative_input)
print("encoded shape", K.int_shape(anchor_encoded)) # (None, 10)

merged_outputs = concatenate([anchor_encoded, positive_encoded, negative_encoded], axis=-1)
print("before reshape", K.int_shape(merged_outputs)) # (None, 30)

# ValueError: Cannot feed value of shape (32, 1) for Tensor 'reshape_1_target:0', which has shape '(?, ?, ?)'
merged_outputs = Reshape((3, -1))(merged_outputs)
print("after reshape", K.int_shape(merged_outputs)) # (None, 3, 10)

model = Model(inputs=[anchor_input, positive_input, negative_input], outputs=merged_outputs)

if __name__ == "__main__":
    from keras.datasets import mnist
    def dumb_loss(y_true, y_pred):
        return K.mean(y_pred)

    model.compile(loss=dumb_loss, optimizer=Adam())

    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    model.fit([x_train, x_train, x_train], y_train)

Как видите, модельдовольно простоРазмеры, кажется, работают.Он компилируется просто отлично.

Но, когда я пытаюсь его подогнать, меня приветствует

ValueError: Невозможно передать значение формы (32, 1) для Tensor 'reshape_1_target: 0 ', который имеет форму' (?,?,?) '

Что происходит?Откуда взялась форма (32, 1)?(Я знаю, что 32 - это размер пакета по умолчанию, но что это за 1?) Что я могу сделать, чтобы заставить этот слой Reshape работать?

РЕДАКТИРОВАТЬ:

Я использую Tensorflow1,5.Кажется, что при новой установке Tensorflow с большим числом на другой компьютер, это работает нормально.Так что теперь мне интересно, столкнулся ли я со старой ошибкой.

Вот мои требования. Txt (он же pip freeze):

absl-py==0.7.1
bleach==1.5.0
h5py==2.9.0
html5lib==0.9999999
Keras==2.2.4
Keras-Applications==1.0.8
Keras-Preprocessing==1.1.0
Markdown==3.1.1
numpy==1.16.4
protobuf==3.8.0
PyYAML==5.1.1
scipy==1.3.0
six==1.12.0
tensorflow==1.5.0
tensorflow-tensorboard==1.5.1
Werkzeug==0.15.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...