FC2カウンター FPGAの部屋 SqueezeNet for MNIST のVivado HLS での試行1
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

SqueezeNet for MNIST のVivado HLS での試行1

SqueezeNet for MNIST 3(層の統計情報とC ヘッダ・ファイルへの出力)”で層の統計情報と重みやバイアスの C ヘッダ・ファイルを出力したので、それらを使用して、SqueezeNet for MNISTで、どのくらいのリソースが必要なのかを探ってみた。
とりあえずは、層の内の第1層目の畳み込み層、ReLU, MaxPooling の 3 つを実装してみよう。
なお、実装には、conv_layer_template.h, relu_template.h, max_pooling_template.h を使用している。

最初に conv_layer1.cpp を示す。

// conv_layer1.cpp
// 2018/08/22 by marsee
// conv layer1 for squeeze4mnist
//

#include "conv_layer_template.h"
#include "conv1_weight.h"
#include "conv1_bias.h"

int conv_layer1(hls::stream<ap_fixed_axis<9,1,1,1> >& ins,
        hls::stream<ap_fixed_axis<11,1,96,1> >& outs){
//#pragma HLS DATA_PACK variable=outs
//#pragma HLS DATA_PACK variable=ins
    return(conv_layer_template<9,1,16,2,11,1,9,1,1,96,3,3,0,0,2,28,28>(ins, outs, conv1_weight, conv1_bias));
}


次に、relu_conv1.cpp を示す。

// relu_conv1.cpp
// 2018/05/06 by marsee
// relu after conv1
//

#include "relu_template.h"

int relu_conv1(hls::stream<ap_fixed_axis<11,1,96,1> >& ins,
        hls::stream<ap_fixed_axis<11,1,96,1> >& outs){
//#pragma HLS DATA_PACK variable=outs
//#pragma HLS DATA_PACK variable=ins
    return(relu_template<11,1,96,13,13>(ins, outs));
}


max_pooling.cpp を示す。

// max_pooling.cpp
// 2018/05/10 by marsee
//

#include "max_pooling_template.h"

int max_pooling(hls::stream<ap_fixed_axis<11,1,96,1> >& ins,
        hls::stream<ap_fixed_axis<11,1,96,1> >& outs){
//#pragma HLS DATA_PACK variable=outs
//#pragma HLS DATA_PACK variable=ins
    return(max_pooling_template<11,1,96,2,2,2,13,13>(ins, outs));
}


squeezenet4mnist1.cpp を示す。

// squeezenet4mnist1.cpp
// 2018/08/28 by marsee
//

#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include <hls_video.h>

#include "layer_general.h"

int conv_layer1(hls::stream<ap_fixed_axis<9,1,1,1> >& ins,
    hls::stream<ap_fixed_axis<11,1,96,1> >& outs);
int relu_conv1(hls::stream<ap_fixed_axis<11,1,96,1> >& ins,
    hls::stream<ap_fixed_axis<11,1,96,1> >& outs);
int max_pooling(hls::stream<ap_fixed_axis<11,1,96,1> >& ins,
    hls::stream<ap_fixed_axis<11,1,96,1> >& outs);

int squeezenet4mnist1(hls::stream<ap_fixed_axis<9,1,1,1> >& ins, hls::stream<ap_fixed_axis<11,1,96,1> >& outs){
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS DATAFLOW
    hls::stream<ap_fixed_axis<11,1,96,1> > outs_conv_layer1;
    hls::stream<ap_fixed_axis<11,1,96,1> > outs_relu_conv1;

    conv_layer1(ins, outs_conv_layer1);
    relu_conv1(outs_conv_layer1, outs_relu_conv1);
    max_pooling(outs_relu_conv1, outs);

    return(0);
}


Vivado HLS 2017.4 で squeezenet4mnist1 プロジェクトを作成した。
squeezenet_vhls_1_180906.png
  1. 2018年09月06日 05:06 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/4287-bf312619
この記事にトラックバックする(FC2ブログユーザー)