我已经读过,给定一个足够复杂的模型并且我训练了足够多的时期,我的模型应该在某个时候过度拟合数据集。然而,我在 keras 中实现了一个简单的神经网络,我的验证集损失似乎永远不会上升:
import tensorflow as tf
from tensorflow import keras
import numpy as np
import random
from sklearn import datasets, preprocessing
import matplotlib.pyplot as plt
# import and scale
dataset = datasets.load_boston()
X = dataset.data
y = dataset.target
X = preprocessing.scale(X)
y = y.reshape((y.shape[0], 1))
# shuffle
shuffle_indices = list(range(X.shape[0]))
random.shuffle(shuffle_indices)
X = X[shuffle_indices]
y = y[shuffle_indices]
# tain-validation split
X_train, y_train = X[:int(X.shape[0] * 0.7)], y[:int(X.shape[0] * 0.7)]
X_val, y_val = X[int(X.shape[0] * 0.7):], y[int(X.shape[0] * 0.7):]
# define and fit model
model = keras.Sequential([keras.layers.Dense(X.shape[1], use_bias=True, activation="sigmoid"),
keras.layers.Dense(128, use_bias=True, activation="sigmoid"),
keras.layers.Dense(128, use_bias=True, activation="sigmoid"),
keras.layers.Dense(128, use_bias=True, activation="sigmoid"),
keras.layers.Dense(128, use_bias=True, activation="sigmoid"),
keras.layers.Dense(128, use_bias=True, activation="sigmoid"),
keras.layers.Dense(128, use_bias=True, activation="sigmoid"),
keras.layers.Dense(y.shape[1])
])
model.compile(optimizer=tf.keras.optimizers.SGD(
learning_rate=0.0001
), loss='MeanSquaredError')
model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=500, verbose=1)
# plot data
plt.plot(range(1, len(model.history.history['loss']) + 1), model.history.history['loss'], label='Train Set Cost')
plt.plot(range(1, len(model.history.history['val_loss']) + 1), model.history.history['val_loss'], label='Validation Set Cost')
plt.xlabel("epoch")
plt.ylabel("loss")
plt.legend()
plt.show()
该模型是一个简单的密集神经网络,其损失函数为均方误差,优化器为梯度下降。我试图让网络更深,但验证损失只会不断减少,直到它停止在某一点。