利用make_moons二分类月牙型数据集,编程实现网络层数对过拟合的影响,网络层数分别为为2,3,4,5,6,输出五个不同网络层数的图像,用tensorflow实现
时间: 2023-06-10 07:06:34 浏览: 96
首先,我们需要导入必要的库和数据集:
```python
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from sklearn.datasets import make_moons
# 生成数据集
X, y = make_moons(n_samples=1000, noise=0.1, random_state=42)
```
接下来,我们定义一个函数来创建模型:
```python
def create_model(num_layers):
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(10, input_dim=2, activation='relu'))
for i in range(num_layers):
model.add(tf.keras.layers.Dense(10, activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
```
这个函数接受一个参数 `num_layers`,它表示我们要创建的层数。该函数使用 `Sequential` 模型,添加一个具有10个神经元和ReLU激活函数的输入层,然后添加 `num_layers` 个具有10个神经元和ReLU激活函数的隐藏层,最后添加具有1个神经元和sigmoid激活函数的输出层。我们使用二元交叉熵作为损失函数,Adam作为优化器,并使用准确度作为性能指标。
接下来,我们训练模型并绘制决策边界:
```python
# 训练模型并绘制决策边界
num_layers_list = [2, 3, 4, 5, 6]
plt.figure(figsize=(15, 3))
for i, num_layers in enumerate(num_layers_list):
# 创建模型
model = create_model(num_layers)
# 训练模型
model.fit(X, y, epochs=100, verbose=0)
# 绘制决策边界
plt.subplot(1, 5, i+1)
xx, yy = np.meshgrid(np.linspace(-2, 3, 100), np.linspace(-2, 2, 100))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
plt.title(f'{num_layers} Layers')
plt.axis('off')
plt.show()
```
在这个代码中,我们迭代 `num_layers_list` 并为每个值创建一个模型。然后,我们对模型进行训练,并使用 `predict` 函数计算决策边界。最后,我们将决策边界绘制在散点图上,并将结果显示在单独的子图中。
完整代码如下:
```python
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from sklearn.datasets import make_moons
# 生成数据集
X, y = make_moons(n_samples=1000, noise=0.1, random_state=42)
def create_model(num_layers):
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(10, input_dim=2, activation='relu'))
for i in range(num_layers):
model.add(tf.keras.layers.Dense(10, activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
# 训练模型并绘制决策边界
num_layers_list = [2, 3, 4, 5, 6]
plt.figure(figsize=(15, 3))
for i, num_layers in enumerate(num_layers_list):
# 创建模型
model = create_model(num_layers)
# 训练模型
model.fit(X, y, epochs=100, verbose=0)
# 绘制决策边界
plt.subplot(1, 5, i+1)
xx, yy = np.meshgrid(np.linspace(-2, 3, 100), np.linspace(-2, 2, 100))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
plt.title(f'{num_layers} Layers')
plt.axis('off')
plt.show()
```
运行以上代码,我们可以看到五个不同网络层数的图像。我们可以看到,当层数增加时,模型的过拟合程度也增加。在这个例子中,3层和4层模型的决策边界最好,6层模型的决策边界则过于复杂,导致过拟合。
![image](https://user-images.githubusercontent.com/26991911/120806174-2bcb4b00-c56e-11eb-8c56-531f5a68fe54.png)
阅读全文