b乎:如何评价2020届智能车比赛的AI电磁组?
通过学长介绍,在假期观看了吴恩达老师的机器学习与深度学习相关课程。
以视频为主,笔记为辅。
在每周课程结束后,自己编写课后作业,与CSDN版课后作业和和鲸社区版本对比。
逐飞方案
千等万等终于等出逐飞的部署方案后便与队友开始了方案尝试。
经过两天的测试发现不论如何更改神经网络,都无法正确部署在单片机得到正确结果。
在看到此聊天记录后,决定自己开发。深度学习神经网络难点在于超参数的调整与反向传播的代码构建,而在部署端只需要实现简单的前向传播即可,模型的搭建与调整都在框架下进行,整体难度不大。
根据部署流程,在使用Keras搭建出神经网络后,导入训练集,并将模型保存在本地。
model = Sequential()
model.add(Dense(100, activation='relu', input_dim=2))
model.add(Dense(50, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(2, activation='softmax'))
model.compile(optimizer=keras.optimizers.SGD(lr=0.1), loss='mean_squared_error')
x_train = np.array([[100,100],[50,10],[80,30],[1,1],
[-2,1],[-70,80],[-200,25],[-1, 10]])
y_train = np.array([0,0,0,0,1,1,1,1])
y_train = to_categorical(y_train.T) # 独热码
model.fit(x_train,y_train,epochs=500)
x_test = np.array([90,10])
print(x_test)
print(model.predict(x_test))
model.save('softmax1.h5')
model = load_model('softmax1.h5')
model.summary()
x_test = np.array([0, 0])
x_test = np.reshape(x_test,(1,2))
print(model.predict(x_test))
def Kernel_transform(Kernel, f):
def Bias_transform(Kernel, f):
def Weights_transform(Hide_num, Kernel, Bias, f):
def Shape_transform(dense_kernel, dense_bias , f):
def quantitative_model_weights(in_file_name, out_file_name):
quantitative_model_weights('softmax1.h5', 'Weights.c')
接下来编写读取函数,注意处理权重数组的{ , } \n
。
运行得到文件Weights.c
。
//图片与代码不符,找不到老图拿新图凑数
旧版
新版
(添加了宏定义与维度数组便于使用
读出了各层权重后,编写C端代码
尽管官网标注TC377有DSP,经网上搜寻、询问乾勤科技技术人员甚至翻阅芯片手册,并未找到相关描述。决定弃置向量化吴恩达老师对不起 ,以循环的方式实现前向传播。
void autoModel_Predict(double* X_in, double* Y_out, int layers);
int main()
{
double y_test[2] = {
0};
double x[] = {
0,0};
autoModel_Predict(x, y_test, 1);
printf("%lf\n%lf", y_test[0], y_test[1]);
return 0;
}
可以看到结果与py下运行一致,至此移植成功。
代码最终还是要落实到单片机的,因本人是mac os,所以找来了我的好哥儿们 黄大佬 帮我们测试。
在搭建了与逐飞相同数量的隐藏层后,导出参数,TC377 300M主频下 使用core_0
的运算时间为1868us。
逐飞:5、任意打开一个串口助手以ascii方式接收,此时复位一下单片机即可看到如下图所示,从显示的信息可以看到,运行一次模型所需的时间大约为502us。
逐飞在将输入、输出、权重全部量化成int8后运行速度在502us,自己构建部署的全double输入,计算用时1868us。
以舵机50Hz 也就是20ms控制频率来看,全double
类型计算在此运算效率下是绰绰有余的。甚至摄像头组也可部署此方案