我写了一个神经网络模型,但是它的准确率只有在权重取特定值时才会增加

2024-10-01 00:23:05 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,基本上,如果初始随机分配的权重在一个范围内,例如w0,大约在0.4到-0.4之间,那么它们会发生变化,精确度也会提高。但是,如果为权重分配了一个超出此范围的随机数,则它们将根本不会更改。我想不出来。任何建议都很好:)

import numpy as np
from matplotlib import pyplot as plt

class NN_model:

    def __init__(self, data):
        self.data = data
        self.w0 = np.random.randn()
        self.w1 = np.random.randn()
        self.bias = np.random.randn()
        self.trained = False

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

    def sigmoid_p(self, x):
        return self.sigmoid(x) * (1 - self.sigmoid(x))

    def calculate_loss(self, pred, target):
        loss = np.square(target - pred)
        return loss

    def training_loop(self, data):
        costs = []
        learning_rate = 0.005
        print(self.w0)
        if self.trained == True:
            print('Model already trained')
            pass
        else:
            for i in range(50):
                for i in range(100000):
                    ri = np.random.randint(len(data))
                    point = data[ri]

                    sig_out = ((self.w0 * point[0]) + (self.w1 * point[1]) + self.bias)
                    pred = self.sigmoid(sig_out)

                    cost = self.calculate_loss(pred, point[2])
                    costs.append(cost)
                    dcost_dpred = 2 * (pred - point[2])
                    dpred_dsigout = self.sigmoid_p(sig_out)
                    dsigout_dw0 = point[0]
                    dsigout_dw1 = point[1]
                    dsigout_dbias = 1

                    dcost_dw0 = dcost_dpred * dpred_dsigout * dsigout_dw0
                    dcost_dw1 = dcost_dpred * dpred_dsigout * dsigout_dw1
                    dcost_dbias = dcost_dpred * dpred_dsigout * dsigout_dbias

                    self.w0 += - learning_rate * dcost_dw0
                    self.w1 += - learning_rate * dcost_dw0
                    self.bias += - learning_rate * dcost_dbias


                print(self.w0, self.w1, self.bias)
                #-0.0752623452445784 0.2447376547554179 4.032995041915469
                #-0.3042823068224879 0.015717693177505765 18.643149928253827

            self.trained = True
        plt.plot(costs)
        plt.show()


    def predict(self, test_data):
        if self.trained == True:
            pred = self.sigmoid( (test_data[0] * self.w0) + (test_data[1] * self.w1) + self.bias )
            print(pred)
            if pred > 0.5:
                print('Woman')
            else:
                print('Man')
        else:
            print('Error: Model has not been trained yet')

Tags: selfdatadefnpw1pointprintpred
1条回答
网友
1楼 · 发布于 2024-10-01 00:23:05

你必须对神经网络在幕后的工作有直观的理解。没有经验法则来决定你体重的最佳值

你的初始体重可能会让你很快接近准确度,但在你的例子中,当你在学习率=0.005的大范围内进行体重测量时,你的体重可能需要一段时间才能降低。因此,学习率也起着至关重要的作用。试着调整一下

相关问题 更多 >