【问题标题】:Overfitting a small data set through the ReLU activation通过 ReLU 激活过拟合小数据集
【发布时间】:2021-11-09 16:05:29
【问题描述】:

我想只使用ReLU 激活来训练网络并完全过拟合数据。然而,无论我使用多少不同的网络结构(例如,增加神经元和层的数量),我都无法达到接近于零的损失值。

重要的是要强调 i) 我不想使用另一个激活函数,并且 ii) 目前,我不会对数据点进行归一化。

n = 50
x = np.random.randint(50, 2000,  (n, 10))
y = np.random.randint(600, 4000,  (n, 1))

k = 16

model = tf.keras.Sequential([  
        tf.keras.layers.Flatten(input_shape=(10,)),
        tf.keras.layers.Dense(k, activation='relu'),
        tf.keras.layers.Dense(k, activation='relu'),
        tf.keras.layers.Dense(k, activation='relu'),
        tf.keras.layers.Dense(k, activation='relu'),
        tf.keras.layers.Dense(1) 
    ])

model.compile(loss='mse',optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001))   
model.fit(x, y, epochs=1000, batch_size=1, verbose=2)

我当前的网络非常普通,在我看来,ReLU 激活应该“轻松”记住/过度拟合数据,尤其是在考虑数据集的大小和维度时。我是否有可能在我的代码中做错了什么?或者我的网络无法正常工作的原因是什么?

【问题讨论】:

  • 您是否尝试更改其他超参数?
  • @AloneTogether 嗨,是的,我做到了。我改变了学习率,附加了不同的回调。我不知道我还能做什么。

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


【解决方案1】:

如果您添加更多神经元并增加批量大小和学习率,损失似乎最终会降至零。

import numpy as np
import tensorflow as tf
np.random.seed(0)
tf.random.set_seed(0)

n = 50
x = np.random.randint(50, 2000,  (n, 10))
y = np.random.randint(600, 4000,  (n, 1))

k = 100

model = tf.keras.Sequential([
        tf.keras.layers.Flatten(input_shape=(10,)),
        tf.keras.layers.Dense(k, activation='relu'),
        tf.keras.layers.Dense(k, activation='relu'),
        tf.keras.layers.Dense(k, activation='relu'),
        tf.keras.layers.Dense(k, activation='relu'),
        tf.keras.layers.Dense(1)
    ])

model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(learning_rate=0.001))

history = model.fit(x, y, epochs=1000, batch_size=32, verbose=0)

loss = history.history['loss']

for epoch in [1, 10, 50, 100, 500, 1000]:
    print('Epoch: {}, Loss: {:,.4f}'.format(epoch, loss[epoch - 1]))

# Epoch: 1, Loss: 7,371,788.0000
# Epoch: 10, Loss: 1,696,856.7500
# Epoch: 50, Loss: 523,101.4375
# Epoch: 100, Loss: 23,518.8301
# Epoch: 500, Loss: 88.4517
# Epoch: 1000, Loss: 0.0000

【讨论】:

  • 那么,我猜问题出在神经元的数量上。包含比维数更多的神经元是否有意义?因为我会有一个更大的数据集。
  • 包含比维数更多的神经元是有意义的。想象一下你的数据点是二维的,一个二维点不能移动到一条线的另一边而不与它相交。如果您添加第三个维度,那么这将成为可能,因为您可以围绕线移动点。每层有 2 个神经元的模型可能无法按类别清晰地分离点,因为类别分布只能在更高维度上分离。用 2-neuron 和 3-neuron-per-layer 模型试试这个,然后就可以看到效果了:playground.tensorflow.org
  • @Chillston 感谢您的精彩解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2022-03-29
  • 2019-11-16
  • 2015-01-05
  • 2018-01-12
  • 2018-05-14
相关资源
最近更新 更多