python - Keras 模型根本不学习

标签 python machine-learning keras neural-network classification

我的模型权重(我将它们输出到 weights_before.txtweights_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 (结果),将这两个行按行拆分为 testvalidation套。
  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)

你有什么想法吗?

最佳答案

问题是您使用 softmax 作为最后一层的激活函数。本质上,softmax 对其输入进行归一化,以使元素之和为 1。因此,如果您在只有一个单元的层上使用它(即 Dense(1,...)),那么它将始终输出 1。要解决此问题,请更改最后一层的激活函数到 sigmoid,输出 (0,1) 范围内的值。

关于python - Keras 模型根本不学习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53876097/

相关文章:

csv - 如何更改WEKA中的属性类型?

python - 如何在 Keras 中解码来自深度自动编码器的编码数据(教程中不明确)

python - 读取 MySQL 转储的库?

python - 从 xcode 宏运行 python 脚本时如何使用我的标准 python 路径

pandas - python 如何选择每个用户最新的样本作为测试数据?

tensorflow - 如何使用自定义优化器加载 keras 保存的模型

python - “RandomForestClassifier”对象没有属性 'layers'

python - 如何从列表列表中删除 [NaN]?

python - 在 Anaconda/NLTK 中找不到 Genia Tagger 文件错误

machine-learning - 在优化器步骤之前调整损失