BP神经网络预测改哪里使其匹配,并且绘制预测值和真实值的反归一化图


import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler

#读取文件
#导入训练集
df_iris_train=pd.read_excel('E:\\秦皇岛海上平台项目\\秦皇岛32-6油田数据\\分类后的数据\\I平台\\电潜泵\\I01H-神经网络.xlsx')
#导入测试集
df_iris_test=pd.read_excel('E:\\秦皇岛海上平台项目\\秦皇岛32-6油田数据\\分类后的数据\\I平台\\电潜泵\\I02H1-神经网络.xlsx')

#将测试集和训练集转换为nupmy数组
iris_train=np.array(df_iris_train)
iris_test=np.array(df_iris_test)

#数据预处理
#将训练集和测试集中的输入端和输出端分开
x_train=iris_train[:,0:8]
y_train=iris_train[:,8:12]

x_test=iris_test[:,0:8]
y_test=iris_test[:,8:12]

#进行标准化处理,使其均值为0
x_train=x_train-np.mean(x_train,axis=0)
x_test=x_test-np.mean(x_test,axis=0)

#tf.cast将输入端由64位浮点数转换为32位浮点数,tf.one_hot将输出端转换为独热编码的形式
X_train=tf.cast(x_train,tf.float32)
Y_train=tf.one_hot(tf.constant(y_train,dtype=tf.int32),3)

X_test=tf.cast(x_test,tf.float32)
Y_test=tf.one_hot(tf.constant(y_test,dtype=tf.int32),3)

# BP神经网络参数设置
#学习率
learn_rate=0.5

#迭代次数
iter=60000

#显示间隔
display_step=600

#设置模型参数初始值
np.random.seed(612)
W1=tf.Variable(np.random.randn(8,16),dtype=tf.float32)   #np.random.randn(4,16)为设置W1为4行、16列的二维张量取正态分布的随机值为初始值
B1=tf.Variable(np.zeros([16]),dtype=tf.float32)    #np.zeros([16])为设置b1为一维张量,初始值全为0
W2=tf.Variable(np.random.randn(16,4),dtype=tf.float32)
B2=tf.Variable(np.zeros([4]),dtype=tf.float32)

# 定义四个空列表,分别记录训练集和测试集的准确率和交叉熵损失
#准确率
acc_train=[]
acc_test=[]
#交叉熵损失
cce_train=[]
cce_test=[]

for i in range(0,iter+1):
    with tf.GradientTape() as tape:
        #训练集隐藏层的输出,使用relu作为激活函数
        Hidden_train=tf.nn.relu(tf.matmul(X_train,W1)+B1)
        #训练集输出层的输出,使用softmax作为激活函数
        PRED_train=tf.nn.softmax(tf.matmul(Hidden_train,W2)+B2)
        #训练集交叉熵损失
        Loss_train=tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_true=Y_train,y_pred=PRED_train))

        #测试集隐藏层的输出
        Hidden_test = tf.nn.relu(tf.matmul(X_test, W1) + B1)
        #测试集输出层的输出
        PRED_test=tf.nn.softmax(tf.matmul(Hidden_test,W2)+B2)
        #计算测试集交叉熵损失(损失函数)
        Loss_test=tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_true=Y_test,y_pred=PRED_test))

    #训练集和测试集的准确率
    accuracy_train=tf.reduce_mean(tf.cast(tf.equal(tf.argmax(PRED_train.numpy(),axis=1),y_train),tf.float32))
    accuracy_test=tf.reduce_mean(tf.cast(tf.equal(tf.argmax(PRED_test.numpy(),axis=1), y_test),tf.float32))

    #追加交叉熵损失
    cce_train.append(Loss_train)
    cce_test.append(Loss_test)
    #追加准确率
    acc_train.append(accuracy_train)
    acc_test.append(accuracy_test)

    #反向传播
    #使用训练集数据分别获得损失函数对W1,B1,W2,B2的偏导数
    grads=tape.gradient(Loss_train,[W1,B1,W2,B2])
    #分别更新W和B
    W1.assign_sub(learn_rate*grads[0])
    B1.assign_sub(learn_rate*grads[1])
    W2.assign_sub(learn_rate * grads[2])
    B2.assign_sub(learn_rate * grads[3])

    #记录实时
    if i % display_step == 0:
        print('i:%i, TrainAcc:%f,  TrainLoss:%f,TestAcc:%f,  TestLoss:%f' % (i, accuracy_train,Loss_train,accuracy_test,Loss_test))

plt.figure(figsize=(10,3))

plt.subplot(121)
plt.plot(cce_train,color='blue',label='train')
plt.plot(cce_test,color='red',label='test')
plt.xlabel('Iteration')
plt.ylabel('Loss')
plt.legend()

plt.subplot(122)
plt.plot(acc_train,color='blue',label='train')
plt.plot(acc_test,color='red',label='test')
plt.xlabel('Iteration')
plt.ylabel('Accuracy')
plt.legend()

plt.show()
Traceback (most recent call last):
  File "E:\pythonProject2\QHD32-6\BP神经网络预测\实现多层神经网络——电潜泵.py", line 70, in <module>
    Loss_train=tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_true=Y_train,y_pred=PRED_train))
  File "F:\Anaconda3\lib\site-packages\tensorflow\python\util\traceback_utils.py", line 153, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "F:\Anaconda3\lib\site-packages\keras\losses.py", line 1984, in categorical_crossentropy
    return backend.categorical_crossentropy(
  File "F:\Anaconda3\lib\site-packages\keras\backend.py", line 5559, in categorical_crossentropy
    target.shape.assert_is_compatible_with(output.shape)
ValueError: Shapes (172, 4, 3) and (172, 4) are incompatible

【以下回答由 GPT 生成】

首先,非常感谢您的提问。我确实可以为您提供一些关于优化BP神经网络的建议。

以下是一些建议和方法:

  1. 数据预处理:确保对输入数据进行归一化或标准化处理,以便更好地适应神经网络的训练。这可以提高收敛速度并减少训练时间。

  2. 调整学习率:学习率是训练神经网络时非常重要的超参数。过高的学习率会导致训练不稳定,而过低的学习率会导致收敛速度过慢。可以通过设置合适的学习率来提高神经网络的性能。

  3. 激活函数选择:选择合适的激活函数可以改善神经网络的表达能力和性能。常用的激活函数包括Sigmoid、ReLU和Tanh等。根据具体的问题和网络结构选择合适的激活函数。

  4. 权重初始化:正确的权重初始化可以避免神经网络陷入局部最优解。比较常用的初始化方法包括随机初始化和Xavier初始化。根据具体情况选择合适的初始化方法。

  5. 增加正则化:为了防止神经网络出现过拟合问题,可以使用正则化方法,如L1或L2正则化。这样可以减少神经网络的复杂度并提高泛化能力。

  6. 调整网络结构:通过增加或减少隐藏层的数量和每层的神经元数量,可以改善神经网络的性能。可以根据实验结果不断调整网络结构。

  7. 批量归一化:批量归一化是一种广泛应用的技术,可以加速收敛并提高训练稳定性。它可以将每一层的输入进行归一化,防止梯度消失或梯度爆炸。

  8. 使用优化算法:标准的BP算法可能会陷入局部最优解,可以尝试使用更先进的优化算法来改进网络的训练。常用的优化算法包括随机梯度下降(SGD)、动量法、Adam等。

以上是一些常用的优化方法和技巧,可以根据具体问题进行尝试。希望以上建议对您有所帮助。如果您还有任何问题或需要进一步的帮助,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^