TensorFlow训练IMDB模型显示782而非25000,是否正常?
训练IMDB情感分类模型时,Epoch显示782/782而非25000是否正常
作为TensorFlow新手,我在用IMDB数据集训练情感分类模型。加载数据并构建包含Flatten层的模型后,执行fit方法时每个epoch显示782/782,而不是我预期的25000。我担心模型是不是只遍历了782个样本,而非全部25000个训练样本,想确认这种情况是否正常。
数据加载与预处理代码
import tensorflow_datasets as tfds import tensorflow as tf import numpy as np imdb ,info = tfds.load("imdb_reviews",with_info=True,as_supervised=True) (train_data , test_data )= (imdb["train"],imdb["test"]) training_sentences = [] training_labels = [] testing_sentences = [] testing_labels = [] for s,l in train_data: training_sentences.append(str(s.numpy())) training_labels.append(l.numpy()) for s,l in test_data: testing_sentences.append(str(s.numpy())) testing_labels.append(l.numpy()) training_labels_final = np.array(training_labels) testing_labels_final = np.array(testing_labels) vocab_size = 10000 emmbeding_dim = 16 max_length = 120 trunc_type = "post" oov_tok = "<OOV>" from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences tokenizer = Tokenizer(num_words= vocab_size,oov_token=oov_tok) tokenizer.fit_on_texts(training_sentences) word_index = tokenizer.word_index sequence = tokenizer.texts_to_sequences(training_sentences) paded = pad_sequences(sequence,maxlen=max_length,truncating=trunc_type) testing_sequences = tokenizer.texts_to_sequences(testing_sentences) testing_padded = pad_sequences(testing_sequences,maxlen=max_length, truncating=trunc_type)
模型定义与训练代码
my_model_with_flatten = tf.keras.Sequential([ tf.keras.layers.Embedding(vocab_size,emmbeding_dim,input_length=max_length), tf.keras.layers.Flatten(), tf.keras.layers.Dense(units=6,activation='leaky_relu'), tf.keras.layers.Dense(units=1,activation='sigmoid'), ]) my_model_with_flatten.compile(optimizer='adam' ,loss='binary_crossentropy',metrics=["accuracy"]) flaten_history=my_model_with_flatten.fit(x=paded,y=training_labels_final,epochs=10, validation_data=[testing_padded,testing_labels_final])
训练输出
Epoch 1/10 782/782 [==============================] - 6s 7ms/step - loss: 0.4893 - accuracy: 0.7504 - val_loss: 0.3950 - val_accuracy: 0.8175 Epoch 2/10 782/782 [==============================] - 4s 6ms/step - loss: 0.2317 - accuracy: 0.9140 - val_loss: 0.4159 - val_accuracy: 0.8166 Epoch 3/10 782/782 [==============================] - 5s 6ms/step - loss: 0.0799 - accuracy: 0.9814 - val_loss: 0.5299 - val_accuracy: 0.8070 Epoch 4/10 782/782 [==============================] - 4s 6ms/step - loss: 0.0198 - accuracy: 0.9978 - val_loss: 0.6216 - val_accuracy: 0.8051 Epoch 5/10 782/782 [==============================] - 4s 6ms/step - loss: 0.0063 - accuracy: 0.9995 - val_loss: 0.6861 - val_accuracy: 0.8022 Epoch 6/10 782/782 [==============================] - 4s 6ms/step - loss: 0.0018 - accuracy: 1.0000 - val_loss: 0.7462 - val_accuracy: 0.8046 Epoch 7/10 782/782 [==============================] - 4s 6ms/step - loss: 7.7573e-04 - accuracy: 1.0000 - val_loss: 0.7966 - val_accuracy: 0.8045 Epoch 8/10 782/782 [==============================] - 5s 6ms/step - loss: 4.2356e-04 - accuracy: 1.0000 - val_loss: 0.8434 - val_accuracy: 0.8060 Epoch 9/10 782/782 [==============================] - 5s 6ms/step - loss: 2.5064e-04 - accuracy: 1.0000 - val_loss: 0.8865 - val_accuracy: 0.8057 Epoch 10/10 782/782 [==============================] - 5s 7ms/step - loss: 1.4970e-04 - accuracy: 1.0000 - val_loss: 0.9293 - val_accuracy: 0.8056
解答
这种情况完全正常,你不用担心模型只遍历了782个样本。
这里的782/782指的是训练步数,不是样本数量。Keras的fit方法默认使用batch_size=32,也就是每次迭代处理32个样本。IMDB训练集总共有25000个样本,25000除以32等于781.25,向上取整后就是782步,意味着每个epoch会把25000个样本全部遍历一遍。
如果想要验证这个逻辑,可以手动设置batch_size=1,此时每个epoch的步数就会变成25000,和你预期的一致。另外从训练输出的准确率来看,第一个epoch达到75%左右,这也符合IMDB情感分类模型训练的正常表现,进一步说明模型确实用到了全部训练数据。
内容的提问来源于stack exchange,提问作者Reza shahriari
相关产品推荐
相关产品推荐

