这一周的收获与总结_BP

这一周主要用CUDA实现了BP前馈神经网络,但是一路也遇到了很多问题。

1. 批梯度下降时修改权值与偏置时候没有将累积的误差项/偏置项除以总样本数,导致每次修改值远远大于真实值,程序最后全1或全0. 我最后用matlab运行时候,结合李春光老师的神经计算课件找到了这个bug

2.CUDA运行多块多线程并行核函数时候,没有考虑到有密切前后运算逻辑关系又同时索引不严格相同的两个矩阵运算不能放在同一个核函数执行,因为每个线程执行的速度不一样。你可能在用到err值得时候,那个线程还没有把err算完,那么bias的更新就会出错。

//计算最后一层的err和bias
//O,NodeNum,SampleNum分别是最后一层的输出、节点数,样本数
__global__ void ErroBiasLastlayer(float* err, float*bias, float*Targets, float* O, const int NodeNum)
{
  int idx = blockIdx.x*blockDim.x + threadIdx.x;
  for(int i = idx; i<NodeNum*SAMPLE_NUM; i=i+BLOCK_NUM*THREAD_NUM)
  {
    err[i] = (Targets[i]-O[i])*O[i]*(1-O[i]);
  }
  __syncthreads();
  

  if(idx<NodeNum)
  {
    for(int i = 0; i<SAMPLE_NUM; ++i)
    {
      bias[idx] += ALFA*err[idx+i*NodeNum]/SAMPLE_NUM;
    }
  }
  __syncthreads();
}

//计算内层的Err和Bias:

//err是这一层到下一层weight转置和下一层的err的矩阵积,是一个[NodeNum_this]*[SampleNum]的矩阵,更新这个矩阵
//O、NodeNum是这一层的输出和节点数
//err,bias是这一层需要计算的误差项、偏置项

__global__ void ErroBias(float* err, float*bias, float* O, const int NodeNum)
{
  int idx = blockIdx.x*blockDim.x + threadIdx.x;
  for(int i = idx; i<NodeNum*SAMPLE_NUM; i=i+BLOCK_NUM*THREAD_NUM)
  {
    err[i] = err[i]*O[i]*(1-O[i]);
  }
  __syncthreads();

  if(idx<NodeNum)
  {
    for(int i = 0; i<SAMPLE_NUM; ++i)
    {
      bias[idx] += ALFA*err[idx+i*NodeNum]/SAMPLE_NUM;
    }
  }
  __syncthreads();
}
当线程idx计算 bias[idx]的时候,err的[idx+i*NodeNum]可能还没有更新完成就被使用了。解决办法就是把err和bias写成两个核函数。

3.当把数值gpuMse[BLOCK_NUM]传回CPU进行累加的时候,数据有时会传错。至今我都没有想明白这是为什么。

时间: 2024-10-15 04:35:17

这一周的收获与总结_BP的相关文章

第三周的收获

这周主要学习了java的数据类型.常量与变量.运算符.数据类型的转换.分支结构.枚举法,递推法.递归法.面对对象的基本概念.面向对象的三大特征.学习了HTML标题,段落,换行,下划线, <%@ page language="java" contentType="text/html; charset=GB18030"    pageEncoding="GB18030"%><!DOCTYPE html PUBLIC "-/

第七周的收获

这周对之前学习对的内容用视频的方式来学习: Javase是标准版: javame是小型版: javaee是企业版: public class Holleworld{ public static void main( Strinng[] args){ system.out.println("holleworld"); } } int hp=100; system.out.println("hp"): 输出的为hp: system.out.println(hp):输出的

第二周学习收获和问题

  第二周学习的是计算机的硬件层部分.   第4章是门和电路,讲述了各种门是如何运作的,以及如何通过晶体管去构造门.把一个门的输出作为另一个门的输入可以把门组合成电路.还引出了CPU的概念.   第5章是计算部件,涉及到构成计算机的各种设备.它们各有特征,包括速度.大小和效率.   冯·诺依曼体系结构是当今大多数计算机的底层体系结构.有5个主要组成部分,读取--执行周期是这个处理过程的核心.   RAM和ROM是两种计算机内存的缩写.前者表示随机存取存储器,ROM表示只读存储器.二级存储设备可以

学习HTML5一周的收获2

超链接 a 1.herf:超链接的网络地址,可写本地文件的相对路径,或本地html文件的相对路径, 方式是img的src的路径 2.target:设置超链接打开窗口的位置,_slef 自身网页打开(默认) _blank 新页面开 3.title:鼠标指上弹出 [功能性链接] mailto://[email protected] tencent://massage/?uin=2831705549 [锚链接] 1.本页面锚链接 设置一个锚点:<a name="top"><

学习HTML5一周的收获3

[form] 1.两个属性 action:表单提交的服务器地址 method:数据使用的方法.get/post >>>get和post的区别 get传参数使用URL传递,所有参数可见,不安全:get传参数量数据有限: post传参数使用http请求传递,较安全,post可传大量数据 但是前者传递的速率大于后者 >>>URL传参数的形式,链接URL地址?name1=value1&name2=value2 2.input的常用属性 type:设置input的输入类型

学习HTML5一周的收获1

HTML5的基本结构 学习了title标签(显示网站名称),link标签(链接文件,可做网页美化) 快捷键:Ctrl+/ 注释 学习[meta标签] 1.charset属性:单独使用,设置文档字符集编码格式. >>>写法:<meta charset="UTF-8"> >>>常见的中文编码格式: GB-2312:国标码,简体中文 GBK:扩展的国际码,简体中文 UTF-8:万国码Unicode码,基本兼容各国语言 2.http-equiv属

学习HTML5一周的收获4

/* [CSS常用文本属性] * 1.字体.字号: font-weight:字体的粗细,可选属性值:bold加粗  lighter细体  100~900数值(400正常,700 bold) font-size:字体大小   **PX  **%(浏览器默认字体大小的百分比,绝大部分默认16px) font-family:字体族,设置字体. >>>多个字体样式间用逗号分隔,浏览器解析时,会从左往右依次解析,选择可用字体. >>>一般前面使用具体字体名称,最后一个使用字体族类

第二周学习收获

bash基础特性及基础命令(02)_recv bash的基礎特性(1): (1) 命令歷史 history 環境變量: HISTSIZE: 命令歷史記錄的條數: HISTFILE: ~/.bash_history; HISTFILESIZE: 命令歷史文件記錄歷史的條數: history -d OFFSET -c history #: 顯示歷史中最近的#條命令: -a: 手動追加當前會話緩衝區的命令歷史至歷史文件中: 調用歷史中的命令: !#: 重複執行第#條指令: !!: !string: 調

第三周总结及接下来一周的计划

本来应该这周完成面向对象的所有内容的,但拼了老命才完成三分之一(其实很明显是自己对时间的管理能力差了一大截).那只能重新计划用下一周的时间完成面向对象剩下的三分之二:继承和多态.这一周收获还挺多的,进度真心不快,但是让自己搞清楚来了很多概念.大概之前的自己真的是混日子的吧.我发现看视频并不会让你真正理解,真正理解让你理解的行为应该是把代码敲出来并把自己理解的部分写出来.这时的我并没有说完全理解视频的内容,希望下次能在做项目过程中运用学过的知识.期待下一周的收获~