husky66 2021-03-10 16:15 采纳率: 33.3%
浏览 58

数据变化较小,BP神经网络怎么拟合

def BP_Net(x, y, lr=0.01, hidden=20, loop=2000):
    X = tf.compat.v1.placeholder(tf.float32, [None, 1])
    Y = tf.compat.v1.placeholder(tf.float32, [None, 1])

    # 输入层到隐藏层
    W1 = tf.compat.v1.Variable(tf.compat.v1.random_normal([1, hidden]))
    B1 = tf.compat.v1.Variable(tf.compat.v1.zeros([1, hidden]))
    L1 = tf.compat.v1.nn.tanh(tf.matmul(X, W1) + B1)

    # 隐藏层到输出层
    W2 = tf.compat.v1.Variable(tf.compat.v1.random_normal([hidden, 1]))
    B2 = tf.compat.v1.Variable(tf.compat.v1.zeros([1, 1]))
    L2 = tf.matmul(L1, W2) + B2

    # 二次代价函数
    loss = tf.reduce_mean(tf.square(Y - L2))
    # 梯度下降法
    train_step = tf.compat.v1.train.GradientDescentOptimizer(lr).minimize(loss)

    with tf.compat.v1.Session() as sess:
        sess.run(tf.compat.v1.global_variables_initializer())
        for i in range(loop):
            sess.run(train_step, feed_dict={X: x, Y: y})
            loss1 = sess.run(loss, feed_dict={X: x, Y: y})
            print(f"loss:{loss1}")
        predict = sess.run(L2, feed_dict={X: x})
        print(f"predict:{predict}")
        picture(x, y, predict)

def picture(x, y, predict):
    plt.figure()
    plt.plot(x, y, label="原始数据")
    plt.plot(x, predict, label="预测数据")
    plt.legend()
    plt.show()


if __name__ == "__main__":
    X = np.array(list(np.arange(19, 20, 0.01))).reshape([-1, 1])
    Y = (X * X + 1).reshape([-1, 1])
    # 归一化
    # min_max_scaler = MinMaxScaler()
    # Y = min_max_scaler.fit_transform(Y)

    BP_Net(X, Y, lr=0.001, hidden=20, loop=4000)

像X这种数据变化较小,用BP神经网络怎么调参数都不行,都不能拟合

这种情况怎么办?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-24 08:52
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在给定的数据中,我们可以看到模型的预测值与真实值之间的差距非常大。这可能意味着模型没有足够的训练数据来学习正确的权重和偏置值。为了提高模型的性能,我们需要增加更多的训练数据,并调整模型的学习率。

    以下是修改后的代码示例:

    def BP_Net(x, y, lr=0.01, hidden=20, loop=2000):
        X = tf.compat.v1.placeholder(tf.float32, [None, 1])
        Y = tf.compat.v1.placeholder(tf.float32, [None, 1])
    
        # 输入层到隐藏层
        W1 = tf.compat.v1.Variable(tf.compat.v1.random_normal([1, hidden]))
        B1 = tf.compat.v1.Variable(tf.compat.v1.zeros([1, hidden]))
        L1 = tf.compat.v1.nn.tanh(tf.matmul(X, W1) + B1)
    
        # 隐藏层到输出层
        W2 = tf.compat.v1.Variable(tf.compat.v1.random_normal([hidden, 1]))
        B2 = tf.compat.v1.Variable(tf.compat.v1.zeros([1, 1]))
        L2 = tf.matmul(L1, W2) + B2
    
        # 二次代价函数
        loss = tf.reduce_mean(tf.square(Y - L2))
        # 梯度下降法
        train_step = tf.compat.v1.train.GradientDescentOptimizer(lr).minimize(loss)
    
        with tf.compat.v1.Session() as sess:
            sess.run(tf.compat.v1.global_variables_initializer())
            for i in range(loop):
                sess.run(train_step, feed_dict={X: x, Y: y})
                loss1 = sess.run(loss, feed_dict={X: x, Y: y})
                print(f"loss:{loss1}")
            predict = sess.run(L2, feed_dict={X: x})
            print(f"predict:{predict}")
            picture(x, y, predict)
    
    def picture(x, y, predict):
        plt.figure()
        plt.plot(x, y, label="原始数据")
        plt.plot(x, predict, label="预测数据")
        plt.legend()
        plt.show()
    
    if __name__ == "__main__":
        X = np.array(list(np.arange(19, 20, 0.01))).reshape([-1, 1])
        Y = (X * X + 1).reshape([-1, 1])
        # 归一化
        # min_max_scaler = MinMaxScaler()
        # Y = min_max_scaler.fit_transform(Y)
    
        # 增加更多的训练数据
        num_data = len(X)
        new_X = np.concatenate((X, np.random.normal(loc=0, scale=0.1, size=(num_data, 1))), axis=0)
        new_Y = (new_X * new_X + 1).reshape([-1, 1])
    
        # 调整模型的学习率
        lr = 0.001
        hidden = 20
    
        BP_Net(new_X, new_Y, lr, hidden, loop=4000)
    

    在这个例子中,我们首先使用了更大的训练数据集,并且通过添加随机噪声来模拟更复杂的情况。然后,我们将学习率设置为0.001,这样可以使模型更容易收敛。

    请注意,这个方法可能会导致过拟合,因此在实际应用中,你可能需要尝试不同的学习率、迭代次数或其他超参数以找到最佳的模型结构。

    评论

报告相同问题?