【问题标题】:ValueError: Graph disconnected: cannot obtain value for tensor Tensor...The following previous layers were accessed without issue: []ValueError: Graph disconnected: cannot get value for tensor Tensor...以下之前的层被访问没有问题:[]
【发布时间】:2019-06-13 23:32:59
【问题描述】:

我一直在尝试使用 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.

现在,如果我将 topic_input 的 dtype 从 '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())

高度赞赏任何指针。

【问题讨论】:

  • 你确定不使用inputs=[text_input, topic_input] 而不是inputs=[text_encoded, topic_input]

标签: python tensorflow keras deep-learning


【解决方案1】:

您的 Keras 函数式 API 实现存在一些问题,

  1. 您应该将Concatenate 层用作Concatenate(axis=-1)([text_encoded, topic_input])

  2. 在连接层中,您尝试组合 int32 张量和 float32 张量,这是不允许的。你应该做的是,from keras.backend import castconcatenated = 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())

希望这些帮助。

【讨论】:

    猜你喜欢
    • 2020-03-17
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 2023-03-03
    相关资源
    最近更新 更多