鱼C论坛

 找回密码
 立即注册
查看: 2532|回复: 39

[技术交流] 关于bp神经网络的问题

[复制链接]
发表于 2024-9-3 10:18:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我从网上抄了一个代码,但是其中不包含保存模型与加载模型的步骤,那么在这个代码中,我是应该保存W和b的值,还是A和Z的值作为训练模型之后后的保存数据,wb和az各自都是什么,cache又是什么
还有一个问题
# 各层网络神经元的参数
layers = [feature_num, 20, 15, 1]
L = len(layers)
我在定义这个[feature_num, 20, 15, 1]的时候,这四个数据是不是表示我有一个输入层两个含隐藏以及一个输出层吗


class NN():
    def __init__(self, layers, data):

        L = len(layers)  # 这个layers是个包含了输入层到输出层的各层神经元个数的列表
        # 设置神经元权重参数和偏置参数
        self.W = {}
        self.b = {}
        for l in range(1, L):
            # print(layers[l])
            self.W["W" + str(l)] = np.mat(np.random.randn(layers[l], layers[l - 1]) * 0.1)
            self.b["b" + str(l)] = np.mat(np.random.randn(layers[l], 1) * 0.1)
        self.A = {}  # 这个字典里存储了输入,和后面各个层的激活值;输出层的激活值在这个字典的最后一个
        self.Z = {}  # 这个字典里存储了从第二层到输出层的没被激活的值
        self.cache = {}  # 这个字典里存储了https://www.cnblogs.com/pinard/p/6422831.html里面各个层δl的值,第一个是输出层的δ

        # 将数据写入类中
        self.data = data

    def forward_activation_02(self, L, flag):  # 这个L是和上面的L一样的,包含了总共层数

        # 初始化输入
        self.A["A0"] = self.inputs

        for l in range(1, L):
            if flag == 0 or l == 1 or l == L - 1:
                self.Z["Z" + str(l)] = self.W["W" + str(l)] * self.A["A" + str(l - 1)] + self.b["b" + str(l)]
                self.A["A" + str(l)] = sigmoid(self.Z["Z" + str(l)])

            else:
                # 启用dropout正则化
                self.d = np.random.rand(self.A["A" + str(l - 1)].shape[0], self.A["A" + str(l - 1)].shape[1])
                self.d = self.d < keep_prob
                self.A["A" + str(l - 1)] = np.multiply(self.A["A" + str(l - 1)], self.d)
                self.A["A" + str(l - 1)] /= keep_prob

                self.Z["Z" + str(l)] = self.W["W" + str(l)] * self.A["A" + str(l - 1)] + self.b["b" + str(l)]

                self.A["A" + str(l)] = sigmoid(self.Z["Z" + str(l)])

        # 更新cache

        for l in reversed(range(1, L)):
            if l == L - 1:
                self.cache["C" + str(l)] = np.multiply(self.A["A" + str(l)] - self.output,
                                                       dsigmoid(self.Z["Z" + str(l)]))

            else:
                self.cache["C" + str(l)] = np.multiply(self.W["W" + str(l + 1)].T * self.cache["C" + str(l + 1)],
                                                       dsigmoid(self.Z["Z" + str(l)]))

        err = np.abs(self.A["A" + str(L - 1)] - self.output)

        return err

    def backPropagate_02(self, learning_rate, L):  # 反向传播
        alpha = learning_rate
        m = self.inputs.shape[1]  # 这是样本数
        for i in range(L):
            l = L - i - 1
            if l > 0:
                self.b['b' + str(l)] = self.b['b' + str(l)] - alpha * 1.0 / m * (
                            self.cache["C" + str(l)] * np.ones((m, 1)))
                self.W['W' + str(l)] = self.W['W' + str(l)] - alpha * 1.0 / m * (
                            self.cache["C" + str(l)] * self.A["A" + str(l - 1)].T)

    def init_prameter(self, batch_size):
        # 每次批量训练batch_size幅图像
        train_dataloader = DataLoader(self.data, batch_size=batch_size, drop_last=False, shuffle=True)
        for train_data in train_dataloader:
            imgs = train_data.numpy()
        batch_xs, batch_ys = imgs[:, :feature_num], imgs[:, feature_num]
        self.inputs = np.mat(batch_xs).transpose()

        self.output = np.mat(sigmoid(batch_ys))

    def train(self, iterations, learning_rate, L, batch_size, train_shape):
        # 批处理训练

        for i in range(iterations):
            if (train_shape % batch_size) != 0:
                print("batch没选对,要能够被train除进")
            for j in range(int(train_shape / batch_size)):
                self.init_prameter(batch_size)
                err = self.forward_activation_02(L, 1)
                self.backPropagate_02(learning_rate, L)

            #############################每训练一轮就在测试集上进行测试
            asdf, aswe = test_data[:, :feature_num], test_data[:, feature_num]
            self.inputs = np.mat(asdf).transpose()
            self.output = np.mat(sigmoid(aswe))
            test_num = self.output.shape[1]

            test_loss = self.forward_activation_02(L, 0)
            print("在训练集上,第", i, "轮迭代误差为", np.sum(err) / batch_size, "在测试集上,第", i, "轮迭代误差为",
                  np.sum(test_loss) / test_num)

            if np.sum(test_loss) / test_num < 0.02 or i == (iterations - 1):
                true_ = self.output.transpose()
                pred_ = self.A["A" + str(L - 1)].transpose()

                print("测试样本的实际结果:", true_)

                print("测试样本的预测结果:", pred_)

                plt.plot(pred_, label="pred")  # 绘制预测关系图
                plt.legend()
                plt.plot(true_, label="true")  # 绘制预测关系图
                plt.legend()
                plt.show()
                break
        return true_, pred_
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-9-3 10:29:21 | 显示全部楼层
那么我的保存模型是这样写的吗
    def save_model(self, file_path):
        model_data = {
            "weights": self.W,
            "bias": self.b,
        }
        with open(file_path, 'wb') as f:
            pickle.dump(model_data, f)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-9-3 10:30:31 | 显示全部楼层
那么我要如何读取模型并预测新的输入数据值
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-9-3 10:31:41 | 显示全部楼层
FishC 发表于 2024-9-3 10:30
在你的神经网络实现中,要保存和加载模型,关键是要保存和恢复模型的权重 `W` 和偏置 `b`。这些参数定 ...

我加载模型之后,要怎么处理新的输入值,达到预测新的数据的目的
这一部分代码要怎么写
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-9-3 10:42:06 | 显示全部楼层
我保存得到的W1和W2和 W3的数量为什么不一样
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-9-3 15:03:05 | 显示全部楼层
Traceback (most recent call last):
  File "C:\Users\shiro\Desktop\digital image\PKLlook.py", line 200, in <module>
    pred = predict(nn,data) # 前两个是迭代次数和学习率,需要调整这两个参数寻找最优拟合
  File "C:\Users\shiro\Desktop\digital image\PKLlook.py", line 189, in predict
    nn.forward_activation_02(L=len(nn.W), flag=0)  # 假设flag控制是否应用dropout
  File "C:\Users\shiro\Desktop\digital image\PKLlook.py", line 87, in forward_activation_02
    self.Z["Z" + str(l)] = self.W["W" + str(l)] * self.A["A" + str(l - 1)] + self.b["b" + str(l)]
  File "C:\Users\shiro\Desktop\01\python\lib\site-packages\numpy\matrixlib\defmatrix.py", line 218, in __mul__
    return N.dot(self, asmatrix(other))
  File "<__array_function__ internals>", line 200, in dot
ValueError: shapes (20,3) and (500,4) not aligned: 3 (dim 1) != 500 (dim 0)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-10-23 17:16:12 | 显示全部楼层
import pandas as pd

df = pd.read_csv('111111.csv')
报错
@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-10-23 17:17:06 | 显示全部楼层

C:\Users\shiro\Desktop\01\conda\envs\sky01\lib\site-packages\numpy\__init__.py:142: UserWarning: mkl-service package failed to import, therefore Intel(R) MKL initialization ensuring its correct out-of-the box operation under condition when Gnu OpenMP had already been loaded by Python process is not assured. Please install mkl-service package, see http://github.com/IntelPython/mkl-service
  from . import _distributor_init
Traceback (most recent call last):
  File "C:\Users\shiro\Desktop\01\liubian shiyan shujvchuli\date.py", line 1, in <module>
    import pandas as pd
  File "C:\Users\shiro\Desktop\01\conda\envs\sky01\lib\site-packages\pandas\__init__.py", line 16, in <module>
    raise ImportError(
ImportError: Unable to import required dependencies:
numpy:

IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed.

We have compiled some common reasons and troubleshooting tips at:

    https://numpy.org/devdocs/user/troubleshooting-importerror.html

Please note and check the following:

  * The Python version is: Python3.8 from "C:\Users\shiro\Desktop\01\conda\envs\sky01\python.exe"
  * The NumPy version is: "1.22.3"

and make sure that they are the versions you expect.
Please carefully study the documentation linked above for further help.

Original error was: No module named 'numpy.core._multiarray_umath'

ERROR conda.cli.main_run:execute(49): `conda run python C:\Users\shiro\Desktop\01\liubian shiyan shujvchuli\date.py` failed. (See above for error)
@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-11-6 15:19:36 | 显示全部楼层
FishC 发表于 2024-10-23 17:21
如果读取CSV文件时出错,可以尝试以下步骤:

1. **检查文件路径**:确保文件路径正确。如果 `111111 ...

传统的图像识别(选择特征,然后使用分类器分类)和现在流行的卷积神经网络、bp神经网络、深度学习这些有什么本质上的区别
@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-11-27 20:14:45 | 显示全部楼层
能不能不用split方法,用别的方法,把每个通道都转化为一个np矩阵
@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-11-27 20:18:06 | 显示全部楼层
FishC 发表于 2024-11-6 15:45
传统的图像识别和现代的深度学习方法在处理图像的方式上有几点关键区别:

1. **特征提取**:


能不能不用split方法,用别的方法,把一个图像每个通道都转化为一个np矩阵
@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-11-27 20:19:21 | 显示全部楼层
能不能不用split方法,用别的方法,把一个图像每个通道都转化为一个np矩阵
@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-11-28 15:32:33 | 显示全部楼层
读取excel并把所有的数变成一列
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-11-28 15:36:37 | 显示全部楼层
FishC 发表于 2024-11-27 20:24
当然可以!你可以使用OpenCV中的 `cv2.split()` 函数来实现将一个图像分割为每个通道对应的NumPy矩阵。 ...


读取excel并把所有的数变成一列
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-11-28 15:52:43 | 显示全部楼层
FishC 发表于 2024-11-28 15:38
要读取Excel文件并将所有数据变成一列,可以使用 `pandas` 库来实现。以下是一个简单的示例:

并没有变成一列啊,我由很多列我想把这些数都放在一列要怎么做
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-12-26 10:12:43 | 显示全部楼层
FishC 发表于 2024-11-28 16:11
要确保所有数据从多个列中合并到一列中,你可以使用 `pandas` 将数据合并后展平。以下是一个方法来实现 ...

我问一个关于图像识别的问题,也可以不是图像识别,可以手动提取颜色形状纹理特张转化为数据进行数据分类,大概是这样的问题。
首先,我要分的种类似乎有些多,有十几种,有没有什么较新的算法给我推荐,我原本采用提取颜色特征后使用bp神经网络分类,但神经网络对多个分类的效果不好,而且出现了梯度消失问题,w不再更新
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-26 10:14:47 | 显示全部楼层
FishC 发表于 2024-12-26 10:13
对于您所描述的多分类问题和神经网络的挑战,有以下一些建议:

1. **优化神经网络**:

我并不想采用svm,TensorFlow是一个什么原理,我可以使用吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-7 09:58:28 | 显示全部楼层
本文利用ImageNet上预先训练好的VGG 16模型作为特征提取器。VGG 16网络的最后三个全连接层和softmax层被删除,仅保留卷积-激活-池化层。来自CWS视频的每一帧图像都通过基于VGG 16的特征提取器。因此,每个帧图像产生512个特征图。,83个视频通过图像增强变为332个视频,每个14帧,随后的实验数据集划分约为6:2:2。因此,可以提取总共14512个特征图,每个特征图具有224224的维度。
请问,为什么是可以提取总共14512个特征图,和224224的维度。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-7 16:26:31 | 显示全部楼层
特征工程和XGBoost是什么东西
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-11 10:51:05 | 显示全部楼层
CNN+BiLSTM+Attention和CNN+LSTM+Attention是一个东西吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-2 07:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表