欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Tensorflow的可視化工具Tensorboard的初步使用詳解

 更新時間:2018年02月11日 10:19:53   作者:王小草--點(diǎn)絳唇  
這篇文章主要介紹了Tensorflow的可視化工具Tensorboard的初步使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

當(dāng)使用Tensorflow訓(xùn)練大量深層的神經(jīng)網(wǎng)絡(luò)時,我們希望去跟蹤神經(jīng)網(wǎng)絡(luò)的整個訓(xùn)練過程中的信息,比如迭代的過程中每一層參數(shù)是如何變化與分布的,比如每次循環(huán)參數(shù)更新后模型在測試集與訓(xùn)練集上的準(zhǔn)確率是如何的,比如損失值的變化情況,等等。如果能在訓(xùn)練的過程中將一些信息加以記錄并可視化得表現(xiàn)出來,是不是對我們探索模型有更深的幫助與理解呢?

Tensorflow官方推出了可視化工具Tensorboard,可以幫助我們實現(xiàn)以上功能,它可以將模型訓(xùn)練過程中的各種數(shù)據(jù)匯總起來存在自定義的路徑與日志文件中,然后在指定的web端可視化地展現(xiàn)這些信息。

1. Tensorboard介紹

1.1 Tensorboard的數(shù)據(jù)形式

Tensorboard可以記錄與展示以下數(shù)據(jù)形式:
(1)標(biāo)量Scalars
(2)圖片Images
(3)音頻Audio
(4)計算圖Graph
(5)數(shù)據(jù)分布Distribution
(6)直方圖Histograms
(7)嵌入向量Embeddings

1.2 Tensorboard的可視化過程

(1)首先肯定是先建立一個graph,你想從這個graph中獲取某些數(shù)據(jù)的信息

(2)確定要在graph中的哪些節(jié)點(diǎn)放置summary operations以記錄信息
使用tf.summary.scalar記錄標(biāo)量
使用tf.summary.histogram記錄數(shù)據(jù)的直方圖
使用tf.summary.distribution記錄數(shù)據(jù)的分布圖
使用tf.summary.image記錄圖像數(shù)據(jù)
….

(3)operations并不會去真的執(zhí)行計算,除非你告訴他們需要去run,或者它被其他的需要run的operation所依賴。而我們上一步創(chuàng)建的這些summary operations其實并不被其他節(jié)點(diǎn)依賴,因此,我們需要特地去運(yùn)行所有的summary節(jié)點(diǎn)。但是呢,一份程序下來可能有超多這樣的summary 節(jié)點(diǎn),要手動一個一個去啟動自然是及其繁瑣的,因此我們可以使用tf.summary.merge_all去將所有summary節(jié)點(diǎn)合并成一個節(jié)點(diǎn),只要運(yùn)行這個節(jié)點(diǎn),就能產(chǎn)生所有我們之前設(shè)置的summary data。

(4)使用tf.summary.FileWriter將運(yùn)行后輸出的數(shù)據(jù)都保存到本地磁盤中

(5)運(yùn)行整個程序,并在命令行輸入運(yùn)行tensorboard的指令,之后打開web端可查看可視化的結(jié)果

2.Tensorboard使用案例

不出所料呢,我們還是使用最基礎(chǔ)的識別手寫字體的案例~

不過本案例也是先不去追求多美好的模型,只是建立一個簡單的神經(jīng)網(wǎng)絡(luò),讓大家了解如何使用Tensorboard。

2.1 導(dǎo)入包,定義超參數(shù),載入數(shù)據(jù)

(1)首先還是導(dǎo)入需要的包:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import sys

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

(2)定義固定的超參數(shù),方便待使用時直接傳入。如果你問,這個超參數(shù)為啥要這樣設(shè)定,如何選擇最優(yōu)的超參數(shù)?這個問題此處先不討論,超參數(shù)的選擇在機(jī)器學(xué)習(xí)建模中最常用的方法就是“交叉驗證法”。而現(xiàn)在假設(shè)我們已經(jīng)獲得了最優(yōu)的超參數(shù),設(shè)置學(xué)利率為0.001,dropout的保留節(jié)點(diǎn)比例為0.9,最大循環(huán)次數(shù)為1000.

另外,還要設(shè)置兩個路徑,第一個是數(shù)據(jù)下載下來存放的地方,一個是summary輸出保存的地方。

max_step = 1000 # 最大迭代次數(shù)
learning_rate = 0.001  # 學(xué)習(xí)率
dropout = 0.9  # dropout時隨機(jī)保留神經(jīng)元的比例

data_dir = ''  # 樣本數(shù)據(jù)存儲的路徑
log_dir = ''  # 輸出日志保存的路徑

(3)接著加載數(shù)據(jù),下載數(shù)據(jù)是直接調(diào)用了tensorflow提供的函數(shù)read_data_sets,輸入兩個參數(shù),第一個是下載到數(shù)據(jù)存儲的路徑,第二個one_hot表示是否要將類別標(biāo)簽進(jìn)行獨(dú)熱編碼。它首先回去找制定目錄下有沒有這個數(shù)據(jù)文件,沒有的話才去下載,有的話就直接讀取。所以第一次執(zhí)行這個命令,速度會比較慢。

mnist = input_data.read_data_sets(data_dir,one_hot=True)

2.2 創(chuàng)建特征與標(biāo)簽的占位符,保存輸入的圖片數(shù)據(jù)到summary

(1)創(chuàng)建tensorflow的默認(rèn)會話:

sess = tf.InteractiveSession()

(2)創(chuàng)建輸入數(shù)據(jù)的占位符,分別創(chuàng)建特征數(shù)據(jù)x,標(biāo)簽數(shù)據(jù)y_

在tf.placeholder()函數(shù)中傳入了3個參數(shù),第一個是定義數(shù)據(jù)類型為float32;第二個是數(shù)據(jù)的大小,特征數(shù)據(jù)是大小784的向量,標(biāo)簽數(shù)據(jù)是大小為10的向量,None表示不定死大小,到時候可以傳入任何數(shù)量的樣本;第3個參數(shù)是這個占位符的名稱。

with tf.name_scope('input'):
  x = tf.placeholder(tf.float32, [None, 784], name='x-input')
  y_ = tf.placeholder(tf.float32, [None, 10], name='y-input')

(3)使用tf.summary.image保存圖像信息

特征數(shù)據(jù)其實就是圖像的像素數(shù)據(jù)拉升成一個1*784的向量,現(xiàn)在如果想在tensorboard上還原出輸入的特征數(shù)據(jù)對應(yīng)的圖片,就需要將拉升的向量轉(zhuǎn)變成28 * 28 * 1的原始像素了,于是可以用tf.reshape()直接重新調(diào)整特征數(shù)據(jù)的維度:

將輸入的數(shù)據(jù)轉(zhuǎn)換成[28 * 28 * 1]的shape,存儲成另一個tensor,命名為image_shaped_input。

為了能使圖片在tensorbord上展示出來,使用tf.summary.image將圖片數(shù)據(jù)匯總給tensorbord。

tf.summary.image()中傳入的第一個參數(shù)是命名,第二個是圖片數(shù)據(jù),第三個是最多展示的張數(shù),此處為10張

with tf.name_scope('input_reshape'):
  image_shaped_input = tf.reshape(x, [-1, 28, 28, 1])
  tf.summary.image('input', image_shaped_input, 10)

2.3 創(chuàng)建初始化參數(shù)的方法,與參數(shù)信息匯總到summary的方法

(1)在構(gòu)建神經(jīng)網(wǎng)絡(luò)模型中,每一層中都需要去初始化參數(shù)w,b,為了使代碼簡介美觀,最好將初始化參數(shù)的過程封裝成方法function。

創(chuàng)建初始化權(quán)重w的方法,生成大小等于傳入的shape參數(shù),標(biāo)準(zhǔn)差為0.1,正態(tài)分布的隨機(jī)數(shù),并且將它轉(zhuǎn)換成tensorflow中的variable返回。

def weight_variable(shape):
  """Create a weight variable with appropriate initialization."""
  initial = tf.truncated_normal(shape, stddev=0.1)
  return tf.Variable(initial)

創(chuàng)建初始換偏執(zhí)項b的方法,生成大小為傳入?yún)?shù)shape的常數(shù)0.1,并將其轉(zhuǎn)換成tensorflow的variable并返回

def bias_variable(shape):
  """Create a bias variable with appropriate initialization."""
  initial = tf.constant(0.1, shape=shape)
  return tf.Variable(initial)

(2)我們知道,在訓(xùn)練的過程在參數(shù)是不斷地在改變和優(yōu)化的,我們往往想知道每次迭代后參數(shù)都做了哪些變化,可以將參數(shù)的信息展現(xiàn)在tenorbord上,因此我們專門寫一個方法來收錄每次的參數(shù)信息。

def variable_summaries(var):
  """Attach a lot of summaries to a Tensor (for TensorBoard visualization)."""
  with tf.name_scope('summaries'):
   # 計算參數(shù)的均值,并使用tf.summary.scaler記錄
   mean = tf.reduce_mean(var)
   tf.summary.scalar('mean', mean)

   # 計算參數(shù)的標(biāo)準(zhǔn)差
   with tf.name_scope('stddev'):
    stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
   # 使用tf.summary.scaler記錄記錄下標(biāo)準(zhǔn)差,最大值,最小值
   tf.summary.scalar('stddev', stddev)
   tf.summary.scalar('max', tf.reduce_max(var))
   tf.summary.scalar('min', tf.reduce_min(var))
   # 用直方圖記錄參數(shù)的分布
   tf.summary.histogram('histogram', var)

2.4 構(gòu)建神經(jīng)網(wǎng)絡(luò)層

(1)創(chuàng)建第一層隱藏層
創(chuàng)建一個構(gòu)建隱藏層的方法,輸入的參數(shù)有:
input_tensor:特征數(shù)據(jù)
input_dim:輸入數(shù)據(jù)的維度大小
output_dim:輸出數(shù)據(jù)的維度大小(=隱層神經(jīng)元個數(shù))
layer_name:命名空間
act=tf.nn.relu:激活函數(shù)(默認(rèn)是relu)

def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):
  """Reusable code for making a simple neural net layer.
  It does a matrix multiply, bias add, and then uses relu to nonlinearize.
  It also sets up name scoping so that the resultant graph is easy to read,
  and adds a number of summary ops.
  """
  # 設(shè)置命名空間
  with tf.name_scope(layer_name):
   # 調(diào)用之前的方法初始化權(quán)重w,并且調(diào)用參數(shù)信息的記錄方法,記錄w的信息
   with tf.name_scope('weights'):
    weights = weight_variable([input_dim, output_dim])
    variable_summaries(weights)
   # 調(diào)用之前的方法初始化權(quán)重b,并且調(diào)用參數(shù)信息的記錄方法,記錄b的信息
   with tf.name_scope('biases'):
    biases = bias_variable([output_dim])
    variable_summaries(biases)
   # 執(zhí)行wx+b的線性計算,并且用直方圖記錄下來
   with tf.name_scope('linear_compute'):
    preactivate = tf.matmul(input_tensor, weights) + biases
    tf.summary.histogram('linear', preactivate)
   # 將線性輸出經(jīng)過激勵函數(shù),并將輸出也用直方圖記錄下來
   activations = act(preactivate, name='activation')
   tf.summary.histogram('activations', activations)

   # 返回激勵層的最終輸出
   return activations

調(diào)用隱層創(chuàng)建函數(shù)創(chuàng)建一個隱藏層:輸入的維度是特征的維度784,神經(jīng)元個數(shù)是500,也就是輸出的維度。

hidden1 = nn_layer(x, 784, 500, 'layer1')

(2)創(chuàng)建一個dropout層,,隨機(jī)關(guān)閉掉hidden1的一些神經(jīng)元,并記錄keep_prob

with tf.name_scope('dropout'):
  keep_prob = tf.placeholder(tf.float32)
  tf.summary.scalar('dropout_keep_probability', keep_prob)
  dropped = tf.nn.dropout(hidden1, keep_prob)

(3)創(chuàng)建一個輸出層,輸入的維度是上一層的輸出:500,輸出的維度是分類的類別種類:10,激活函數(shù)設(shè)置為全等映射identity.(暫且先別使用softmax,會放在之后的損失函數(shù)中一起計算)

y = nn_layer(dropped, 500, 10, 'layer2', act=tf.identity)

2.5 創(chuàng)建損失函數(shù)

使用tf.nn.softmax_cross_entropy_with_logits來計算softmax并計算交叉熵?fù)p失,并且求均值作為最終的損失值。

with tf.name_scope('loss'):
  # 計算交叉熵?fù)p失(每個樣本都會有一個損失)
  diff = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)
  with tf.name_scope('total'):
   # 計算所有樣本交叉熵?fù)p失的均值
   cross_entropy = tf.reduce_mean(diff)

tf.summary.scalar('loss', cross_entropy)

2.6 訓(xùn)練,并計算準(zhǔn)確率

(1)使用AdamOptimizer優(yōu)化器訓(xùn)練模型,最小化交叉熵?fù)p失

with tf.name_scope('train'):
  train_step = tf.train.AdamOptimizer(learning_rate).minimize(
    cross_entropy)

(2)計算準(zhǔn)確率,并用tf.summary.scalar記錄準(zhǔn)確率

with tf.name_scope('accuracy'):
  with tf.name_scope('correct_prediction'):
   # 分別將預(yù)測和真實的標(biāo)簽中取出最大值的索引,弱相同則返回1(true),不同則返回0(false)
   correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
  with tf.name_scope('accuracy'):
   # 求均值即為準(zhǔn)確率
   accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
tf.summary.scalar('accuracy', accuracy)

2.7 合并summary operation, 運(yùn)行初始化變量

將所有的summaries合并,并且將它們寫到之前定義的log_dir路徑

# summaries合并
merged = tf.summary.merge_all()
# 寫到指定的磁盤路徑中
train_writer = tf.summary.FileWriter(log_dir + '/train', sess.graph)
test_writer = tf.summary.FileWriter(log_dir + '/test')

# 運(yùn)行初始化所有變量
tf.global_variables_initializer().run()

2.8 準(zhǔn)備訓(xùn)練與測試的兩個數(shù)據(jù),循環(huán)執(zhí)行整個graph進(jìn)行訓(xùn)練與評估

(1)現(xiàn)在我們要獲取之后要喂人的數(shù)據(jù).
如果是train==true,就從mnist.train中獲取一個batch樣本,并且設(shè)置dropout值;
如果是不是train==false,則獲取minist.test的測試數(shù)據(jù),并且設(shè)置keep_prob為1,即保留所有神經(jīng)元開啟。

def feed_dict(train):
  """Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""
  if train:
   xs, ys = mnist.train.next_batch(100)
   k = dropout
  else:
   xs, ys = mnist.test.images, mnist.test.labels
   k = 1.0
  return {x: xs, y_: ys, keep_prob: k}

(2)開始訓(xùn)練模型。
每隔10步,就進(jìn)行一次merge, 并打印一次測試數(shù)據(jù)集的準(zhǔn)確率,然后將測試數(shù)據(jù)集的各種summary信息寫進(jìn)日志中。
每隔100步,記錄原信息
其他每一步時都記錄下訓(xùn)練集的summary信息并寫到日志中。

for i in range(max_steps):
  if i % 10 == 0: # 記錄測試集的summary與accuracy
   summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
   test_writer.add_summary(summary, i)
   print('Accuracy at step %s: %s' % (i, acc))
  else: # 記錄訓(xùn)練集的summary
   if i % 100 == 99: # Record execution stats
    run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
    run_metadata = tf.RunMetadata()
    summary, _ = sess.run([merged, train_step],
               feed_dict=feed_dict(True),
               options=run_options,
               run_metadata=run_metadata)
    train_writer.add_run_metadata(run_metadata, 'step%03d' % i)
    train_writer.add_summary(summary, i)
    print('Adding run metadata for', i)
   else: # Record a summary
    summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
    train_writer.add_summary(summary, i)
 train_writer.close()
 test_writer.close()

2.9 執(zhí)行程序,tensorboard生成可視化

(1)運(yùn)行整個程序,在程序中定義的summary node就會將要記錄的信息全部保存在指定的logdir路徑中了,訓(xùn)練的記錄會存一份文件,測試的記錄會存一份文件。

(2)進(jìn)入linux命令行,運(yùn)行以下代碼,等號后面加上summary日志保存的路徑(在程序第一步中就事先自定義了)

tensorboard --logdir=

執(zhí)行命令之后會出現(xiàn)一條信息,上面有網(wǎng)址,將網(wǎng)址在瀏覽器中打開就可以看到我們定義的可視化信息了。:

Starting TensorBoard 41 on port 6006
(You can navigate to http://127.0.1.1:6006)

http://127.0.1.1:6006在瀏覽器中打開,成功的話如下:

于是我們可以從這個web端看到所有程序中定義的可視化信息了。

2.10 Tensorboard Web端解釋

看到最上面橙色一欄的菜單,分別有7個欄目,都一一對應(yīng)著我們程序中定義信息的類型。

(1)SCALARS

展示的是標(biāo)量的信息,我程序中用tf.summary.scalars()定義的信息都會在這個窗口。

回顧本文程序中定義的標(biāo)量有:準(zhǔn)確率accuracy,dropout的保留率,隱藏層中的參數(shù)信息,已經(jīng)交叉熵?fù)p失。這些都在SCLARS窗口下顯示出來了。

點(diǎn)開accuracy,紅線表示test集的結(jié)果,藍(lán)線表示train集的結(jié)果,可以看到隨著循環(huán)次數(shù)的增加,兩者的準(zhǔn)確度也在通趨勢增加,值得注意的是,在0到100次的循環(huán)中準(zhǔn)確率快速激增,100次之后保持微弱地上升趨勢,直達(dá)1000次時會到達(dá)0.967左右

點(diǎn)開dropout,紅線表示的測試集上的保留率始終是1,藍(lán)線始終是0.9

點(diǎn)開layer1,查看第一個隱藏層的參數(shù)信息。

 

以上,第一排是偏執(zhí)項b的信息,隨著迭代的加深,最大值越來越大,最小值越來越小,與此同時,也伴隨著方差越來越大,這樣的情況是我們愿意看到的,神經(jīng)元之間的參數(shù)差異越來越大。因為理想的情況下每個神經(jīng)元都應(yīng)該去關(guān)注不同的特征,所以他們的參數(shù)也應(yīng)有所不同。

第二排是權(quán)值w的信息,同理,最大值,最小值,標(biāo)準(zhǔn)差也都有與b相同的趨勢,神經(jīng)元之間的差異越來越明顯。w的均值初始化的時候是0,隨著迭代其絕對值也越來越大。

點(diǎn)開layer2


點(diǎn)開loss,可見損失的降低趨勢。

(2)IMAGES

在程序中我們設(shè)置了一處保存了圖像信息,就是在轉(zhuǎn)變了輸入特征的shape,然后記錄到了image中,于是在tensorflow中就會還原出原始的圖片了:

 

整個窗口總共展現(xiàn)了10張圖片(根據(jù)代碼中的參數(shù)10)

(3)AUDIO

這里展示的是聲音的信息,但本案例中沒有涉及到聲音的。

(4)GRAPHS

這里展示的是整個訓(xùn)練過程的計算圖graph,從中我們可以清洗地看到整個程序的邏輯與過程。

 

單擊某個節(jié)點(diǎn),可以查看屬性,輸入,輸出等信息

 

單擊節(jié)點(diǎn)上的“+”字樣,可以看到該節(jié)點(diǎn)的內(nèi)部信息。

 

另外還可以選擇圖像顏色的兩者模型,基于結(jié)構(gòu)的模式,相同的節(jié)點(diǎn)會有同樣的顏色,基于預(yù)算硬件的,同一個硬件上的會有相同顏色。

(5)DISTRIBUTIONS

這里查看的是神經(jīng)元輸出的分布,有激活函數(shù)之前的分布,激活函數(shù)之后的分布等。

(6)HISTOGRAMS

也可以看以上數(shù)據(jù)的直方圖

(7)EMBEDDINGS

展示的是嵌入向量的可視化效果,本案例中沒有使用這個功能。之后其他案例中再詳述。

本文主要使用手寫數(shù)字識別的小案例來講解了如何初步使用Tensorflow的可視化工具Tensorboard。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中的shutil模塊詳析

    Python中的shutil模塊詳析

    這篇文章主要介紹了Python中的shutil模塊詳析,Python的Shutil模塊可以看做是OS模塊的補(bǔ)充,它提供了對文件(夾)復(fù)制,移動,刪除,壓縮和解壓縮的方法,下面本文會對shutil模塊的常用方法進(jìn)行分類介紹,需要的朋友可以參考下
    2023-09-09
  • 用Python編程實現(xiàn)語音控制電腦

    用Python編程實現(xiàn)語音控制電腦

    是否經(jīng)常好萊塢電影里看強(qiáng)大的語音識別系統(tǒng)? 是否每每看到都會羨慕嫉妒恨? 可是我們真心買不起啊。
    2014-04-04
  • 關(guān)于PyCharm安裝后修改路徑名稱使其可重新打開的問題

    關(guān)于PyCharm安裝后修改路徑名稱使其可重新打開的問題

    這篇文章主要介紹了關(guān)于PyCharm安裝后修改路徑名稱使其可重新打開的問題,本文通過圖文實例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • pytorch鎖死在dataloader(訓(xùn)練時卡死)

    pytorch鎖死在dataloader(訓(xùn)練時卡死)

    這篇文章主要介紹了pytorch鎖死在dataloader(訓(xùn)練時卡死),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python中的代碼運(yùn)行時間獲取方式

    python中的代碼運(yùn)行時間獲取方式

    這篇文章主要介紹了python中的代碼運(yùn)行時間獲取方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python實現(xiàn)獲取某天是某個月中的第幾周

    Python實現(xiàn)獲取某天是某個月中的第幾周

    這篇文章主要介紹了Python實現(xiàn)獲取某天是某個月中的第幾周,本文代碼實現(xiàn)獲取指定的某天是某個月中的第幾周、周一作為一周的開始,需要的朋友可以參考下
    2015-02-02
  • 重命名批處理python腳本

    重命名批處理python腳本

    師兄采集的視網(wǎng)膜圖像放在一個文件夾下,由于分類十分混亂,因此出現(xiàn)了一個文件多次出現(xiàn)的情況,因此讓我寫了個腳本
    2013-04-04
  • python在命令行中使用?pdb?實現(xiàn)斷點(diǎn)調(diào)試功能

    python在命令行中使用?pdb?實現(xiàn)斷點(diǎn)調(diào)試功能

    在命令行中設(shè)置斷點(diǎn)通常需要使用調(diào)試工具來實現(xiàn),下面以 Python 為例介紹如何在命令行中使用pdb實現(xiàn)斷點(diǎn)調(diào)試,這篇文章主要介紹了python在命令行中使用pdb實現(xiàn)斷點(diǎn)調(diào)試,需要的朋友可以參考下
    2023-06-06
  • python FTP批量下載/刪除/上傳實例

    python FTP批量下載/刪除/上傳實例

    今天小編就為大家分享一篇python FTP批量下載/刪除/上傳實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python匿名函數(shù)的使用方法解析

    python匿名函數(shù)的使用方法解析

    這篇文章主要介紹了python匿名函數(shù)的使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10

最新評論