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

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

來自專欄機器之心230 人贊了文章

機器之心整理

參與:思源

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

工具地址:tensoreditor.com/

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

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

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

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

import tensorflow as tf

import pandas as pd

tf.logging.set_verbosity(tf.logging.INFO)

project_name="CNN"

train_csv_file=""

test_csv_file=""

image_resize=[28,28]

def model_fn(features, labels, mode, params):

convolutional_2d_1 = tf.layers.conv2d(

inputs=features,

filters=32,

kernel_size=[3,3],

strides=(1,1),

padding="same",

data_format="channels_last",

dilation_rate=(1,1),

activation=tf.nn.relu,

use_bias=True)

max_pool_2d_1 = tf.layers.max_pooling2d(

inputs=convolutional_2d_1,

pool_size=[2,2],

strides=[2,2],

padding=same,

data_format=channels_last)

convolutional_2d_2 = tf.layers.conv2d(

inputs=max_pool_2d_1,

filters=64,

kernel_size=[3,3],

strides=(1,1),

padding="same",

data_format="channels_last",

dilation_rate=(1,1),

activation=tf.nn.relu,

use_bias=True)

max_pool_2d_2 = tf.layers.max_pooling2d(

inputs=max_pool_2d_1,

pool_size=[2,2],

strides=[2,2],

padding=same,

data_format=channels_last)

convolutional_2d_3 = tf.layers.conv2d(

inputs=max_pool_2d_2,

filters=128,

kernel_size=[3,3],

strides=(1,1),

padding="same",

data_format="channels_last",

dilation_rate=(1,1),

activation=tf.nn.relu,

use_bias=True)

max_pool_2d_3 = tf.layers.max_pooling2d(

inputs=convolutional_2d_3,

pool_size=[2,2],

strides=[2,2],

padding=same,

data_format=channels_last)

flatten_1 = tf.reshape(max_pool_2d_3, [-1, 2048])

dense_1 = tf.layers.dense(inputs=flatten_1, units=1024, activation=tf.nn.relu)

dropout_1= tf.layers.dropout(inputs=dense_1, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)

dense_2 = tf.layers.dense(inputs=dropout_1, units=256, activation=tf.nn.relu)

logits=dense_2

predictions = {

"classes": tf.argmax(input=logits, axis=1),

"probabilities": tf.nn.softmax(logits, name="softmax_tensor")

}

#Prediction and training

if mode == tf.estimator.ModeKeys.PREDICT:

return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

# Calculate Loss (for both TRAIN and EVAL modes)

onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=256)

loss = tf.losses.softmax_cross_entropy(

onehot_labels=onehot_labels, logits=logits)

# Compute evaluation metrics.

accuracy = tf.metrics.accuracy(labels=labels,

predictions=predictions["classes"],

name=acc_op)

metrics = {accuracy: accuracy}

tf.summary.scalar(accuracy, accuracy[1])

# Configure the Training Op (for TRAIN mode)

if mode == tf.estimator.ModeKeys.TRAIN:

optimizer = tf.train.AdagradOptimizer(learning_rate=0.001)

train_op = optimizer.minimize(

loss=loss,

global_step=tf.train.get_global_step())

return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)

# Add evaluation metrics (for EVAL mode)

eval_metric_ops = {

"accuracy": tf.metrics.accuracy(

labels=labels, predictions=predictions["classes"])}

return tf.estimator.EstimatorSpec(

mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)

# Parse CSV input file and resize image

def _parse_csv(line):

parsed_line= tf.decode_csv(line, [[""], []])

filename = parsed_line[0]

label = parsed_line[1]

image_string = tf.read_file(filename)

image_decoded = tf.image.decode_jpeg(image_string, channels=3)

image_resized = tf.image.resize_images(image_decoded, image_resize)

image_gray = tf.image.rgb_to_grayscale(image_resized)

return image_gray, label

def data_train_estimator():

dataset = tf.data.TextLineDataset(train_csv_file).map(_parse_csv) # Map each line to convert the data

dataset = dataset.batch(100)

dataset = dataset.shuffle(1000)

dataset = dataset.repeat()

iterator = dataset.make_one_shot_iterator() # create one shot iterator

feature, label = iterator.get_next()

return feature, label

def data_test_estimator():

dataset = tf.data.TextLineDataset(test_csv_file).map(_parse_csv) # Map each line to convert the data

dataset = dataset.batch(100)

iterator = dataset.make_one_shot_iterator() # create one shot iterator

feature, label = iterator.get_next()

return feature, label

def main(unused_argv):

# MAIN ENTRY

# Create the Estimator

classifier = tf.estimator.Estimator(

model_fn=model_fn,

model_dir="/tmp/"+project_name,

params={

# PARAMS

}

)

classifier.train(input_fn=data_train_estimator, steps=30000)

eval_results = classifier.evaluate(input_fn=data_test_estimator)

tf.summary.scalar("Accuracy", eval_results["accuracy"])

print(eval_results)

if __name__ == "__main__":

tf.app.run()

TensorEditor 主要有以下特點:

  • 易於使用:我們只需要添加模塊、連接模塊並在最後加入評估模塊,就能完成搭建。
  • 由易到難:只需要疊加不同的模塊,我們就能創建如 VGG 那樣的複雜深度網路。
  • 參數直觀:可以輕鬆修改各結點的配置與參數,從而搭建定製化的深度網路。
  • 生成代碼:搭建完深度架構,我們就能直接生成可執行的 TensorFlow 代碼(Python 2.7)。

90 秒的 MNIST 教程

https://v.qq.com/x/page/f134168kl8y.html?

v.qq.com

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

  • 下載 MNIST 手寫數據集:github.com/damiles/Tens
  • 確定網路架構:tensorflow.org/tutorial

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 模塊,並設置損失函數、最優化方法和學習率等配置就能完成架構上的搭建。如下所示為使用可視化方法搭建的架構:

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


推薦閱讀:

機器學習中結果評估與模型解釋
詳解機器學習之感知機理論與實踐
吳恩達機器學習第二周課後感:線性回歸
使用LibSVM進行分類的注意事項

TAG:神經網路 | 機器學習 | 人工智慧 |