鱼C论坛

 找回密码
 立即注册
楼主: ShuviDoura

[已解决]什么算法可以把图像的纹理特征转化为一个具体的数字

  [复制链接]
 楼主| 发表于 5 天前 | 显示全部楼层
对于一下模型的保存和加载的功能,我要怎么补充:
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_
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
ShuviDoura 发表于 2024-09-03 09:51
对于一下模型的保存和加载的功能,我要怎么补充:
cl ...


要给你的神经网络类`NN`添加保存和加载模型的功能,可以考虑使用Python的`pickle`模块来序列化和反序列化对象。这样,你可以将模型的权重和偏置保存到

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
FishC 发表于 2024-9-3 09:51
要给你的神经网络类`NN`添加保存和加载模型的功能,可以考虑使用Python的`pickle`模块来序列化和反序列 ...

具体怎么写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层


为了在你的神经网络类中加入模型的保存和加载功能,你可以使用Python的`pickle`模块。这个模块可以帮助你将对象序列化(保存到文件)或者反序列化(从文件加载)。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
我保存的模型里是以字典的形式保存得到的w和b的权重数据吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
ShuviDoura 发表于 2024-09-03 09:57
我保存的模型里是以字典的形式保存得到的w和b的权重数 ...


是的,保存模型时通常会将模型的参数(如权重`W`和偏置`b`)存储在一个字典中,这样可以方便地序列化和反序列化。以下是如何

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
那我的字典里有w1,w2,w3以及b1,b2,b3,是代表什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
ShuviDoura 发表于 2024-09-03 09:58
那我的字典里有w1,w2,w3以及b1,b2,b3,是代表什么 ...


字典中的键 `w1`,`w2`,`w3` 以及 `b1`,`b2`,`b3` 通常代表神经网络模型中不同层的权重和偏置。具体来说:

- `w1`, `w2`, `w3`: 这些是网络中各层的权重矩阵。每个`wi`(如`w1`)对应一个特定层的权重。
  
- `b1`, `b2`, `b3`: 这些是网络中各层的偏置向量。每个`bi`(如`b1`)对应一个特定层的偏置。

对于一个简单的多层感知器(MLP)模型:

- `w1` 和 `b1` 可能对应输入层到第一个隐藏层的权重和偏置。
- `w2` 和 `b2` 对应第一个隐藏层到第二个隐藏层。
- `w3` 和 `b3` 则可能对应从最后一个隐藏层到输出层。

具体有多少个这样的`w`和`b`,以及每个的维度,取决于你的网络结构(例如,层数、每层的神经元数量等)。通过保存这些参数,你可以在训练后恢复网络的状态,或者与其他数据集进行测试。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
创建神经网络,21个输入节点,13个隐藏层节点,21个输出层节点,这是有几个输入层几个隐藏层几个输出层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层

创建神经网络,21个输入节点,13个隐藏层节点,21个输出层节点,这是有几个输入层几个隐藏层几个输出层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
ShuviDoura 发表于 2024-09-03 10:09
创建神经网络,21个输入节点,13个隐藏层节点,21个输 ...


你提到的神经网络结构有:

- **1个输入层**:包含21个输入节点。
- **1个隐藏层**:包含13个隐藏层节点。
- **1个输出层**:包含21个输出层节点。

所以,整个网络结构是一层输入层,一层隐藏层和一层输出层。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-8 07:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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