我想僅使用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激活應該“容易”記住/過度擬合資料,尤其是在考慮資料集的大小和維度時。我的代碼是否有可能做錯了什么?或者我的網路無法正常作業的原因是什么?
uj5u.com熱心網友回復:
如果添加更多神經元并增加批量大小和學習率,損失似乎最終會降到零。
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/355141.html
