【问题标题】:Neural network model training accuracy remaining on 0神经网络模型训练精度保持在 0
【发布时间】:2023-01-01 03:15:08
【问题描述】:

我的代码是

model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28, 5)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(2)])

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
model.fit(X_train, train_labels, epochs=10)

我的输出是

    Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #
=================================================================
 flatten (Flatten)           (None, 3920)              0

 dense (Dense)               (None, 128)               501888

 dense_1 (Dense)             (None, 2)                 258

=================================================================
Total params: 502,146
Trainable params: 502,146
Non-trainable params: 0
_________________________________________________________________
Epoch 1/10
219/219 [==============================] - 2s 3ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 2/10
219/219 [==============================] - 1s 3ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 3/10
219/219 [==============================] - 1s 3ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 4/10
219/219 [==============================] - 1s 3ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 5/10
219/219 [==============================] - 1s 3ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 6/10
219/219 [==============================] - 1s 3ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 7/10
219/219 [==============================] - 1s 3ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 8/10
219/219 [==============================] - 1s 3ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 9/10
219/219 [==============================] - 1s 3ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 10/10
219/219 [==============================] - 1s 3ms/step - loss: nan - accuracy: 0.0000e+00
<keras.callbacks.History at 0x7f8750280790>

为什么所有的训练准确率都会收敛到0?我的数据集是

print(X_train.shape)
print(X_test.shape)
(7000, 28, 28, 5)
(3000, 28, 28, 5)
print(train_labels.shape)
(7000, 1)

而且我尝试了其他模型,包括con2D模型或者logistic回归模型,但是accuracy总是0。这真的很奇怪。问题是否来自我的数据集?我的 train_labels 只包含 1s 和 (-1)s。

【问题讨论】:

  • 标签应该是 0 和 1,而不是 -1。

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


【解决方案1】:

尝试调整学习率或标签不合适,因为损失函数返回值是NaN

  1. 首先您需要将标签考虑为 int 或 float 格式。
  2. 查看示例数据集标签分布并根据您的网络要求改变 1 或 2 (1, 2)。
  3. 如果来自_logits启用后,您需要将网络的输出与标签和 logits 形状返回进行比较。输出层数为 2 的示例 (1, 2)。
  4. Flatten 层在旧版本中工作。您应该使用适合数据集的输入层,或者将其重命名为“flatten_input”作为输入层名称。
  5. 剩下的是关于数据和网络适合的任务、对比输入和目标。尝试添加更多层或图像对齐以创建数据对比,但如果数据不是图像,而是调整大小的屏幕或共享信息,则网络应与数据匹配。

    示例:使用 Flatten 层时,您需要将输入名称映射到它。

    dataset = {
        "flatten_input" :[],
        "label" : []
    }
    dataset["flatten_input"].append(tf.constant(image, shape=(1, 28, 28, 1)))
    dataset["label"].append(tf.constant(label, shape=(1, 1, 1, 64)))
    

    示例:简单处理 MNIST 数据集

    import tensorflow as tf
    import tensorflow_datasets as tfds
    
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""
    : DataSets
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""
    ds = tfds.load('mnist', split='train', shuffle_files=True)
    ds = ds.shuffle(1024).batch(64).prefetch(tf.data.experimental.AUTOTUNE)
    assert isinstance(ds, tf.data.Dataset)
    
    for example in ds.take(1):
        image, label = example["image"], example["label"]
    
    ls_image = []
    ls_label = []
    for i in range(label.shape[0]):
        ls_image.append(tf.constant(image[i], shape=(1, 28, 28, 1)).numpy())
        ### should reflects the label in number format ###
        ls_label.append(tf.constant(0, shape=(1, 1, 1, 1)).numpy())
    
    image = tf.constant( ls_image, shape=(64, 1, 784, 1) )
    label = tf.constant( ls_label, shape=(64, 1, 1, 1) )
    
    dataset = tf.data.Dataset.from_tensor_slices(( image, label ))
    
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""
    : Model Initialize
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""
    model = tf.keras.Sequential([
        tf.keras.layers.InputLayer(input_shape=(784, 1)),
        tf.keras.layers.Dense(256),
        tf.keras.layers.Dense(256),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dense(2)
        ])
    model.summary()
    
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""
    : Optimizer
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""
    optimizer = tf.keras.optimizers.Nadam(
        learning_rate=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-07,
        name='Nadam'
    )
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""
    : Loss Fn
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""
    lossfn = tf.keras.losses.SparseCategoricalCrossentropy(
        from_logits=True,
        reduction=tf.keras.losses.Reduction.AUTO,
        name='sparse_categorical_crossentropy'
    )
    
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""
    : Model Summary
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""
    model.compile(optimizer=optimizer, loss=lossfn, metrics=['accuracy'])
    
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""
    : Training
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""
    history = model.fit( dataset, epochs=50 )
    

    输出:数字发生

    Epoch 1/50
    51/64 [======================>.......] - ETA: 0s - loss: 7.0123e-09 - accuracy: 1.0000
    

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 2020-06-07
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 2020-08-24
    • 2011-04-07
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多