【问题标题】:why my model does not train over all the data (Tensorflow 2)为什么我的模型没有对所有数据进行训练(Tensorflow 2)
【发布时间】:2021-03-04 15:07:12
【问题描述】:

我在这里有一个使用 tensorflow.keras.datasets.imdb 数据的代码,在拆分我的数据以进行训练和验证(第 45-50 行)之后,我的训练数据和训练标签是 (15000,) 的 ndarray。 在训练我的模型时,我可以看到模型没有遍历整个数据集,我得到了 49.8% 的准确率

我关注了这个视频:TensorFlow 2.0 Tutorial - Training the Model - Text Classification P3 并输入了相同的程序。 这是我在训练模型时看到的:

代码:

from tensorflow import keras
import numpy as np

# Loading data
data = keras.datasets.imdb
(train_data, train_labels), (test_data, test_labels) = data.load_data(num_words=10000)
# only take 10,000 words that are most frequent
# we get integer encoded words

# Preprocessing
word_index = data.get_word_index()

word_index = {k: (v + 3) for k, v in word_index.items()}
# dict where the keys are words in char form and values are numbers in int form
word_index["<PAD>"] = 0
word_index["<START>"] = 1
word_index["<UNK>"] = 2
word_index["<UNUSED>"] = 3

reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
# now we have a dict with keys as integers and values as words

train_data = keras.preprocessing.sequence.pad_sequences(train_data, value=word_index["<PAD>"], 
padding="post",
                                                    maxlen=250)
test_data = keras.preprocessing.sequence.pad_sequences(train_data, value=word_index["<PAD>"], 
padding="post",
                                                   maxlen=250)


def decode(text):
    return " ".join([reverse_word_index.get(i, "?") for i in text])


# Model
model = keras.Sequential()
model.add(keras.layers.Embedding(10000, 16))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16, activation="relu"))
model.add(keras.layers.Dense(1, activation="sigmoid"))

model.summary()

model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])

# Validation data
x_val = train_labels[:10000]
x_train = train_labels[10000:]

y_val = train_labels[:10000]
y_train = train_labels[10000:]

fitModel = model.fit(x_train, y_train, epochs=40, batch_size=512, validation_data=(x_val, y_val), 
verbose=1)
# batch_size is how many reviews are we going to give at once to the model

(注意:我没有 Nvidia GPU,我的 GPU 是 RADEON RX)

【问题讨论】:

  • 30批次大小512比15000多一点。看来你正在使用所有数据。

标签: python tensorflow deep-learning text-classification


【解决方案1】:

我认为您的模型已经在 15,000 个示例上进行了训练,因为每个 epoch 的迭代次数为 15000 /batch_size ~ 30。根据日志,它显示每个 epoch 的迭代次数为 30/30,并且训练过程也完成 40 个 epoch。你得到低准确率的原因可能是因为traindev 之间的比率设置当前为 15000:10000 = 60:40。因此,最好将其拆分为 80:20 或 90:10 的比例,以便模型可以看到更多示例。

【讨论】:

    【解决方案2】:

    批量大小为 512 时,您的数据显示您正在训练 30 个批次,因此您正在训练 15,360 个样本。您的数据显示模型训练良好。在 30 个 epoch 结束时,您有 100% 的训练准确度和 100% 的验证准确度。我假设您在测试集上运行了 model.evaluate,准确度为 49.8%。由于您的模型非常准确,因此您的测试数据有问题。对验证数据运行 model.evaluate,您应该会看到 100% 的准确度。

    【讨论】:

      【解决方案3】:

      每个时期都是对您指定的训练集批次的迭代。在您的情况下,批量大小 = 512,因此模型在每个时期训练超过 512(批量大小)* 30(批量),大约是 15000 个数据点,所以在这种情况下您的整个集合。

      不管上述情况如何,您的模型都是完全错误的。

      这里:

      x_val = train_labels[:10000]
      x_train = train_labels[10000:]
      
      y_val = train_labels[:10000]
      y_train = train_labels[10000:]
      

      您为 x 和 y 指定相同的对象(标签),因此您的模型什么也没学到,至少没有特征!

      .fit() 函数让您可以选择完全跳过上面的手动验证拆分并执行以下操作:

      fitModel = model.fit(x_train, y_train, epochs=40, batch_size=512, validation_split=0.2, verbose=1)
      

      validation_split inside fit() 将在训练期间处理验证,并在这种情况下按照指定使用 20% 的数据点,这是一个很好的起点。

      然后你就可以fitModel.evaluate(x_test, y_test)

      【讨论】:

        猜你喜欢
        • 2021-10-03
        • 1970-01-01
        • 1970-01-01
        • 2017-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-08
        • 2021-03-23
        相关资源
        最近更新 更多