gpt4 book ai didi

python - Keras 模型根本不学习

转载 作者:行者123 更新时间:2023-11-30 09:32:03 25 4
gpt4 key购买 nike

我的模型权重(我将它们输出到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com