我正在尝试了解一些有关 Tensorflow/机器学习的知识。作为起点,我尝试创建一个在简单的一维函数 (y=x^2) 上训练的模型,并查看它对于训练范围之外的其他输入的行为。
我遇到的问题是训练功能并没有真正改善。我确信这是由于我缺乏理解和/或配置错误造成的,但似乎确实没有任何类型的“婴儿的第一个机器学习”可以处理已知形式的数据集。
我的代码很简单,借鉴自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
就像我说的,我确信这是我的配置错误/缺乏理解。当我能够接受如此简单的东西并逐渐使其变得更加复杂时,我真的学得最好,而不是从我无法轻易识别的模式开始,但我找不到任何采用这种方法的教程等。谁能推荐一个好的教程资源,或者只是告诉我我在这里做错了什么?
最佳答案
我认为您遇到了多种问题。我尝试一一给大家解释一下:
首先,你要解决的问题是学习函数f=x^2。所以这可以适合回归任务。对于回归任务(以及任何其他任务^_^),您应该注意激活函数
以及您真正尝试预测的内容。
你选择了softmax作为激活函数,这根本没有意义。我建议将其替换为线性激活函数(如果完全删除它,TF/Keras 会自动将其视为线性)。
另一方面,为什么最后一层有 10 DENSE?对于每个条目,您想要预测一个值(对于 5 作为输入值,您想要预测 25,对吧), 所以一个 DENSE 应该足以产生你的值(value)。 另一方面,由于您的网络不大,我会从 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)
])
关于python - 无法在简单数据集上训练 Tensorflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59078187/