【问题标题】:Why doesn't my CNN's accuracy/loss change during training?为什么我的 CNN 的准确率/损失在训练期间没有变化?
【发布时间】:2021-07-18 19:54:28
【问题描述】:

我的目标是训练一个卷积神经网络来识别mnist sign language dataset 中存在的图像。这是我处理数据和训练模型的尝试

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
import cv2
import random
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Activation, Dropout, Flatten, Dense
import cv2
import keras
import sys
import tensorflow as tf
from keras import optimizers
import json

train_df = pd.read_csv("data/sign_mnist_train.csv")
test_df = pd.read_csv("data/sign_mnist_test.csv")
X = np.array(train_df.drop(["label"], axis=1))
y = np.array(train_df[["label"]])
X = X.reshape(-1, 28, 28, 1)
X = tf.cast(X, tf.float32)
model = Sequential()
model.add(Conv2D(28, (3,3), activation = 'relu'))
model.add(MaxPooling2D((2,2)))
model.add(Flatten())
model.add(Dense(24, activation = 'softmax'))
model.compile(optimizer='RMSprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])
model.fit(X, y, epochs=10, validation_split=0.2)

运行后我得到了这个结果

Epoch 1/10
687/687 [==============================] - 4s 6ms/step - loss: 174.9729 - accuracy: 0.0438 - val_loss: 174.6281 - val_accuracy: 0.0382
Epoch 2/10
687/687 [==============================] - 2s 3ms/step - loss: 174.9779 - accuracy: 0.0433 - val_loss: 174.6281 - val_accuracy: 0.0382
Epoch 3/10
687/687 [==============================] - 2s 3ms/step - loss: 174.9777 - accuracy: 0.0433 - val_loss: 174.6281 - val_accuracy: 0.0382

这将持续到剩下的 7 个 epoch。我的模型与我提供的模型略有不同(为简洁起见),但这个顺序模型有同样的问题,这让我怀疑这个问题必须出现在 model = Sequential() 行之前。此外,我尝试了无数优化器/损失的组合,所有这些都是使准确度/损失收敛到略有不同的数字,所以我怀疑这是问题所在。

【问题讨论】:

  • 在提供单独的traintest 数据集时指定validation_split 的任何原因?
  • 哦,我的错,你根本不用test_df,我收回它。
  • 可能与您的数据有关。您的数据和标签看起来如何?
  • 最初是 X.shape = (27455, 784)y.shape = (27455, 1),但在重塑 X.shape = TensorShape([27455, 28, 28, 1]) 之后。 X 是数据,Y 是标签。 X 是 784 像素 (28x28) 图像的 27455 个示例
  • 你需要使用分类交叉熵而不是 BCE。

标签: python tensorflow machine-learning keras conv-neural-network


【解决方案1】:

其中一个可能是您使用loss='binary_crossentropy' 而不是loss='CategoricalCrossentropy'

此外,您为训练和测试定义了拆分数据集,但您再次将其定义为 model.fit(X, y, epochs=10, validation_split=0.2) 以拆分数据集,其中 20% 用于验证,80% 用于训练。

【讨论】:

    猜你喜欢
    • 2020-01-06
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2019-11-26
    • 2020-04-07
    • 1970-01-01
    相关资源
    最近更新 更多