IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> [BPnet识别MNIST07]神经网络的实现以及调优 -> 正文阅读

[人工智能][BPnet识别MNIST07]神经网络的实现以及调优

写在前面

经过周末的休息,脑子得到了足够的休息,所以今天调程序的时候就特别顺利,完成了标准BP神经网络的程序搭建,并且开始了参数的调整,那么今天这篇博客主要分析程序实现以及模型调优的尝试过程。

神经网络

最终我确定下来的神经网络长这样:

在这里插入图片描述
相较于之前的模型,我将神经网络的输入层增加到了2个神经元,一个是图像的熵率,一个是图像的颜色距离,两者的计算方法如下图所示:

def calcuEntImagedist(x):
    x_out = np.zeros(((1, 2)), dtype=float)
    gray_temp = np.zeros((1, 256), dtype=float)

    for i in range(0, 784):
        temp = int(x[i])
        gray_temp[0][temp] = gray_temp[0][temp] + 1

    sum_tmp = float(0)

    for i in range(0, 256):
        gray_temp[0][i] = gray_temp[0][i] / 784

    result = float(0)
    for i in range(0, 256):
        if(gray_temp[0][i] > 0):
            result = result - gray_temp[0][i] * np.log2(gray_temp[0][i])

    # print(result)

    for i in range(0, 784):
        sum_tmp = sum_tmp + x[i]

    sum_tmp = sum_tmp / 784

    temp_s = float(0)
    for i in range(0 ,784):
        temp_s = temp_s + pow((x[i] - sum_tmp), 3)
    temp_s = pow((temp_s/784),(1/3))
    # print(temp_s)

    x_out[0][0] = result
    x_out[0][1] = temp_s
    # print("x_out:", x_out)
    return x_out

熵率的计算方法是先遍历整张图,求出每个像素点的数值,然后计算256个像素点出现的概率,最后计算熵率。图像间像素的距离就是先求像素均值,再求各像素点与均值的距离。

公式推导

修改之后的神经网络公式如下图所示,首先是输入层到输出层的传递公式

在这里插入图片描述

下面是输出层到输入层的梯度表示

在这里插入图片描述
输入层到输出层的程序实现如下图所示,主要通过矩阵乘法实现:

 m = np.dot(input_x, w) - theta_1
 # print(m)
 for i in range(0, 4):
     m[0][i] = sigmoid(m[0][i])
 n = np.dot(m, v) - theta_2
 for i in range(0, 4):
     n[0][i] = sigmoid(n[0][i])
 y_out = np.dot(n, gamma) - theta_3
 y_out = sigmoid(y_out)

输出层到输入层的梯度求导公式的程序实现如下图所示,之前尝试换了一个激励函数ReLU,但是后来发现激励函数换了的话整个梯度求导公式都要换,太麻烦了,所以我还是用回了sigmoid(x):

# update dw,dv,dgama,dtheta_1,dtheta_2,dtheta_3
dtheta_3 = -1 * (y_out - y) * (y_out * (1 - y_out))
for i in range(0, 4):
    dtheta_2[0][i] = -1 * (y_out - y) * (y_out * (1 - y_out)) * gamma[i] * \
                     (n[0][i] * (1 - n[0][i]))
    dgamma[i] = (y_out - y) * (y_out * (1 - y_out)) * n[0][i]
for i in range(0, 4):
    for j in range(0, 4):
        dv[i][j] =  (y_out - y) * (y_out * (1 - y_out)) * (n[0][j] * (1 - n[0][j])) * \
                  gamma[j] * m[0][i]
        dtheta_1[0][i] =  -1 * (y_out - y) * (y_out * (1 - y_out)) * gamma[j] * \
                        (n[0][j] * (1 - n[0][j])) * v[i][j] * (m[0][i] * (1 - m[0][i])) + dtheta_1[0][i]
for i in range(0, 2):
    for j in range(0, 4):
        for k in range(0, 4):
            dw[i][j] = dw[i][j] + (y_out - y) * (y_out * (1 - y_out)) * gamma[k] * \
                      (n[0][i] * (1 - n[0][i])) * v[j][k] * (m[0][i] * (1 - m[0][i])) * input_x[0][i]

# update w,v,gama,theta_1,theta_2,theta_3
for i in range(0, 4):
    for j in range(0, 2):
        w[j][i] = w[j][i] - study_step * dw[j][i]
# print(w)
for i in range(0, 4):
    theta_2[0][i] = theta_2[0][i] + study_step * dtheta_2[0][i]
    theta_1[0][i] = theta_1[0][i] + study_step * dtheta_1[0][i]
    gamma[i] = gamma[i] - study_step * dgamma[i]
for i in range(0, 4):
    for j in range(0, 4):
        v[i][j] = v[i][j] - study_step * dv[i][j]
theta_3 = theta_3 + study_step * dtheta_3

程序结果以及参数调优

先放上我的初始化参数和模型结果,我是针对一张图片进行多次循环求参数

total_n = 60000
# train_aside_n = 48000 #set aside ,0.8-0.2
train_aside_n = 1
study_step = 0.8
epoch = 200
start_rand_max = 0.4

w = np.zeros(((2,4)), dtype=float)#(()) is used to confirm line and row
gamma = np.zeros((4,1), dtype=float)
v = np.zeros((4,4), dtype=float)
theta_1 = np.zeros(((1,4)), dtype=float)
theta_2 = np.zeros(((1,4)), dtype=float)
theta_3 = random.uniform(0,start_rand_max)
m = np.ones(((1,4)), dtype=float)
n = np.ones(((1,4)), dtype=float)

input_x = np.zeros(((1, 2)), dtype=float)
y_out = float(0)

# init para
for i in range(0, 4):  # [1,4]
    gamma[i] = random.uniform(0,start_rand_max)
    theta_1[0][i] = random.uniform(0,start_rand_max)
    theta_2[0][i] = random.uniform(0,start_rand_max)
    for j in range(0, 4):
        v[i][j] = random.uniform(0,start_rand_max)
    for k in range(0, 2):
        w[k][i] = random.uniform(0, start_rand_max)

模型结果:

在这里插入图片描述

模型下降的结果还不是很满意,明天继续调参,探索参数对于神经网络的影响。我还发现调整了初始化的随机数值对于模型结果的影响很大。

在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 11:10:51  更:2021-08-03 11:11:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/22 14:59:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码