无法在简单的数据集上训练Tensorflow

时间:2019-11-27 20:46:15

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

我正在尝试学习一些有关Tensorflow /机器学习的知识。首先,我试图创建一个通过简单的一维函数(y = x ^ 2)进行训练的模型,并查看其在训练范围之外的其他输入的行为。

我遇到的问题是训练功能并没有真正改善。我敢肯定这是由于我缺乏理解和/或配置错误,但实际上似乎没有任何形式的“婴儿的首次机器学习”来处理已知形式的数据集。 / p>

我的代码非常简单,并且是从TensorFlow的入门笔记本here借来的

import tensorflow as tf
import numpy as np

# Load the dataset

x_train = np.linspace(0,10,1000)
y_train = np.power(x_train,2.0)

x_test = np.linspace(8,12,100)
y_test = np.power(x_test,2.0)

# (x_train, y_train), (x_test, y_test) = mnist.load_data()
# x_train, x_test = x_train / 255.0, x_test / 255.0

"""Build the `tf.keras.Sequential` model by stacking layers. Choose an optimizer and loss function for training:"""
from tensorflow.keras import layers

model = tf.keras.models.Sequential([
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='mse',
              metrics=['mae'])

"""Train and evaluate the model:"""

model.fit(x_train, y_train, epochs=5)

model.evaluate(x_test,  y_test, verbose=2)

我得到这样的输出:

Train on 1000 samples
Epoch 1/5
1000/1000 [==============================] - 0s 489us/sample - loss: 1996.3631 - mae: 33.2543
Epoch 2/5
1000/1000 [==============================] - 0s 36us/sample - loss: 1996.3540 - mae: 33.2543
Epoch 3/5
1000/1000 [==============================] - 0s 36us/sample - loss: 1996.3495 - mae: 33.2543
Epoch 4/5
1000/1000 [==============================] - 0s 33us/sample - loss: 1996.3474 - mae: 33.2543
Epoch 5/5
1000/1000 [==============================] - 0s 38us/sample - loss: 1996.3450 - mae: 33.2543
100/1 - 0s - loss: 15546.3655 - mae: 101.2603

就像我说的那样,我很肯定这是我的一种错误配置/缺乏理解。当我可以采用这种简单的方法并逐步使它变得更复杂时,而不是从一些我无法轻易识别但无法找到采用这种方法的教程等内容的东西开始时,我真的学得最好。谁能推荐一个好的教程源,或者只是在这里教我我做错了什么?

1 个答案:

答案 0 :(得分:2)

我认为您在这里遇到了各种各样的问题。我试图一一向您解释:

首先,您要解决的问题是学习函数f = x ^ 2。因此,这可以适合回归任务。对于回归任务(以及其他任何任务^ _ ^),您应该注意activation function以及您真正尝试预测的内容。

您已选择softmax作为激活功能,这根本没有意义。我建议将其替换为线性激活函数(如果将其完全删除,TF / Keras会自动将其视为线性)。

另一方面,为什么在最后一层有10 DENSE?对于每个条目,您都希望预测一个值(对于5个输入值,您想预测25个), 因此,一个DENSE应该足以创造您的价值。 另一方面,由于您的网络不大,因此我将从SGD作为优化程序入手,但Adam也可能很好。此外,对于您要解决的问题,我认为您真的不需要128 DENSE作为第一个隐藏层。您可以从一个较小的数字开始,然后看看它如何进行。我会以3-4 DENSE作为起点

长话短说,让我们用这些行替换您的模型,并希望它能正常工作

model = tf.keras.models.Sequential([
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(1)
])