神经网络训练的准确性保持不变

时间:2020-08-04 07:55:43

标签: python tensorflow machine-learning keras deep-learning

当我在python上运行张量流模型时,无法通过训练提高模型的准确性。即使我将训练数据更改为非常常规的数据,该模型仍然无法正常工作。有什么问题吗?

代码:

train_x = np.array([1] * 1000 + [2] * 1000 + [3] * 1000)
train_y = np.zeros((3000, 3))
train_y[:1000,0] = 1
train_y[1000:2000,1] = 1
train_y[2000:3000,2] = 1
val_x = train_x
val_y = train_y

model = tf.keras.Sequential()
model.add(layers.Dense(3, activation='relu'))
model.add(layers.Dense(3, activation='relu'))
model.compile(optimizer=tf.keras.optimizers.Adam(0.1),
             loss=tf.keras.losses.categorical_crossentropy,
             metrics=[tf.keras.metrics.categorical_accuracy])

model.fit(train_x, train_y, epochs = 10, batch_size = 32, verbose = 1,
          shuffle = False,
          validation_data=(val_x, val_y))

训练结果

Epoch 1/10
94/94 [==============================] - 0s 2ms/step - loss: 10.7836 - categorical_accuracy: 0.3120 - val_loss: 10.7454 - val_categorical_accuracy: 0.3333

Epoch 2/10
94/94 [==============================] - 0s 1ms/step - loss: 10.7454 - categorical_accuracy: 0.3333 - val_loss: 10.7454 - val_categorical_accuracy: 0.3333

Epoch 3/10
94/94 [==============================] - 0s 1ms/step - loss: 10.7454 - categorical_accuracy: 0.3333 - val_loss: 10.7454 - val_categorical_accuracy: 0.3333

Epoch 4/10
94/94 [==============================] - 0s 1ms/step - loss: 10.7454 - categorical_accuracy: 0.3333 - val_loss: 10.7454 - val_categorical_accuracy: 0.3333

Epoch 5/10
94/94 [==============================] - 0s 2ms/step - loss: 10.7454 - categorical_accuracy: 0.3333 - val_loss: 10.7454 - val_categorical_accuracy: 0.3333

那我应该在哪里调整以获得更好的性能,以及我做错了什么?

1 个答案:

答案 0 :(得分:1)

  1. 问题在于,在3个输入神经元和1个特征(即1列)的情况下,神经网络没有足够的if... then组合来学习您要教的模式。如果您对输入进行热编码,它将有效地学习将每个输入列乘以一,并给出正确的答案。
  2. 您的激活功能错误。对于多类问题,请使用'softmax'
  3. 您的优化程序的学习率过高,因此步数过高,并跳过了成本函数。最多使用0.01

完整的示例:

import numpy as np
import tensorflow as tf

train_x = np.array([1] * 1000 + [2] * 1000 + [3] * 1000)
train_x = tf.keras.utils.to_categorical(train_x - 1)
train_y = np.zeros((3000, 3))
train_y[:1000,0] = 1
train_y[1000:2000,1] = 1
train_y[2000:3000,2] = 1
val_x = train_x
val_y = train_y

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(3, activation='relu'))
model.add(tf.keras.layers.Dense(3, activation='softmax'))
model.compile(optimizer=tf.keras.optimizers.Adam(0.01),
             loss=tf.keras.losses.categorical_crossentropy,
             metrics=[tf.keras.metrics.categorical_accuracy])

model.fit(train_x, train_y, epochs = 10, batch_size = 32, verbose = 1,
          shuffle = False,
          validation_data=(val_x, val_y))
Epoch 9/10
  32/3000 [..............................] - ETA: 0s - loss: 0.0067 - cat_acc: 1.0000
 608/3000 [=====>........................] - ETA: 0s - loss: 0.0063 - cat_acc: 1.0000
1184/3000 [==========>...................] - ETA: 0s - loss: 0.0244 - cat_acc: 1.0000
1760/3000 [================>.............] - ETA: 0s - loss: 0.0553 - cat_acc: 1.0000
2272/3000 [=====================>........] - ETA: 0s - loss: 0.0550 - cat_acc: 1.0000
2848/3000 [===========================>..] - ETA: 0s - loss: 0.0447 - cat_acc: 1.0000