【问题标题】:Creating a LSTM Neural Network outputting two Y variables创建输出两个 Y 变量的 LSTM 神经网络
【发布时间】:2020-07-04 13:48:36
【问题描述】:

我有一个基于推文的分类任务。 Tweets 是我唯一的输入 (X) 变量。但是,我有两个目标 (y) 变量,一个目标变量应该输出 1 或 0 表示正面或负面,而另一个目标变量应该输出 1 或 0 表示政治或非政治。

我创建了一个正在运行的 LSTM 神经网络,但我似乎无法让它输出两个目标变量。有人可以请教吗?

我的输入形状是:

X_train        y_train
(15203, 250) (15203, 2)
X_val         y_val
(3801, 250) (3801, 2)

我的模型是:

    model = Sequential()
    model.add(Embedding(MAX_NB_WORDS, EMBEDDING_DIM, input_length=X.shape[1]))
    model.add(SpatialDropout1D(0.2))
    model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))
    
    # For two label classification
    model.add(Dense(2, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

我后来发现,当我在看不见的数据上运行这段代码时,我没有得到两个目标变量

    new_text = ["Tony Gonzales (@TonyGonzales4TX) will be a GREAT Congressman for Texas! A Navy veteran, he is Strong on the Economy, Life and the Second Amendment. We need him to defeat the Radical Left in November. Tony has my Complete and Total Endorsement! #TX23"]
    seq = tokenizer.texts_to_sequences(new_text)
    padded = pad_sequences(seq, maxlen = 250)
    pred = model.predict(padded)
    labels = [0,1]
    print(pred, labels[np.argmax(pred)])

在这个和所有其他测试中,我注意到我的预测只返回一个二元分类。例如在上面我得到 0.13 0.87(这些数字加起来是 100,所以并列在一起)

但是,在上述情况下,如果是一条积极的政治推文,我预计会出现大约 0.88 0.91 的双重结果

任何关于如何获得两个输出 y 变量的帮助将不胜感激。

【问题讨论】:

    标签: python keras neural-network lstm


    【解决方案1】:

    您可以在输出层中添加 4 个节点,分别代表(负面、正面、政治、非政治) 并以这种方式映射你的火车 或者你可以试试这个:

    x = your input numpy array
    y1 = your sentiment one hot encoded output numpy array
    y2 = your political one hot encoded output numpy array
    # x, y1, y2 should have same length or shape[0]
    data = tensorflow.data.Dataset.from_tensor_slices((x, [y1, y2]))
    data = data.shuffle(len(x))
    
    input =  Input(shape=(X.shape[1], ))
    x = Embedding(MAX_NB_WORDS, EMBEDDING_DIM, input_length=X.shape[1])(input)
    x = SpatialDropout1D(0.2)(x)
    x = LSTM(100, dropout=0.2, recurrent_dropout=0.2)(x)
    out1 = Dense(2, activation='softmax', name='sentiment')(x)
    out2 = Dense(2, activation='softmax', name='political')(x)
    model = Model(inputs = input, outputs=[out1, out2])
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    
    model.fit(data, other arguments....]  #supposing your output is one hot encoded
    

    看看它是否有效。

    【讨论】:

    • 哇,谢谢你,这是非常彻底的工作!就model.fit 而言,它似乎工作正常。在这里我收到ValueError: Layer sentiment was called with an input that isn't a symbolic tensor. All inputs to the layer should be tensors. 的错误我的xtrain 和ytrain 都是float32 类型的numpy 2d 数组。任何想法这可能是什么?我猜应该是model.fit(X_train, [y_train, y_train])?
    • 您是一位绅士,非常感谢您。一百万年内我永远不会得到这个!感谢您付出的努力。
    • 难道你真的只是在做 2 个 one-hot 编码的 y 变量,所以你的 Y 会有形状 (n,4) 吗?如果是这样,您只需使用 np.hstack((y1,y2)) ,其中 y1 和 y2 都是单热编码数组。请注意,根据您的数据 y1 和 y2 可能需要重新调整为 (n,2) 才能正常工作。我正在解决同样的问题,并认为@CiaranOBrien 可能错误地将两个 Y 输入视为两个不同的输入流。实际上,单热编码的 Y 已经是一些虚拟变量,因此对于两个主题,您只是添加更多。
    • @Vlox 我承认这是很久以前的事了,我已经忘记了我在想什么!我确实知道我一直将我所有的 X 和 Y 数据视为一个输入。这是我遇到问题的输出问题。即将我的输出分成两个不同的结果。我不完全确定它是单热编码,因为 Embedding 函数从 X 输入创建了一个密集向量,这意味着大多数值都是非 0。Y 值是 Tokenised,它返回一个非 0 值的向量,因为 0 是用于填充。
    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 2020-11-14
    • 2017-09-21
    • 1970-01-01
    • 2022-08-15
    • 2018-01-25
    • 2015-02-23
    相关资源
    最近更新 更多