Почему многослойный персептрон не может приблизиться к замкнутой форме? - PullRequest
1 голос
/ 22 марта 2020

[TL; DR]

Я сгенерировал два класса Red и Blue в 2D-пространстве. Красные - это точки на круге юнитов, а синие - это точки на круговом кольце с радиусами (3,4). Я пытался обучить многослойный персептрон с различным количеством скрытых слоев, НО у всех скрытых слоев было 2 нейрона. MLP никогда не достигал 100% точности. Я попытался представить, как MLP будет классифицировать точки 2D-пространства с помощью черного и белого. Это окончательное изображение, которое я получаю:

enter image description here

Сначала я ожидал, что MLP сможет классифицировать 2 класса в двумерном пространстве с двумя нейронами в каждый скрытый слой, и я ожидал увидеть белый круг, заключающий в себе красные точки, а остальные будут черным пространством. Есть ли (математическая) причина, почему MLP не в состоянии создать близкую форму, скорее, она кажется go от бесконечности до бесконечности в 2-мерном пространстве ?? (Обратите внимание: если я использую 3 нейрона на каждом скрытом слое, MLP будет достаточно быстрым)

[Стиль записной книжки]

Я сгенерировал два класса Red и Blue в двухмерном пространстве.
Red - точки на круге блока

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()

enter image description here

Сначала я ожидал, что MLP сможет классифицировать 2 класса в двумерном пространстве с двумя нейронами в каждом скрытом слое, и я ожидал увидеть белый круг, инкапсулирующий красные точки, а остальные будут черным пространством. Есть ли (математическая) причина, по которой MLP не может создать близкую форму, скорее, она кажется go из бесконечности в бесконечность в 2-мерном пространстве ?? (Примечание: если я использую 3 нейрона на каждом скрытом слое, MLP преуспевает довольно быстро).

Что я имею в виду под замкнутой формой, взгляните на второе изображение, которое было создано с использованием 3 нейронов на каждом слой:

for l_no in range(hidden_layers):
    dnn = Dense(3, activation='tanh', name = "layer_{}".format(l_no))(dnn)

enter image description here

...