我的神经网络只返回0、1或其他常数

时间:2019-06-19 17:10:24

标签: python neural-network

我正在尝试创建一个网络,这将有助于预测第二天的股价。我的输入数据是:开盘价,最高价,最低价和收盘价,数量,指数值,一些技术指标和汇率;输出是第二天的收盘价。我正在使用从Excel文件上传的数据。 我写了一个程序,我将其粘贴在下面,但是它似乎无法正常工作。网络总是返回1、0或其他常数值(介于0到1之间)。 到目前为止,我已采取以下步骤:

  • 试图对数据进行规范化,例如:X_norm = X/(10 ** d),其中d是满足该条件的最小数字:abs(X_norm) < 1。在将它分为训练和测试之前,我在Excel中对整个过程进行了设置。

  • 在将数据划分为训练/测试之前先对其进行混洗,以使学习示例不会连续几天出现

  • 在较小的数据集和示例数据集上运行网络(我生成了随机数,并使用它们作为输出进行了简单的数学运算,并尝试以此运行网络)

  • 改变隐藏神经元的数量

  • 更改迭代次数(最多1000次,考虑到数据集,这对我的计算机来说是很多,所以我不再尝试,因为这会花费太多时间)

  • 改变学习速度。

无论我采取什么步骤,结果始终是相同的。我认为我的问题可能是我没有偏见,但是也许我的代码中还存在其他导致此错误的错误。

我的程序:

import numpy as np
import pandas as pd

df = pd.read_excel(r"path", sheet_name="DATA", index_col=0, header=0)

df = df.to_numpy()
np.random.shuffle(df)

X_data = df[:, 0:15]
X_data = X_data.reshape(1000, 1, 15)
print(f"X_data: {X_data}")

Y_data = df[:, 15]
Y_data = Y_data.reshape(1000, 1, 1)
print(f"Y_data: {Y_data}")

X = X_data[0:801]
x_test = X_data[801:]

y = Y_data[0:801]
y_test = Y_data[801:]

print(f"X_train: {X}")
print(f"x_test: {x_test}")
print(f"Y_train: {y}")
print(f"y_test: {y_test}")

rate = 0.2


class NeuralNetwork:
    def __init__(self):
        self.input_neurons = 15
        self.hidden1_neurons = 10
        self.hidden2_neurons = 5
        self.output_neuron = 1
        self.input_to_hidden1_w = (np.random.random((self.input_neurons, self.hidden1_neurons)))        # 14x30
        self.hidden1_to_hidden2_w = (np.random.random((self.hidden1_neurons, self.hidden2_neurons)))    # 30x20
        self.hidden2_to_output_w = (np.random.random((self.hidden2_neurons, self.output_neuron)))       # 20x1

    def activation(self, x):
        sigmoid = 1/(1+np.exp(-x))
        return sigmoid

    def activation_d(self, x):
        derivative = x * (1 - x)
        return derivative

    def feed_forward(self, X):
        self.z1 = np.dot(X, self.input_to_hidden1_w)
        self.z1_a = self.activation(self.z1)

        self.z2 = np.dot(self.z1_a, self.hidden1_to_hidden2_w)
        self.z2_a = self.activation(self.z2)

        self.z3 = np.dot(self.z2_a, self.hidden2_to_output_w)
        output = self.activation(self.z3)
        return output

    def backward(self, X, y, rate, output):
        error = y - output
        z3_error_delta = error * self.activation_d(output)

        z2_error = np.dot(z3_error_delta, np.transpose(self.hidden2_to_output_w))
        z2_error_delta = z2_error * self.activation_d(self.z2)

        z1_error = np.dot(z2_error_delta, np.transpose(self.hidden1_to_hidden2_w))
        z1_error_delta = z1_error * self.activation_d(self.z1)

        self.input_to_hidden1_w += rate * np.dot(np.transpose(X), z1_error_delta)
        self.hidden1_to_hidden2_w += rate * np.dot(np.transpose(self.z1), z2_error_delta)
        self.hidden2_to_output_w += rate * np.dot(np.transpose(self.z2), z3_error_delta)

    def train(self, X, y):
        output = self.feed_forward(X)
        self.backward(X, y, rate, output)

    def save_weights(self):
        np.savetxt("w1.txt", self.input_to_hidden1_w, fmt="%s")
        np.savetxt("w2.txt", self.hidden1_to_hidden2_w, fmt="%s")
        np.savetxt("w3.txt", self.hidden2_to_output_w, fmt="%s")

    def check(self, x_test, y_test):
        self.feed_forward(x_test)
        np.mean(np.square((y_test - self.feed_forward(x_test))))


Net = NeuralNetwork()

for l in range(100):
    for i, pattern in enumerate(X):
        for j, outcome in enumerate(y):
            print(f"#: {l}")
            print(f'''
            # {str(l)}
            # {str(X[i])}
            # {str(y[j])}''')
            print(f"Predicted output: {Net.feed_forward(X[i])}")
            Net.train(X[i], y[j])
print(f"Error training: {(np.mean(np.square(y - Net.feed_forward(X))))}")

Net.save_weights()

for i, pattern in enumerate(x_test):
    for j, outcome in enumerate(y_test):
        Net.check(x_test[i], y_test[j])
print(f"Error test: {(np.mean(np.square(y_test - Net.feed_forward(x_test))))}")

0 个答案:

没有答案