设计并实现一个3层全连接神经网络,实现鸢尾花数据集分类,要求:不能使用模型,仅使用numpy手动求导+梯度下降法实现

设计并实现一个3层全连接神经网络,实现鸢尾花数据集分类,要求:不能使用模型,仅使用numpy手动求导+梯度下降法实现,第1张

from matplotlib import pyplot as plt
import numpy as np
from sklearn import datasets, model_selection
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号 #有中文出现的情况,需要u'内容'

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


#对y进行二值化处理
def y_init(y):
    Y = y
    y_set = set(y)
    y = np.array([y] * len(y_set))
    j = 0
    for i in y_set:
        y[j][np.where(Y == i)] = 1
        y[j][np.where(Y != i)] = 0
        j += 1
        pass
    y = y.T
    return y

#将最后输出变换成one_hot
def y_handle(r_y):
    j = 0
    for i in np.argmax(r_y, axis=1):
        r_y[j, :] = 0
        r_y[j, i] = 1
        j += 1
    return r_y

#求得最后输出层输出
def forward(x, w, v):
    alpha = x.dot(v)  # 隐层神经元输入
    b_h = sigmoid(alpha)  # 隐层神经元输出
    beta = b_h.dot(w)
    r_y = sigmoid(beta)
    return r_y

#训练参数
def train(x, y, epcho, w, v):
    k = 0
    eta = 0.01
    acc = []
    while k < epcho:
        alpha = x.dot(v).astype(np.float64)  # 隐层神经元输入0
        b_h = sigmoid(alpha).astype(np.float64)  # 隐层神经元输出
        beta = b_h.dot(w).astype(np.float64)  # 输出层输入
        r_y = sigmoid(beta).astype(np.float64)  # 输出层输出
        g = r_y * (1 - r_y) * (y - r_y)  # 150*3
        e = b_h * (1 - b_h) * g.dot(w.T)  # 150*8

        w = w + eta * b_h.T.dot(g)
        v = v + eta * x.T.dot(e)


        prec_y = y_handle(r_y)

        acc.append(accuracy(y, prec_y))

        k += 1
    return w, v, acc

#求得训练参数
def net(x, y, hidden_num, epcho):
    v = np.random.random((x.shape[1], hidden_num))
    w = np.random.random((hidden_num, y.shape[1]))
    w, v, acc = train(x, y, epcho, w, v)
    prec_y = forward(x, w, v)
    prec_y = y_handle(prec_y)

    acc.append(accuracy(y, prec_y))
    return prec_y, w, v, acc, accuracy(y, prec_y)


#求出精确度
def accuracy(acts, pres):
    acc = 0
    for i in range(acts.shape[0]):
        for j in range(acts.shape[1]):
            if acts[i, j] == pres[i, j]:
                if j == (acts.shape[1] - 1):
                    acc += 1
            else:
                break

    acc = acc / acts.shape[0]

    return acc


iris = datasets.load_iris()
x = iris.data  # 150*4
y = y_init(iris.target)  # 150*1
train_data, test_data, train_label, test_label = model_selection.train_test_split(x, y, test_size=0.3, random_state=0)

epcho = 5000
train_prec_y, w, v, acc, A = net(train_data, train_label, 8, epcho)

prec_y = y_handle(forward(test_data, w, v))
accur = accuracy(test_label, prec_y)
print(accur)
plt.plot(acc)

plt.xlabel("迭代次数")
plt.ylabel("精确度")
plt.show()

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/718915.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存