【问题标题】:Tensorflow doubts about the (input) dimensions of a model when predicting the class of a sequenceTensorflow 在预测序列的类别时对模型的(输入)维度的怀疑
【发布时间】:2021-10-14 03:43:21
【问题描述】:

我是 Tensorflow 的新手,我正在尝试实现一个反讽检测模型。 我的数据集由标记为 1 或 0 的推文组成,以表明它们是否具有讽刺意味。

在预处理、标记化和填充阶段之后,我留下了固定长度的序列和相关的标签向量,以便在训练和测试集中拆分并作为模型的输入。序列形式如下:

>>> data
array([[    1,   677,   348, ...,     0,     0,     0],
       [    1,   677,   348, ...,     0,     0,     0],
       [    1,   825,     1, ...,     0,     0,     0],
       ...,
       [  908,  1376,   686, ...,     0,     0,     0],
       [    8,   158, 14579, ...,     0,     0,     0],
       [    1,     1,    35, ...,     0,     0,     0]], dtype=int32)

>>> data.shape
(3977, 50)
>>> data[0].shape
(50,)

型号如下:

num_words = len(tok.word_index) + 1 # tok is a Tokenizer which I fit on the data

import tensorflow as tk
from tensorflow import keras
early_stopping = keras.callbacks.EarlyStopping(monitor='val_loss', patience=2)

# The model
model = keras.Sequential()
model.add(keras.layers.Embedding(num_words, 64, input_length=Config.SEQUENCE_LENGTH, mask_zero=True))
model.add(keras.layers.GRU(64, return_sequences=True))
model.add(keras.layers.GRU(64))
model.add(keras.layers.Dense(1, activation='sigmoid'))

使用model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 编译模型并使用sklearn 的实用函数拆分数据集后,我调用模型的拟合方法:

model.fit(x_train, y_train, batch_size=10, epochs=10, validation_split=0.1, callbacks=[early_stopping])

训练模型后,evaluate 方法按预期工作,将x_testy_test 作为输入,但如果我调用model.predict_classes(x_test[0])(或(model.predict(x_test[0]) > 0.5).astype("int32"))而不是单个预测,我会得到一个( 50,1) 形的预测数组。 我尝试以这种方式重塑 x_test[0] model.predict_classes(x_test[0].reshape(1,50)) 并在数组中得到一个预测:array([[1]], dtype=int32)

所以现在我留下了以下问题(也是因为我在调用evaluate(x_test, y_test) 时获得了 0.6 的准确度:

  • 为什么如果我将数据集作为数组(x_train)传递给模型,我不能只将测试集的一个元素传递给预测函数(例如x_test[0]),而是我必须对其进行重塑?
  • 正常还是有什么错误?我是否将模型的输入尺寸设置错了?在将序列输入模型之前,我是否也应该重塑序列?

【问题讨论】:

  • 通过检查你的代码,你做的事情是正确的,只是你对推理部分有些困惑。请同时提供标签的形状。
  • y_train.shape 产生(3181,)y_test.shape 产生(796,)

标签: python tensorflow machine-learning keras


【解决方案1】:

为什么我将数据集作为数组传递给模型 (x_train),我不能只将测试集的一个元素传递给 预测函数(例如 x_test[0]),但我必须对其进行重塑?

这是因为model.predict 只能接受一组示例而不是单个示例,如果您想提供单个示例,则必须将其重塑为(1,50),所以它是一组的例子,其中集合的大小是1。

但是,与其将示例一个一个地输入model.predict,不如将​​一组示例输入model.predict,即pred_test = model.predict(x_test),然后如果你想知道第i个的预测比如prediction_of_the_ith_example = pred_test[i]

是正常的还是有什么错误?我在设置输入尺寸吗 模型错了?我应该在喂食之前也重塑序列吗 将它们添加到模型中?

模型定义和训练部分是正确的。

关于标签的形状(y_trainy_test),正确使用的形状是(data_size,label_length),即分别为(3181,1)(796,1)。你这里是做单标签分类,所以标签长度是1。但是即使你使用(3181,)(796,),它也能正常工作,因为它为你做了自动广播。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2015-10-07
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多