Python ValueError:图形已断开连接:无法获取tensor tensor的值…已访问以下以前的层,但没有问题:[]

Python ValueError:图形已断开连接:无法获取tensor tensor的值…已访问以下以前的层,但没有问题:[],python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我一直在尝试使用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

我一直在尝试使用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:传递给'ConcatV2'Op的'values'的列表中的张量的类型[float32,int32]并不完全匹配。

现在,如果我将topic_输入的数据类型从“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())

非常感谢您的指点

您的Keras功能API实现几乎没有问题

  • 您应该将
    连接
    层用作
    连接(轴=-1)([text\u encoded,topic\u input])

  • 在连接层中,您试图组合
    int32
    张量和
    float32
    张量,这是不允许的。您应该做的是,
    从keras.backend导入cast
    连接=连接(axis=-1)([text\u encoded,cast(topic\u input,'float32'))

  • 您得到了变量冲突,有两个
    情绪
    变量,一个指向一个
    to_category
    输出,另一个指向最后一个
    密集
    层的输出

  • 您的模型输入不能是中间张量,如
    text\u-encoded
    。它们应该来自
    Input

  • 为了帮助实现,这里有一个TF1.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())
    

    希望这些帮助。

    您确定不使用
    输入=[text\u input,topic\u input]
    而不是
    输入=[text\u encoded,topic\u input]