这个系列的学习,基本上没有使用过多Python依赖的库和第三方工具,更没有使用目前较火的框架(tf、pytorch、caffe)等,更多的采用了numpy。下面是Python版的激活函数:
C语言是过去几十年软件和硬件两个阵营之间签署的最坚实的契约。硬件为C语言的语义提供了最能发挥其性能的基础构件,而软件虽然搞了很多的圆环套圆环般的层次,但最终都以C语言作为最后的沉淀收尾。
现在比较火爆的tf,即是Google基于高层IR表达,抽象出在AI领域内的公共编程模型,聚焦此高层IR表达实现了一个framework框架,形成了Python生态的高价值工具集合。
这一波的火爆,吸引并影响了更多的软件、硬件同学参与到硬件架构中,想为为未来的几十年定下下一轮的契约,每一个 IT 公司都希望这份新的契约是以自己为中心的。以 Google 为首,代表着 AI 为创新源头的新兴势力。高层IR抽象的framework,即框架在 AI 领域的成功,让集中在这个领域的高密度人才携其创造的高密度思想结晶,希望像 AI 的泛化能力一样,把 framework 的思维方式泛化到其他编程领域。说白了,这个流派希望破旧立新,重新制定软硬件的契约,把 C 变成 Python。
我们自己还是造的轮子太少,积累少得可怜,如果倪光南院士早些年的想法(芯片和操作系统)在当时付诸实践了,也许我们也会有很多自己的轮子,那时的计算机科学还没有那么完善的生态,我们应该是可以立足的。
现在选择在头条号上学习记录,主要原因是字节跳动和“漂亮国”干过架。下面是一个自己会围绕其工作和学习的框架,现在主要还是在第5层上干活,但已经触及了下面几层了,后续的学习记录也会一一的涉及到:
浅话到此,关于深度学习源码,以后都会有Python版和C语言版,后续学习rust和go语言的时候,如果精力上可以的话也会陆续更新。
因为初步刚刚开始,一切从简了,图示几个简单的文件:
functions.c functions.h option.h unstd.h 函数的定义以及涉及到的数据结构后续都会集中在这几个文件中。
Makefile test_func.c make脚本和测试代码。
#ifndef _UNSTD_
#define _UNSTD_
#define EPS 1e-7
typedef int ctrovar; /* control variable */
typedef float datavar; /* data variable */
#endif /* unstd.h */
#ifndef _OPTION_
#define _OPTION_
#define USE_32FLOAT /* 32bit-precision floating-point */
/*#define USE_64FLOAT*/ /* 64bit-precision floating-point */
/*#define USE_128FLOAT*/ /* 128bit-precision floating-point */
#endif /* option.h */
/*!
*****************************************************************************
* \file
* functions.h
*
* \brief
* function
*
* \version
* 0.1 - 2021/11/28 19:10:20: Initial Version
*
* \author
* cy
*****************************************************************************
*/
#ifndef _FUNCTION_
#define _FUNCTION_
#include <math.h>
#include "unstd.h"
#include "option.h"
#ifdef __cplusplus
extern "C" {
#endif
void StepFunc(datavar *src, datavar *dst, ctrovar length);
void SigmoidFunc(datavar *src, datavar *dst, ctrovar length);
void ReluFunc(datavar *src, datavar *dst, ctrovar length);
#ifdef __cplusplus
}
#endif
#endif /* functions.h */
/*!
*****************************************************************************
* \file
* functions.c
*
* \brief
* functions
*
* \version
* 0.1 - 2021/11/28 19:10:20: Initial Version
*
* \author
* cy
*****************************************************************************
*/
#include "functions.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
*
* function name: step function
* param : datavar *src source data address
* param : datavar *dst destination data address
* param : ctrovar length data length
*/
void StepFunc(datavar *src, datavar *dst, ctrovar length)
{
ctrovar i = 0;
for(i=0; i<length; i++){
if( (*src++)>(0+EPS) )
*dst++ = 1.0;
else
*dst++ = 0.0;
}
}
void SigmoidFunc(datavar *src, datavar *dst, ctrovar length)
{
ctrovar i = 0;
for(i=0; i<length; i++){
*dst++ = 1.0 / ( 1.0 + exp(-(*src++)) );
}
}
void ReluFunc(datavar *src, datavar *dst, ctrovar length)
{
ctrovar i = 0;
for(i=0; i<length; i++){
if( (src[i])>(0+EPS) )
*dst++ = src[i];
else
*dst++ = 0.0;
}
}
#ifdef __cplusplus
}
#endif
#include <stdio.h>
#include <stddef.h>
#include <time.h>
#include <stdlib.h>
#include "functions.h"
#define N 21
int main() {
int i = 0;
int len=N;
float arrsrc[N];
float stpdst[N]={0.0};
float sigdst[N]={0.0};
float reudst[N]={0.0};
srand((unsigned)time(NULL));
for (i = 0; i < N; i++)
arrsrc[i] = -1.0+0.1*i;/*(rand()%101)*(float)0.01-0.5;*/
printf("init stpdst=\n");
for (i=0; i<N; i++)
printf("%5.1f", stpdst[i]);
printf("\ninit arrsrc=\n");
for (i=0; i<N; i++)
printf("%10.6f", arrsrc[i]);
StepFunc(arrsrc, stpdst, len);
printf("\nStepFunc stpdst=\n");
for (i=0; i<N; i++)
printf("%10.6f", stpdst[i]);
SigmoidFunc(arrsrc, sigdst, len);
printf("\nSigmoidFunc stpdst=\n");
for (i=0; i<N; i++)
printf("%10.6f", sigdst[i]);
ReluFunc(arrsrc, reudst, len);
printf("\nReluFunc reudst=\n");
for (i=0; i<N; i++)
printf("%10.6f", reudst[i]);
return (0);
}
# 是否加入调试信息
DEBUG=1
# 宏定义
#DEFS = -DOPENCV
VPATH = ./ # 搜索路径
OBJDIR= ./obj/
EXEC = test_func # 生成的可执行文件
# 编译器的选择
CC=gcc
#CPP=g++
# FLAGS编译选项
CFLAGS = -Wall
LDFLAGS = -lc -lm -lpthread
#CFLAGS += $(DEFS)
ifeq ($(DEBUG), 1)
OPTS= -O0 -g
else
OPTS= -O2
endif
CFLAGS+= $(OPTS)
#CFLAGS+= -std=c++11
# 头文件和库的包含路径
CFLAGS += -I /usr/include/ \
-I ./
LDFLAGS += -L /usr/lib/
#LDFLAGS+= \
# /usr/local/lib/libopencv_highgui.so \
# /usr/local/lib/libopencv_photo.so \
OBJ=functions.o test_func.o
OBJS = $(addprefix $(OBJDIR), $(OBJ))
DEPS = $(wildcard *.c *.h) Makefile
#all: obj $(SLIB) $(EXEC)
all: obj $(EXEC)
#$(SLIB): $(OBJS)
# $(CC) $(CFLAGS) -shared -fPIC $^ -o $@ $(LDFLAGS)
$(EXEC): $(OBJS)
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
$(OBJDIR)%.o: %.c $(DEPS)
$(CC) $(CFLAGS) -c $< -o $@
obj:
mkdir -p obj
clean:
rm -rf $(OBJS) $(SLIB)