Персептрон с двумя или более выходами

#python #neural-network

Вопрос:

Я уже делал персептрон с одним выходом, но теперь я хочу попробовать сделать это по крайней мере с двумя выходами. Я не могу найти ни одного примера в Google. Возможно ли это? Можете ли вы привести мне минимальный пример? Я хочу создать нейронную сеть, которая предсказывает двоичные числа. Я не знаю, как добавить больше выходных данных. Это будет лучший вариант, если я смогу создать 8 выходных нейронов.

Вот что я написал:

 def sigmoid(x):
    return 1.0 / (1   exp(-x))

def sigmoid_deriv(x):
    return sigmoid(x) * (1 - sigmoid(x))

training_data = [
    (array([0,0,1]), [0, 0]),
    (array([1,0,1]), [1, 0]),
    (array([0,1,1]), [0, 1]),
    (array([1,1,1]), [1, 1]),
]

def binary_to_int(binary_number_array: list):
    #print(binary)
    decimal = 0
    i = 0
    #print(binary_number_array)
    for number in binary_number_array:
        if number == 1:
            decimal  = pow(2, i)
        i  = 1
    #print(decimal)
    return decimal



errors = []
eta = 0.6
input_layer = 3
hidden_layer = 2
output_layer = 2

epoch_count = 500

weights_input_to_hidden = np.random.uniform(-1, 1, (input_layer, hidden_layer))
weights_hidden_to_output = np.random.uniform(-1, 1, hidden_layer)

preActivation_H = np.zeros(hidden_layer)
postActivation_H = np.zeros(hidden_layer)

training_count = len(training_data[:])
#print(training_count)

for epoch in range(epoch_count):
    for sample in range(training_count):
        data, expected = training_data[sample]
        for node in range(hidden_layer):
            #data, expected = training_data[sample]
            #print(data, weights_input_to_hidden[:, node])
            preActivation_H[node] = np.dot(data, weights_input_to_hidden[:, node])
            postActivation_H[node] = sigmoid(preActivation_H[node])
            #print(data, weights_input_to_hidden[:, node])
            #print(preActivation_H[node], postActivation_H[node])

        preActivation_O = np.dot(postActivation_H, weights_hidden_to_output)
        postActivation_O = sigmoid(preActivation_O)

        decimal_expected = binary_to_int(expected)
        error = postActivation_O - decimal_expected
        errors.append(error)
        #print(error)

        # back propagation
        for hidden_node in range(hidden_layer):
            S_error = error * sigmoid_deriv(preActivation_O)
            #print(S_error)
            gradient_hidden_to_output = S_error * postActivation_H[hidden_node]
            #print(gradient_hidden_to_output)

            for input_node in range(input_layer):
                # tu moze byc zle
                input_value = data[input_node]

                print(input_value)
                gradient_input_to_hidden = S_error * weights_hidden_to_output[hidden_node] * 
                                           sigmoid_deriv(preActivation_H[hidden_node]) * input_value

                weights_input_to_hidden[input_node, hidden_node] -= eta * gradient_input_to_hidden

            weights_hidden_to_output[hidden_node] -= eta * gradient_hidden_to_output


validation_data = []
for i in range(training_count):
    data, expected = training_data[i]
    for node in range(hidden_layer):
        preActivation_H[node] = np.dot(data, weights_input_to_hidden[:, node])
        postActivation_H[node] = sigmoid(preActivation_H[node])

    preActivation_O = np.dot(postActivation_H, weights_hidden_to_output)
    postActivation_O = sigmoid(preActivation_O)

    #print(postActivation_O)
    if postActivation_O > 0.5:
        output = 1
    else:
        output = 0

    validation_data.append((postActivation_O, expected, output))

print(validation_data)