【问题标题】:One-hot vector prediction always returns the same valueOne-hot 向量预测总是返回相同的值
【发布时间】:2018-01-07 23:33:20
【问题描述】:

我的深度神经网络为每个输入返回相同的输出。我尝试了(没有运气)不同的变体:

  • 损失
  • 优化器
  • 网络拓扑/层类型
  • epoch 数 (1-100)

我有 3 个输出(单热),对于每个输入输出,它们都像(每次训练后都会改变):

4.701869785785675049e-01 4.793547391891479492e-01 2.381391078233718872e-01

这个问题的发生可能是因为我的训练数据(股票预测)的高度随机性。

数据集也严重转向其中一个答案(这就是我使用 sample_weight 的原因 - 按比例计算)。

我认为我可以排除过度拟合(即使 1 个 epoch 也会发生这种情况,并且我有 dropout 层)。

我的网络的一个例子:

xs_conv = xs.reshape(xs.shape[0], xs.shape[1], 1)
model_conv = Sequential()
model_conv.add(Conv1D(128, 15, input_shape=(input_columns,1), activation='relu'))
model_conv.add(MaxPooling1D(pool_size=3))
model_conv.add(Dropout(0.4))
model_conv.add(Conv1D(64, 15, input_shape=(input_columns,1), activation='relu'))
model_conv.add(MaxPooling1D(pool_size=3))
model_conv.add(Dropout(0.4))
model_conv.add(Flatten())
model_conv.add(Dense(128, activation='relu'))
model_conv.add(Dropout(0.4))
model_conv.add(Dense(3, activation='sigmoid'))

model_conv.compile(loss='mean_squared_error', optimizer='nadam', metrics=['accuracy'])
model_conv.fit(xs_conv, ys, epochs=10, batch_size=16, sample_weight=sample_weight, validation_split=0.3, shuffle=True)

如果输出是随机的,我会理解,但发生的事情似乎很奇怪。有什么想法吗?

数据:computed.csv

完整代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from keras.layers import Input, Dense, Conv1D, Dropout, MaxPooling1D, Flatten
from keras.models import Model, Sequential
from keras import backend as K
import random

DATA_DIR = '../../Data/'
INPUT_DATA_FILE = DATA_DIR + 'computed.csv'

def get_y(row):
    profit = 0.010
    hot_one = [0,0,0]
    hot_one[0] = int(row.close_future_5 >= profit)
    hot_one[1] = int(row.close_future_5 <= -profit)
    hot_one[2] = int(row.close_future_5 < profit and row.close_future_10 > -profit)
    return hot_one

def rolling_window(window, arr):
    return [np.array(arr[i:i+window]).transpose().flatten().tolist() for i in range(0, len(arr))][0:-window+1]

def prepare_data(data, widnow, test_split):
    xs1 = data.iloc[:,1:26].as_matrix()
    ys1 = [get_y(row) for row in data.to_records()]
    xs = np.array(rolling_window(window, xs1)).tolist()
    ys = ys1[0:-window+1]
    zipped = list(zip(xs, ys))
    random.shuffle(zipped)

    train_size = int((1.0 - test_split) * len(data))

    xs, ys = zip(*zipped[0:train_size])
    xs_test, ys_test = zip(*zipped[train_size:])
    return np.array(xs), np.array(ys), np.array(xs_test), np.array(ys_test)

def get_sample_weight(y):
    if(y[0]): return ups_w
    elif(y[1]): return downs_w
    else: return flats_w

data = pd.read_csv(INPUT_DATA_FILE)
window = 30
test_split = .9

xs, ys, xs_test, ys_test = prepare_data(data, window, test_split)

ups_cnt = sum(y[0] for y in ys)
downs_cnt = sum(y[1] for y in ys)
flats_cnt = sum(y[0] == False and y[1] == False for y in ys)
total_cnt = ups_cnt + downs_cnt + flats_cnt
ups_w = total_cnt/ups_cnt
downs_w = total_cnt/downs_cnt
flats_w = total_cnt/flats_cnt

sample_weight = np.array([get_sample_weight(y) for y in ys])

_, input_columns = xs.shape


xs_conv = xs.reshape(xs.shape[0], xs.shape[1], 1)
model_conv = Sequential()
model_conv.add(Conv1D(128, 15, input_shape=(input_columns,1), activation='relu'))
model_conv.add(MaxPooling1D(pool_size=3))
model_conv.add(Dropout(0.4))
model_conv.add(Conv1D(64, 15, input_shape=(input_columns,1), activation='relu'))
model_conv.add(MaxPooling1D(pool_size=3))
model_conv.add(Dropout(0.4))
model_conv.add(Flatten())
model_conv.add(Dense(128, activation='relu'))
model_conv.add(Dropout(0.4))
model_conv.add(Dense(3, activation='sigmoid'))

model_conv.compile(loss='mean_squared_error', optimizer='nadam', metrics=['accuracy'])
model_conv.fit(xs_conv, ys, epochs=1, batch_size=16, sample_weight=sample_weight, validation_split=0.3, shuffle=True)

xs_test_conv = xs_test.reshape(xs_test.shape[0], xs_test.shape[1], 1)
res = model_conv.predict(xs_test_conv)

plotdata = pd.concat([pd.DataFrame(res, columns=['res_up','res_down','res_flat']), pd.DataFrame(ys_test, columns=['ys_up','ys_down','y_flat'])], axis = 1)

plotdata[['res_up', 'ys_up']][3000:3500].plot(figsize=(20,4))
plotdata[['res_down', 'ys_down']][3000:3500].plot(figsize=(20,4))

【问题讨论】:

  • 能否提供数据重现?
  • @Maxim 我附上了数据以及整个代码
  • 嗯...你真的用这些数据运行它吗?第 623 行有一个 inf。
  • 是的,我有。结果证明这是问题的根源。

标签: neural-network deep-learning keras bigdata conv-neural-network


【解决方案1】:

我已经用附加的数据运行了你的模型,到目前为止可以说最大的问题是缺乏数据清理。

例如,在第 623 行的 .csv 中有一个 inf 值。在我将它们全部过滤掉之后

xs1 = xs1[np.isfinite(xs1).all(axis=1)]

...我收集了一些关于xs 的统计数据,即最小值、最大值和平均值。结果他们非常了不起:

-43.0049723138
32832.3333333    # !!!
0.213126234391

平均而言,这些值接近0,但有些值高出 6 个数量级。这些特定的行肯定会损害神经网络,因此您应该将它们也过滤掉,或者想出一种巧妙的方法来规范化特征。

但即使使用了它们,该模型最终的验证准确率也达到了 71-79%。结果分布有点偏向第 3 类,但总的来说,将其命名为 奇特:19% 为第 1 类,7% 为第 2 类,73% 为第 3 类。示例测试输出:

[[  1.93120316e-02   4.47684433e-04   9.97518778e-01]
 [  1.40607255e-02   2.45630667e-02   9.74113524e-01]
 [  3.07740629e-01   4.80920941e-01   2.28664145e-01]
 ..., 
 [  5.72797097e-02   9.45571139e-02   8.07634115e-01]
 [  1.05512664e-01   8.99530351e-02   6.70437515e-01]
 [  5.24505274e-03   1.46622911e-01   9.42657173e-01]]

【讨论】:

  • 非常感谢!我只浏览了数据,它似乎是合法的(初学者的错误)。该网络在不同(和更小)的子样本上运行良好。我没有想到,数据在更大的样本上可能会损坏,并且可能导致网络出现如此奇怪的行为。再次感谢。
猜你喜欢
  • 2018-09-24
  • 2020-01-09
  • 1970-01-01
  • 2019-07-14
  • 2022-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多