Модель Керас не учится вообще - PullRequest
0 голосов
/ 21 декабря 2018

Веса моей модели (я вывожу их на weights_before.txt и weights_after.txt) равны точно до и после тренировки, т. Е. Тренировка ничего не меняет, примерка не происходит.

Мои данные выглядят так (я в основном хочу, чтобы модель предсказывала знак объекта, результат равен 0, если объект отрицательный, 1, если положительный ):

,feature,zerosColumn,result
0,-5,0,0
1,5,0,1
2,-3,0,0
3,5,0,1
4,3,0,1
5,3,0,1
6,-3,0,0
...

Краткое описание моего подхода:

  1. Загрузить данные.
  2. Разделить их по столбцам на x (функция)и y (результат), разделите эти два ряда на наборы test и validation.
  3. Преобразуйте эти наборы в TimeseriesGenerators (в этом сценарии нет необходимости, но я хочу получить эту настройкуработает, и я не вижу причин, почему это не должно).
  4. Создать и скомпилировать простую модель Sequential с несколькими Dense слоями и softmax активацией на ее выходном слое, используйте binary_crossentropyкак функция потерь.
  5. Тренируйте модель ... ничего не происходит!

Полный код следует:

import keras
import pandas as pd
import numpy as np

np.random.seed(570)

TIMESERIES_LENGTH = 1
TIMESERIES_SAMPLING_RATE = 1
TIMESERIES_BATCH_SIZE = 1024
TEST_SET_RATIO = 0.2  # the portion of total data to be used as test set
VALIDATION_SET_RATIO = 0.2  # the portion of total data to be used as validation set
RESULT_COLUMN_NAME = 'feature'
FEATURE_COLUMN_NAME = 'result'

def create_network(csv_path, save_model):
    before_file = open("weights_before.txt", "w")
    after_file = open("weights_after.txt", "w")

    data = pd.read_csv(csv_path)

    data[RESULT_COLUMN_NAME] = data[RESULT_COLUMN_NAME].shift(1)
    data = data.dropna()

    x = data.ix[:, 1:2]
    y = data.ix[:, 3]

    test_set_length = int(round(len(x) * TEST_SET_RATIO))
    validation_set_length = int(round(len(x) * VALIDATION_SET_RATIO))

    x_train_and_val = x[:-test_set_length]
    y_train_and_val = y[:-test_set_length]
    x_train = x_train_and_val[:-validation_set_length].values
    y_train = y_train_and_val[:-validation_set_length].values
    x_val = x_train_and_val[-validation_set_length:].values
    y_val = y_train_and_val[-validation_set_length:].values


    train_gen = keras.preprocessing.sequence.TimeseriesGenerator(
        x_train,
        y_train,
        length=TIMESERIES_LENGTH,
        sampling_rate=TIMESERIES_SAMPLING_RATE,
        batch_size=TIMESERIES_BATCH_SIZE
    )

    val_gen = keras.preprocessing.sequence.TimeseriesGenerator(
        x_val,
        y_val,
        length=TIMESERIES_LENGTH,
        sampling_rate=TIMESERIES_SAMPLING_RATE,
        batch_size=TIMESERIES_BATCH_SIZE
    )
    model = keras.models.Sequential()
    model.add(keras.layers.Dense(10, activation='relu', input_shape=(TIMESERIES_LENGTH, 1)))
    model.add(keras.layers.Dropout(0.2))
    model.add(keras.layers.Dense(10, activation='relu'))
    model.add(keras.layers.Dropout(0.2))
    model.add(keras.layers.Flatten())
    model.add(keras.layers.Dense(1, activation='softmax'))

    for item in model.get_weights():
        before_file.write("%s\n" % item)

    model.compile(
        loss=keras.losses.binary_crossentropy,
        optimizer="adam",
        metrics=[keras.metrics.binary_accuracy]
    )

    history = model.fit_generator(
        train_gen,
        epochs=10,
        verbose=1,
        validation_data=val_gen
    )

    for item in model.get_weights():
        after_file.write("%s\n" % item)

    before_file.close()
    after_file.close()

create_network("data/sign_data.csv", False)

У вас есть идеи?

1 Ответ

0 голосов
/ 21 декабря 2018

Проблема в том, что вы используете softmax в качестве функции активации последнего слоя.По сути, softmax нормализует свой вход, чтобы сделать сумму элементов равной единице.Поэтому, если вы используете его на слое только с одной единицей (т.е. Dense(1,...)), он всегда будет выводить 1. Чтобы исправить это, измените функцию активации последнего слоя на sigmoid, которая выводит значение в диапазоне (0,1).

...