예제 #1
0
def main():
    nnfs.init()
    X, y = spiral_data(samples=1000, classes=3)

    dense1 = Layer(2,
                   512,
                   weight_regularizer_l2=5e-4,
                   bias_regularizer_l2=5e-4)
    activation1 = ReLU()

    dense2 = Layer(512, 3)

    cost_act = Soft_Ce()

    optimizer = Adam(learning_rate=0.02, decay=5e-7)

    for epoch in range(10001):

        dense1.forwardProp(X)
        activation1.forwardProp(dense1.output)

        dense2.forwardProp(activation1.output)

        data_cost = cost_act.forwardProp(dense2.output, y)

        regularization_cost = \
            cost_act.cost.regularization_cost(dense1) + \
            cost_act.cost.regularization_cost(dense2)

        cost = data_cost + regularization_cost

        predictions = np.argmax(cost_act.output, axis=1)
        if len(y.shape) == 2:
            y = np.argmax(y, axis=1)
        accuracy = np.mean(predictions == y)

        if not epoch % 100:
            print(f'epoch: {epoch}, ' + f'acc: {accuracy:.3f}, ' +
                  f'cost: {cost:.3f}, (' + f'data_cost: {data_cost:.3f}, ' +
                  f'reg_cost: {regularization_cost:.3f}), ' +
                  f'lr: {optimizer.curr_learning_rate}')

        cost_act.backProp(cost_act.output, y)
        dense2.backProp(cost_act.dinputs)
        activation1.backProp(dense2.dinputs)
        dense1.backProp(activation1.dinputs)

        optimizer.pre_update_params()
        optimizer.update_params(dense1)
        optimizer.update_params(dense2)
        optimizer.post_update_params()

    X_test, y_test = spiral_data(samples=100, classes=3)
    dense1.forwardProp(X_test)
    activation1.forwardProp(dense1.output)
    dense2.forwardProp(activation1.output)

    cost = cost_act.forwardProp(dense2.output, y_test)

    predictions = np.argmax(cost_act.output, axis=1)
    if len(y.shape) == 2:
        y_test = np.argmax(y_test, axis=1)
    accuracy = np.mean(predictions == y_test)

    print(f'validation, acc: {accuracy:.3f}, cost: {cost:.3f}')