ValueError: График отключен: невозможно получить значение для тензорного тензора ... Следующие предыдущие слои были доступны без проблем: [] - PullRequest
0 голосов
/ 14 июня 2019

Я пытался создать модель с несколькими входами, используя Keras, но получил ошибки.Идея состоит в том, чтобы объединить текст и соответствующие темы для прогнозирования настроений.Вот код:

import numpy as np
text = np.random.randint(5000, size=(442702, 200), dtype='int32')
topic = np.random.randint(2, size=(442702, 227), dtype='int32')
sentiment = to_categorical(np.random.randint(5, size=442702), dtype='int32')

from keras.models import Sequential
from keras.layers import Dense, Activation, Embedding, Flatten, GlobalMaxPool1D, Dropout, Conv1D
from keras.callbacks import ReduceLROnPlateau, EarlyStopping, ModelCheckpoint
from keras.losses import binary_crossentropy
from keras.optimizers import Adam


text_input = Input(shape=(200,), dtype='int32', name='text')
text_encoded = Embedding(input_dim=5000, output_dim=20, input_length=200)(text_input)
text_encoded = Dropout(0.1)(text_encoded)
text_encoded = Conv1D(300, 3, padding='valid', activation='relu', strides=1)(text_encoded)
text_encoded = GlobalMaxPool1D()(text_encoded)

topic_input = Input(shape=(227,), dtype='int32', name='topic')

concatenated = concatenate([text_encoded, topic_input])
sentiment = Dense(5, activation='softmax')(concatenated)

model = Model(inputs=[text_encoded, topic_input], outputs=sentiment)
# summarize layers
print(model.summary())
# plot graph
plot_model(model)

Однако, это дает мне следующую ошибку:

TypeError: Tensors in list passed to 'values' of 'ConcatV2' Op have types [float32, int32] that don't all match.

Теперь, если я изменю dtype topic_input с 'int32' на 'float32 ', я получил другую ошибку:

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("text_37:0", shape=(?, 200), dtype=int32) at layer "text". The following previous layers were accessed without issue: []

С другой стороны, часть модели прекрасно работает с последовательным API.

model = Sequential()
model.add(Embedding(5000, 20, input_length=200))
model.add(Dropout(0.1))
model.add(Conv1D(300, 3, padding='valid', activation='relu', strides=1))
model.add(GlobalMaxPool1D())
model.add(Dense(227))
model.add(Activation('sigmoid'))

print(model.summary())

Любые указатели высоко ценятся.

1 Ответ

2 голосов
/ 14 июня 2019

Есть несколько проблем с вашей реализацией функционального API Keras,

  1. Вы должны использовать слой Concatenate как Concatenate(axis=-1)([text_encoded, topic_input]).

  2. В слое сцепления вы пытаетесь объединить тензор int32 и тензор float32, что недопустимо. Что вы должны сделать, это from keras.backend import cast и concatenated = Concatenate(axis=-1)([text_encoded, cast(topic_input, 'float32')]).

  3. У вас есть конфликты переменных, есть две sentiment переменные, одна указывает на выход to_categorical, а другая - на выходной слой Dense.

  4. Входные данные вашей модели не могут быть промежуточными тензорами, такими как text_encoded. Они должны быть из Input слоев.

Чтобы помочь с вашей реализацией, вот рабочая версия вашего кода (хотя я не уверен, что это именно то, что вы хотели) в TF 1.13.

from keras.utils import to_categorical
text = np.random.randint(5000, size=(442702, 200), dtype='int32')
topic = np.random.randint(2, size=(442702, 227), dtype='int32')
sentiment1 = to_categorical(np.random.randint(5, size=442702), dtype='int32')

from keras.models import Sequential
from keras.layers import Input, Dense, Activation, Embedding, Flatten, GlobalMaxPool1D, Dropout, Conv1D, Concatenate, Lambda
from keras.callbacks import ReduceLROnPlateau, EarlyStopping, ModelCheckpoint
from keras.losses import binary_crossentropy
from keras.optimizers import Adam
from keras.backend import cast
from keras.models import Model

text_input = Input(shape=(200,), dtype='int32', name='text')
text_encoded = Embedding(input_dim=5000, output_dim=20, input_length=200)(text_input)
text_encoded = Dropout(0.1)(text_encoded)
text_encoded = Conv1D(300, 3, padding='valid', activation='relu', strides=1)(text_encoded)
text_encoded = GlobalMaxPool1D()(text_encoded)

topic_input = Input(shape=(227,), dtype='int32', name='topic')

topic_float = Lambda(lambda x:cast(x, 'float32'), name='Floatconverter')(topic_input)

concatenated = Concatenate(axis=-1)([text_encoded, topic_float])
sentiment = Dense(5, activation='softmax')(concatenated)

model = Model(inputs=[text_input, topic_input], outputs=sentiment)
# summarize layers
print(model.summary())

Надеюсь, что это поможет.

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