當前位置:
首頁 > 科技 > 教程 | TensorEditor :一個小白都能快速玩轉的神經網路搭建工具

教程 | TensorEditor :一個小白都能快速玩轉的神經網路搭建工具


機器之心整理


參與:思源




近日,機器之心發現一個非常有意思的工具,可以用可視化的方式輕鬆添加卷積層、全連接層和池化層等層級,然後生成可執行的 TensorFlow 代碼。此外,我們也嘗試搭建一個簡單的卷積架構,並在本地 TensorFlow 環境下測試生成的代碼。




工具地址:https://www.tensoreditor.com/



TensorEditor 是一個強大的機器學習工具,甚至小白都能以可視化的方式快速生成整個模型的代碼。通過 TensorEditor,小白可以連接卷積層、全連接層和池化層等可視化結點創建整個模型,且我們可以將它們轉化為 TensorFlow 和 Python 代碼,並進一步在自己的環境中運行。




基本上,TensorEditor 的步驟即定義我們的數據集、圖像或特徵,然後創建深度神經網路並下載 Python 2.7 的代碼,最後就需要在我們自己的 TensorFLow 環境下運行就好了。




通過 TensorEditor,我們不僅可以創建深度網路並避免一些常見的代碼問題,同時還能生成基於 TensorFlow Estimator 的高效代碼。如下所示,機器之心嘗試構建了一個簡單的卷積網路,我們使用了兩個卷積層、兩個池化層和一個全連接層,並在最後的 Estimator 使用了交叉熵損失函數和 Adagrad 最優化方法。






上述簡單搭建的卷積網路同樣可以生成完全可執行的代碼,這樣可以避免大量的一般代碼問題與重複性工作。



  1. import

    tensorflow as tf

  2. import

    pandas as pd

  3. tf

    .

    logging

    .

    set_verbosity

    (

    tf

    .

    logging

    .

    INFO

    )

  4. project_name

    =

    "CNN"

  5. train_csv_file

    =

    ""

  6. test_csv_file

    =

    ""

  7. image_resize

    =[

    28

    ,

    28

    ]

  8. def model_fn

    (

    features

    ,

    labels

    ,

    mode

    ,

    params

    ):

  9.    convolutional_2d_1

    =

    tf

    .

    layers

    .

    conv2d

    (

  10.            inputs

    =

    features

    ,

  11.            filters

    =

    32

    ,

  12.            kernel_size

    =[

    3

    ,

    3

    ],

  13.            strides

    =(

    1

    ,

    1

    ),

  14.            padding

    =

    "same"

    ,

  15.            data_format

    =

    "channels_last"

    ,

  16.            dilation_rate

    =(

    1

    ,

    1

    ),

  17.            activation

    =

    tf

    .

    nn

    .

    relu

    ,

  18.            use_bias

    =

    True

    )

  19.    max_pool_2d_1

    =

    tf

    .

    layers

    .

    max_pooling2d

    (

  20.        inputs

    =

    convolutional_2d_1

    ,

  21.        pool_size

    =[

    2

    ,

    2

    ],

  22.        strides

    =[

    2

    ,

    2

    ],

  23.        padding

    =

    "same"

    ,

  24.        data_format

    =

    "channels_last"

    )

  25.    convolutional_2d_2

    =

    tf

    .

    layers

    .

    conv2d

    (

  26.            inputs

    =

    max_pool_2d_1

    ,

  27.            filters

    =

    64

    ,

  28.            kernel_size

    =[

    3

    ,

    3

    ],

  29.            strides

    =(

    1

    ,

    1

    ),

  30.            padding

    =

    "same"

    ,

  31.            data_format

    =

    "channels_last"

    ,

  32.            dilation_rate

    =(

    1

    ,

    1

    ),

  33.            activation

    =

    tf

    .

    nn

    .

    relu

    ,

  34.            use_bias

    =

    True

    )

  35.    max_pool_2d_2

    =

    tf

    .

    layers

    .

    max_pooling2d

    (

  36.        inputs

    =

    max_pool_2d_1

    ,

  37.        pool_size

    =[

    2

    ,

    2

    ],

  38.        strides

    =[

    2

    ,

    2

    ],

  39.        padding

    =

    "same"

    ,

  40.        data_format

    =

    "channels_last"

    )

  41.    convolutional_2d_3

    =

    tf

    .

    layers

    .

    conv2d

    (

  42.            inputs

    =

    max_pool_2d_2

    ,

  43.            filters

    =

    128

    ,

  44.            kernel_size

    =[

    3

    ,

    3

    ],

  45.            strides

    =(

    1

    ,

    1

    ),

  46.            padding

    =

    "same"

    ,

  47.            data_format

    =

    "channels_last"

    ,

  48.            dilation_rate

    =(

    1

    ,

    1

    ),

  49.            activation

    =

    tf

    .

    nn

    .

    relu

    ,

  50.            use_bias

    =

    True

    )

  51.    max_pool_2d_3

    =

    tf

    .

    layers

    .

    max_pooling2d

    (

  52.        inputs

    =

    convolutional_2d_3

    ,

  53.        pool_size

    =[

    2

    ,

    2

    ],

  54.        strides

    =[

    2

    ,

    2

    ],

  55.        padding

    =

    "same"

    ,

  56.        data_format

    =

    "channels_last"

    )

  57.    flatten_1

    =

    tf

    .

    reshape

    (

    max_pool_2d_3

    ,

    [-

    1

    ,

    2048

    ])

  58.    dense_1

    =

    tf

    .

    layers

    .

    dense

    (

    inputs

    =

    flatten_1

    ,

    units

    =

    1024

    ,

    activation

    =

    tf

    .

    nn

    .

    relu

    )

  59.    dropout_1

    =

    tf

    .

    layers

    .

    dropout

    (

    inputs

    =

    dense_1

    ,

    rate

    =

    0.4

    ,

    training

    =

    mode

    ==

    tf

    .

    estimator

    .

    ModeKeys

    .

    TRAIN

    )

  60.    dense_2

    =

    tf

    .

    layers

    .

    dense

    (

    inputs

    =

    dropout_1

    ,

    units

    =

    256

    ,

    activation

    =

    tf

    .

    nn

    .

    relu

    )

  61.    logits

    =

    dense_2

  62.    predictions

    =

    {

  63.        

    "classes"

    :

    tf

    .

    argmax

    (

    input

    =

    logits

    ,

    axis

    =

    1

    ),

  64.        

    "probabilities"

    :

    tf

    .

    nn

    .

    softmax

    (

    logits

    ,

    name

    =

    "softmax_tensor"

    )

  65.    

    }

  66.    

    #

    Prediction

    and training

  67.    

    if

    mode

    ==

    tf

    .

    estimator

    .

    ModeKeys

    .

    PREDICT

    :

  68.        

    return

    tf

    .

    estimator

    .

    EstimatorSpec

    (

    mode

    =

    mode

    ,

    predictions

    =

    predictions

    )

  69.    

    #

    Calculate

    Loss

    (

    for

    both TRAIN and EVAL modes

    )

  70.    onehot_labels

    =

    tf

    .

    one_hot

    (

    indices

    =

    tf

    .

    cast

    (

    labels

    ,

    tf

    .

    int32

    ),

    depth

    =

    256

    )

  71.    loss

    =

    tf

    .

    losses

    .

    softmax_cross_entropy

    (

  72.        onehot_labels

    =

    onehot_labels

    ,

    logits

    =

    logits

    )

  73.    

    #

    Compute

    evaluation metrics

    .

  74.    accuracy

    =

    tf

    .

    metrics

    .

    accuracy

    (

    labels

    =

    labels

    ,

  75.                                   predictions

    =

    predictions

    [

    "classes"

    ],

  76.                                   name

    =

    "acc_op"

    )

  77.    metrics

    =

    {

    "accuracy"

    :

    accuracy

    }

  78.    tf

    .

    summary

    .

    scalar

    (

    "accuracy"

    ,

    accuracy

    [

    1

    ])

  79.    

    #

    Configure

    the

    Training

    Op

    (

    for

    TRAIN mode

    )

  80.    

    if

    mode

    ==

    tf

    .

    estimator

    .

    ModeKeys

    .

    TRAIN

    :

  81.        optimizer

    =

    tf

    .

    train

    .

    AdagradOptimizer

    (

    learning_rate

    =

    0.001

    )

  82.        train_op

    =

    optimizer

    .

    minimize

    (

  83.            loss

    =

    loss

    ,

  84.            global_step

    =

    tf

    .

    train

    .

    get_global_step

    ())

  85.        

    return

    tf

    .

    estimator

    .

    EstimatorSpec

    (

    mode

    =

    mode

    ,

    loss

    =

    loss

    ,

    train_op

    =

    train_op

    )

  86.    

    #

    Add

    evaluation metrics

    (

    for

    EVAL mode

    )

  87.    eval_metric_ops

    =

    {

  88.        

    "accuracy"

    :

    tf

    .

    metrics

    .

    accuracy

    (

  89.            labels

    =

    labels

    ,

    predictions

    =

    predictions

    [

    "classes"

    ])}

  90.    

    return

    tf

    .

    estimator

    .

    EstimatorSpec

    (

  91.        mode

    =

    mode

    ,

    loss

    =

    loss

    ,

    eval_metric_ops

    =

    eval_metric_ops

    )

  92. #

    Parse

    CSV input file and resize image

  93. def _parse_csv

    (

    line

    ):

  94.    parsed_line

    =

    tf

    .

    decode_csv

    (

    line

    ,

    [[

    ""

    ],

    []])

  95.    filename

    =

    parsed_line

    [

    0

    ]

  96.    label

    =

    parsed_line

    [

    1

    ]

  97.    image_string

    =

    tf

    .

    read_file

    (

    filename

    )

  98.    image_decoded

    =

    tf

    .

    image

    .

    decode_jpeg

    (

    image_string

    ,

    channels

    =

    3

    )

  99.    image_resized

    =

    tf

    .

    image

    .

    resize_images

    (

    image_decoded

    ,

    image_resize

    )

  100.    image_gray

    =

    tf

    .

    image

    .

    rgb_to_grayscale

    (

    image_resized

    )

  101.    

    return

    image_gray

    ,

    label

  102. def data_train_estimator

    ():

  103.    dataset

    =

    tf

    .

    data

    .

    TextLineDataset

    (

    train_csv_file

    ).

    map

    (

    _parse_csv

    )

     

    #

    Map

    each line to convert the data

  104.    dataset

    =

    dataset

    .

    batch

    (

    100

    )

  105.    dataset

    =

    dataset

    .

    shuffle

    (

    1000

    )

  106.    dataset

    =

    dataset

    .

    repeat

    ()

  107.    iterator

    =

    dataset

    .

    make_one_shot_iterator

    ()

     

    #

    create one shot iterator

  108.    feature

    ,

    label

    =

    iterator

    .

    get_next

    ()

  109.    

    return

    feature

    ,

    label

  110. def data_test_estimator

    ():

  111.    dataset

    =

    tf

    .

    data

    .

    TextLineDataset

    (

    test_csv_file

    ).

    map

    (

    _parse_csv

    )

     

    #

    Map

    each line to convert the data

  112.    dataset

    =

    dataset

    .

    batch

    (

    100

    )

  113.    iterator

    =

    dataset

    .

    make_one_shot_iterator

    ()

     

    #

    create one shot iterator

  114.    feature

    ,

    label

    =

    iterator

    .

    get_next

    ()

  115.    

    return

    feature

    ,

    label

  116. def main

    (

    unused_argv

    ):

  117.    

    #

    MAIN ENTRY

  118.    

    #

    Create

    the

    Estimator

  119.    classifier

    =

    tf

    .

    estimator

    .

    Estimator

    (

  120.        model_fn

    =

    model_fn

    ,

  121.        model_dir

    =

    "/tmp/"

    +

    project_name

    ,

  122.        params

    ={

  123.            

    #

    PARAMS

  124.        

    }

  125.    

    )

  126.    classifier

    .

    train

    (

    input_fn

    =

    data_train_estimator

    ,

    steps

    =

    30000

    )

  127.    eval_results

    =

    classifier

    .

    evaluate

    (

    input_fn

    =

    data_test_estimator

    )

  128.    tf

    .

    summary

    .

    scalar

    (

    "Accuracy"

    ,

    eval_results

    [

    "accuracy"

    ])

  129.    print

    (

    eval_results

    )

  130. if

    __name__

    ==

    "__main__"

    :

  131.    tf

    .

    app

    .

    run

    ()




TensorEditor 主要有以下特點:






  • 易於使用:我們只需要添加模塊、連接模塊並在最後加入評估模塊,就能完成搭建。



  • 由易到難:只需要疊加不同的模塊,我們就能創建如 VGG 那樣的複雜深度網路。



  • 參數直觀:可以輕鬆修改各結點的配置與參數,從而搭建定製化的深度網路。



  • 生成代碼:搭建完深度架構,我們就能直接生成可執行的 TensorFlow 代碼(Python 2.7)。




90 秒的 MNIST 教程








在上面的視頻中,開發者展示了如何使用 TensorEditor 在 90 秒內快速搭建一個可用於 MNIST 手寫數字識別的簡單網路。對於 TensorEditor 這種構建序貫 CNN 模型的簡單工具,我們只需要準備兩件事就能開始搭建模型模型:






  • 下載 MNIST 手寫數據集:https://github.com/damiles/TensorEditor_SampleData/raw/master/mnist_png.tar.gz



  • 確定網路架構:https://www.tensorflow.org/tutorials/layers#building_the_cnn_mnist_classifier




TensorEditor 接受 CSV 格式的特徵數據集或具有 CSV 標籤的圖像數據集作為數據輸入,並且需要訓練和測試/評估兩個 CSV 文件。當我們從上面的鏈接下載數據集並提取圖像數據時,我們會有兩個 CSV 文件和兩個包含所有圖像的文件夾(測試和訓練)。




現在我們就可以在 TensorEditor 中創建將要用於手寫數字識別的卷積網路架構,下面展示的架構和 TensorFlow 文檔中保持一致。






  • 卷積層 1:使用 32 個 5x5 大小的卷積核和 ReLU 激活函數



  • 池化層 1:使用 2x2 濾波器和步幅為 2 的最大池化運算(池化區域不重疊)



  • 卷積層 2:使用 64 個 5x5 大小的卷積核和 ReLU 激活函數



  • 池化層 2:同樣使用 2x2 濾波器和步幅為 2 的最大池化運算



  • 全連接層 1:1024 個神經元,Dropout 正則化率為 0.4



  • 分類層:10 個神經元,每個神經元表示 0 到 9 這十個數字。




我們只需要按步驟先添加一個輸入 csv 數據集模塊,並設置 train.csv 和 test.csv 的地址。然後依次添加上述的卷積和全連接等模塊,並設置好對應的參數,如卷積核大小、卷積核數量和激活函數等。最後主需要添加 Estimator 模塊,並設置損失函數、最優化方法和學習率等配置就能完成架構上的搭建。如下所示為使用可視化方法搭建的架構:







最後上面的網路就能生成對應的代碼,我們可直接複製到本地代碼編輯器中並執行:









本文為機器之心整理,

轉載請聯繫本公眾號獲得授權



?------------------------------------------------


加入機器之心(全職記者/實習生):hr@jiqizhixin.com


投稿或尋求報道:

content

@jiqizhixin.com


廣告&商務合作:bd@jiqizhixin.com

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

想入門設計卷積神經網路?這是一份綜合設計指南
無需額外硬體,全卷積網路讓機器學習學會夜視能力

TAG:機器之心 |