Спиральная проблема, почему моя потеря увеличивается в этой нейронной сети с использованием Keras? - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь решить проблему спирали, используя Keras с 3 спиралями вместо 2, используя аналогичную стратегию, которую я использовал для 2. Проблема в том, что моя потеря теперь растет в геометрической прогрессии, а не уменьшается с теми же параметрами, которые я использовал для 2 спиралей (Структура нейронной сети имеет 3 выхода вместо двоичных). Я не совсем уверен, что может случиться с этой проблемой, если кто-нибудь может помочь? Я пробовал это с разными эпохами, темпами обучения, размерами партий.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.optimizers import RMSprop

from Question1.utils import create_neural_network, create_test_data

EPOCHS = 250
BATCH_SIZE = 20


def main():
    df = three_spirals(1000)

    # Set-up data
    x_train = df[['x-coord', 'y-coord']].values
    y_train = df['class'].values

    # Don't need y_test, can inspect visually if it worked or not
    x_test = create_test_data()

    # Scale data
    scaler = MinMaxScaler()
    scaler.fit(x_train)
    x_train = scaler.transform(x_train)
    x_test = scaler.transform(x_test)

    relu_model = create_neural_network(layers=3,
                                       neurons=[40, 40, 40],
                                       activation='relu',
                                       optimizer=RMSprop(learning_rate=0.001),
                                       loss='categorical_crossentropy',
                                       outputs=3)

    # Train networks
    relu_model.fit(x=x_train, y=y_train, epochs=EPOCHS, verbose=1, batch_size=BATCH_SIZE)

    # Predictions on test data
    relu_predictions = relu_model.predict_classes(x_test)

    models = [relu_model]
    test_predictions = [relu_predictions]

    # Plot
    plot_data(models, test_predictions)

А вот функция create_neural_network:

def create_neural_network(layers, neurons, activation, optimizer, loss, outputs=1):
    if layers != len(neurons):
        raise ValueError("Number of layers doesn't much the amount of neuron layers.")

    model = Sequential()

    for i in range(layers):
        model.add(Dense(neurons[i], activation=activation))

    # Output
    if outputs == 1:
        model.add(Dense(outputs))
    else:
        model.add(Dense(outputs, activation='softmax'))

    model.compile(optimizer=optimizer,
                  loss=loss)

    return model

1 Ответ

0 голосов
/ 01 апреля 2020

Я разработал это, для выходных данных это не похоже на двоичную классификацию, где вам нужен только один столбец. Для мультиклассификации вам нужен столбец для каждого класса, который вы хотите классифицировать ... поэтому, где у меня был y, может быть 0, 1, 2 было неверно Правильный способ сделать это было бы иметь y0, y1, y2, который был бы равен 1, если бы он соответствовал указанному классу c, и 0, если он не соответствовал.

...