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

标签 python tensorflow machine-learning keras deep-learning

我正在尝试了解一些有关 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/

相关文章:

python - 从 Linux 中的 acpi 事件执行 PyQt 应用程序

python - Tensorflow - 显示所有神经元的梯度(不仅仅是输入变量)

python - 我是否很好地理解词嵌入(例如逻辑回归)的使用?

url - 如何使用机器学习对网址进行分类?

python - 更改模型 : <name> given automatically by keras in model. summary() 输出

Python/Numpy : How to avoid storing Boolean-indexed sub-arrays?

python实例变量初始化

python - TensorFlow 模型不执行任何训练

python - tensorflow 2.6 : num_parallel_calls is greater than 1 but only one CPU core is used most of the time

python - 如何找到张量对象中每一行的最大索引?