[TL;博士]
我在 2D 空间上生成了两个类 Red 和 Blue。红色是单位圆上的点,蓝色是具有半径限制 (3,4) 的圆环上的点。我尝试用不同数量的隐藏层训练多层感知器,但所有隐藏层都有 2 个神经元。MLP 从未达到 100% 的准确度。我试图想象 MLP 如何用黑白对 2D 空间的点进行分类。这是我得到的最终图像:
起初,我期待 MLP 可以在 2D 空间上对 2 个类别进行分类,每个隐藏层有 2 个神经元,我期待看到一个白色圆圈包裹着红点,其余的是黑色空间。是否有(数学)原因,为什么 MLP 无法创建紧密的形状,而是它似乎在 2d 空间上从无穷大变为无穷大?(注意:如果我在每个隐藏层使用 3 个神经元,MLP 会很快成功)。
[笔记本风格]
我在 2D 空间上生成了两个类 Red 和 Blue。
红色是单位圆上的点
size_ = 200
classA_r = np.random.uniform(low = 0, high = 1, size = size_)
classA_theta = np.random.uniform(low = 0, high = 2*np.pi, size = size_)
classA_x = classA_r * np.cos(classA_theta)
classA_y = classA_r * np.sin(classA_theta)
和蓝色是具有半径限制 (3,4) 的圆环上的点。
classB_r = np.random.uniform(low = 2, high = 3, size = size_)
classB_theta = np.random.uniform(low = 0, high = 2*np.pi, size = size_)
classB_x = classB_r * np.cos(classB_theta)
classB_y = classB_r * np.sin(classB_theta)
我尝试用不同数量的隐藏层训练多层感知器,但所有隐藏层都有 2 个神经元。
hidden_layers = 15
inputs = Input(shape=(2,))
dnn = inputs
for l_no in range(hidden_layers):
dnn = Dense(2, activation='tanh', name = "layer_{}".format(l_no))(dnn)
outputs = Dense(2, activation='softmax', name = "layer_out")(dnn)
model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics='accuracy'])
MLP 从未达到 100% 的准确度。我试图想象 MLP 如何用黑白对 2D 空间的点进行分类。
limit = 4
step = 0.2
grid = []
x = -limit
while x <= limit:
y = -limit
while y <= limit:
grid.append([x, y])
y += step
x += step
grid = np.array(grid)
prediction = model.predict(grid)
这是我得到的最终图像:
xs = []
ys = []
cs = []
for point in grid:
xs.append(point[0])
ys.append(point[1])
for pred in prediction:
cs.append(pred[0])
plt.scatter(xs, ys, c = cs, s=70, cmap = 'gray')
plt.scatter(classA_x, classA_y, c = 'r', s= 50)
plt.scatter(classB_x, classB_y, c = 'b', s= 50)
plt.show()
起初,我期待 MLP 可以在 2D 空间上对 2 个类别进行分类,每个隐藏层有 2 个神经元,我期待看到一个白色圆圈包裹着红点,其余的是黑色空间。是否有(数学)原因,为什么 MLP 无法创建紧密的形状,而是它似乎在 2d 空间上从无穷大变为无穷大?(注意:如果我在每个隐藏层使用 3 个神经元,MLP 会很快成功)。
我所说的封闭形状是什么意思,看看第二张图像,它是通过在每一层使用 3 个神经元生成的:
for l_no in range(hidden_layers):
dnn = Dense(3, activation='tanh', name = "layer_{}".format(l_no))(dnn)
[根据标记答案]
from keras import backend as K
def x_squared(x):
x = K.abs(x) * K.abs(x)
return x
hidden_layers = 3
inputs = Input(shape=(2,))
dnn = inputs
for l_no in range(hidden_layers):
dnn = Dense(2, activation=x_squared, name = "layer_{}".format(l_no))(dnn)
outputs = Dense(2, activation='softsign', name = "layer_out")(dnn)
model.compile(optimizer='adam',
loss='mean_squared_error',
metrics=['accuracy'])
我得到: