在设计完HLS卷积和池化硬件模块后,这里通过最基础的MNIST手写数字识别案例将两个模块运用起来。
一、TensorFlow设计卷积神经网络
卷积神经网络在图像处理领域有着很大的优势,本案例通过设计包含两个卷积池化层和两个全连接层的神经网络对MNIST手写数字进行训练识别,最后识别的准确率保持在99%。
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
import tensorflow as tf
import numpy as np
import struct
#记录卷积神经网路的参数,分别存在.dat和.bin文件中(.bin最后放在sd卡中)
def Parameter_record(tensor,name):
print("Recording "+name+"...")
f = open('./record/'+name+".dat",'w')
#wb指以二进制的方式写文件
b = open('./record/'+name+".bin",'wb')
#.eval(用来获取变量的返回值,和Session类似)
array = tensor.eval()
dimensions = np.size(np.shape(array))
if(dimensions==1):
Array1D_record(array,f,b)
elif(dimensions==2):
Array2D_record(array,f,b)
elif(dimensions==3):
Array3D_record(array,f,b)
else:
Array4D_record(array,f,b)
def Array1D_record(array,f,b):
for i in range(np.shape(array)[0]):
f.write(str(array[i])+"\n")
#struct.pack将Python中的浮点类型转换为c语言中所使用的二进制数据类型
b.write(struct.pack('f', array[i]))
def Array2D_record(array,f,b):
for i in range(np.shape(array)[0]):
for j in range(np.shape(array)[1]):
f.write(str(array[i][j])+"\n")
b.write(struct.pack('f', array[i][j]))
def Array3D_record(array,f,b):
for i in range(np.shape(array)[0]):
for j in range(np.shape(array)[1]):
for m in range(np.shape(array)[2]):
f.write(str(array[i][j][m])+"\n")
b.write(struct.pack('f', array[i][j][m]))
def Array4D_record(array,f,b):
for i in range(np.shape(array)[0]):
for j in range(np.shape(array)[1]):
for m in range(np.shape(array)[2]):
for n in range(np.shape(array)[3]):
f.write(str(array[i][j][m][n])+"\n")
b.write(struct.pack('f', array[i][j][m][n]))
#每个批次的大小
batch_size =50
#训练集一共有多少批次
n_batch = mnist.train.num_examples//batch_size
#初始化权值
def weight_variable(shape):
# 正态分布,标准差为 0.1,默认最大为 1,最小为 -1,均值为 0
return tf.Variable(tf.truncated_normal(shape,stddev=0.1))
#初始化偏置
def bias_variable(shape):
return tf.Variable(tf.zeros(shape)+0.1)
#卷积层
def conv2d(x,W):
#x input tensor of shape [batch,in_height,in_weight,in_channels]
#W filte

本文介绍了如何在TensorFlow中设计卷积神经网络并应用到MNIST手写数字识别,随后详细描述了如何将该网络转化为HLS硬件模块并在XilinxZYNQ平台上的Vivado工具进行设计和验证,包括使用VitisSDK进行软件开发和硬件协同工作。
&spm=1001.2101.3001.5002&articleId=132782524&d=1&t=3&u=e9dc4578ab3c495f8d5c42c9d3f1c9d1)
4242

被折叠的 条评论
为什么被折叠?



