[TL; DR]
Я сгенерировал два класса Red и Blue в 2D-пространстве. Красные - это точки на круге юнитов, а синие - это точки на круговом кольце с радиусами (3,4). Я пытался обучить многослойный персептрон с различным количеством скрытых слоев, НО у всех скрытых слоев было 2 нейрона. MLP никогда не достигал 100% точности. Я попытался представить, как MLP будет классифицировать точки 2D-пространства с помощью черного и белого. Это окончательное изображение, которое я получаю:
Сначала я ожидал, что 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()
Сначала я ожидал, что 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)