TensorFlow训练Cars196数据集模型准确率接近0如何解决
我目前正在使用斯坦福提供的Cars196数据集训练模型,数据集已正确导入且可被TensorFlow正常识别,但模型准确率始终接近0。我曾使用相似的训练流程在其他数据集上完成训练且效果正常,不清楚当前配置是否存在错误。
我的实现代码如下:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import csv from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.python.keras.models import Sequential from tensorflow.python.keras.layers import Flatten,Dense car_dir = './src/' test_dir = './src/cars_test/' train_dir = './src/cars_train/' train_labels_file = './src/labels-train.csv' test_labels_file = './src/labels-test.csv' IMG_SIZE = (150,150) def read_labels(label_file:str): pathAndClass = list() with open(label_file) as csv_file: reader = csv.reader(csv_file) next(reader) # 跳过首行表头 for row in reader: pathAndClass.append([row[5].lower(), row[4]]) return pd.DataFrame(pathAndClass,columns=['path', 'class']) pathAndClass = read_labels(train_labels_file) n_classes = np.size(np.unique(pathAndClass['class'])) pathAndClass['path'] = pathAndClass['path'].astype(str) pathAndClass['class'] = pathAndClass['class'].astype(str) data_gen = ImageDataGenerator(rescale = 1.0/255.0, validation_split=0.25) BATCH_SIZE = 32 index_list = [] for i in range(0, n_classes): index_list.append(str(i)) train_flow = data_gen.flow_from_dataframe( dataframe=pathAndClass, x_col='path', y_col='class', directory=train_dir, subset="training", seed=42, target_size=IMG_SIZE, batch_size=BATCH_SIZE, shuffle=True, classes=index_list, class_mode='categorical') valid_flow = data_gen.flow_from_dataframe( dataframe=pathAndClass, x_col='path', y_col='class', directory=train_dir, subset="validation", seed=42, target_size=IMG_SIZE, batch_size=BATCH_SIZE, shuffle=True, classes=index_list, class_mode='categorical') model_nn = Sequential() model_nn.add(Flatten(input_shape=(150,150, 3))) model_nn.add(Dense(300, activation="relu")) model_nn.add(Dense(n_classes, activation="softmax")) model_nn.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) print(model_nn.summary()) training = model_nn.fit( train_flow, steps_per_epoch=train_flow.n//train_flow.batch_size, epochs=10, validation_data=valid_flow, validation_steps=valid_flow.n//valid_flow.batch_size) print(model_nn.evaluate(train_flow)) plt.plot(training.history['accuracy']) plt.plot(training.history['val_accuracy']) plt.plot(training.history['loss']) plt.plot(training.history['val_loss']) plt.title('Model accuracy/loss') plt.ylabel('accuracy/loss') plt.xlabel('epoch') plt.legend(['accuracy', 'val_accuracy', 'loss', 'val_loss']) plt.show()
运行得到的输出如下:
Found 6078 validated image filenames belonging to 196 classes. Found 2026 validated image filenames belonging to 196 classes. Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten_1 (Flatten) (None, 67500) 0 _________________________________________________________________ dense_2 (Dense) (None, 300) 20250300 _________________________________________________________________ dense_3 (Dense) (None, 196) 58996 ================================================================= Total params: 20,309,296 Trainable params: 20,309,296 Non-trainable params: 0 _________________________________________________________________ None Epoch 1/10 189/189 [==============================] - 68s 361ms/step - loss: 9.6809 - accuracy: 0.0036 - val_loss: 5.2785 - val_accuracy: 0.0030 Epoch 2/10 189/189 [==============================] - 58s 307ms/step - loss: 5.2770 - accuracy: 0.0055 - val_loss: 5.2785 - val_accuracy: 0.0089 Epoch 3/10 189/189 [==============================] - 58s 307ms/step - loss: 5.2743 - accuracy: 0.0083 - val_loss: 5.2793 - val_accuracy: 0.0104 Epoch 4/10 189/189 [==============================] - 58s 306ms/step - loss: 5.2728 - accuracy: 0.0089 - val_loss: 5.2800 - val_accuracy: 0.0089 Epoch 5/10 189/189 [==============================] - 58s 307ms/step - loss: 5.2710 - accuracy: 0.0084 - val_loss: 5.2806 - val_accuracy: 0.0089 Epoch 6/10 189/189 [==============================] - 57s 305ms/step - loss: 5.2698 - accuracy: 0.0086 - val_loss: 5.2815 - val_accuracy: 0.0089 Epoch 7/10 189/189 [==============================] - 58s 307ms/step - loss: 5.2695 - accuracy: 0.0083 - val_loss: 5.2822 - val_accuracy: 0.0089 Epoch 8/10 189/189 [==============================] - 58s 310ms/step - loss: 5.2681 - accuracy: 0.0086 - val_loss: 5.2834 - val_accuracy: 0.0089 Epoch 9/10 189/189 [==============================] - 58s 306ms/step - loss: 5.2679 - accuracy: 0.0083 - val_loss: 5.2840 - val_accuracy: 0.0089 Epoch 10/10 189/189 [==============================] - 58s 308ms/step - loss: 5.2669 - accuracy: 0.0083 - val_loss: 5.2848 - val_accuracy: 0.0089 1578/Unknown - 339s 215ms/step - loss: 5.2657 - accuracy: 0.0085
更新1
我尝试通过将batch size下调至8增加每轮训练的迭代次数,重新训练后准确率仍然接近0。
Epoch 1/10 759/759 [==============================] - 112s 147ms/step - loss: 7.6876 - accuracy: 0.0051 - val_loss: 5.2779 - val_accuracy: 0.0089 Epoch 2/10 759/759 [==============================] - 112s 148ms/step - loss: 5.2728 - accuracy: 0.0086 - val_loss: 5.2792 - val_accuracy: 0.0089 Epoch 3/10 759/759 [==============================] - 112s 148ms/step - loss: 5.2695 - accuracy: 0.0087 - val_loss: 5.2808 - val_accuracy: 0.0089 Epoch 4/10 759/759 [==============================] - 109s 143ms/step - loss: 5.2671 - accuracy: 0.0087 - val_loss: 5.2828 - val_accuracy: 0.0089 Epoch 5/10 759/759 [==============================] - 111s 146ms/step - loss: 5.2661 - accuracy: 0.0086 - val_loss: 5.2844 - val_accuracy: 0.0089 Epoch 6/10 759/759 [==============================] - 114s 151ms/step - loss: 5.2648 - accuracy: 0.0089 - val_loss: 5.2862 - val_accuracy: 0.0089 Epoch 7/10 759/759 [==============================] - 118s 156ms/step - loss: 5.2646 - accuracy: 0.0086 - val_loss: 5.2881 - val_accuracy: 0.0089 Epoch 8/10 759/759 [==============================] - 117s 155ms/step - loss: 5.2639 - accuracy: 0.0087 - val_loss: 5.2891 - val_accuracy: 0.0089 Epoch 9/10 759/759 [==============================] - 115s 151ms/step - loss: 5.2635 - accuracy: 0.0087 - val_loss: 5.2903 - val_accuracy: 0.0089 Epoch 10/10 759/759 [==============================] - 112s 147ms/step - loss: 5.2634 - accuracy: 0.0086 - val_loss: 5.2915 - val_accuracy: 0.0089 2390/Unknown - 141s 59ms/step - loss: 5.2611 - accuracy: 0.0088
我此前使用的数据集类别数更少、单类样本量更大,想了解是否有更适配该数据集的模型方案,恳请给出相关建议。
内容的提问来源于stack exchange,提问作者phantom0202
相关产品推荐
相关产品推荐

