精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

機器學習入門之HelloWorld(Tensorflow)

人工智能 機器學習
初學機器學習,寫篇文章mark一下,希望能為將入坑者解點惑。本文介紹一些機器學習的入門知識,從安裝環境到跑通機器學習入門程序MNIST demo。

 源碼下載地址:https://share.weiyun.com/a0c1664d334c4c67ed51fc5e0ac5f2b2

初學機器學習,寫篇文章mark一下,希望能為將入坑者解點惑。本文介紹一些機器學習的入門知識,從安裝環境到跑通機器學習入門程序MNIST demo。

[[222620]]

內容提綱:

  1. 環境搭建
  2. 了解Tensorflow運行機制
  3. MNIST(手寫數字識別 ) softmax性線回歸
  4. MNIST 深度卷積神經網絡(CNN)
  5. tools 工具類
  6. CPU & GPU & multi GPU
  7. 學習資料

1 環境搭建 (Windows)

  • 安裝虛擬環境 Anaconda,方便python包管理和環境隔離。

Anaconda3 4.2 https://www.anaconda.com/downloads,自帶python 3.5。

  • 創建tensorflow隔離環境。打開Anaconda安裝后的終端Anaconda Prompt,執行下面命令
  1. conda create -n tensorflow python=3.5 #創建名為tensorflow,python版本為3.5的虛擬環境 
  2. activate tensorflow #激活這個環境   
  3. deactivate #退出當前虛擬環境。這個不用執行 

CPU 版本

  1. pip install tensorflow #通過包管理來安裝 
  2. pip install whl-file #通過下載 whl 文件安裝,tensorflow-cpu安裝包:http://mirrors.oa.com/tensorflow/windows/cpu/tensorflow-1.2.1-cp35-cp35m-win_amd64.whl, cp35是指python3.5 

GPU 版本。我的筆記本是技持NVIDIA顯卡的,可以安裝cuda,GPU比CPU快很多,不過筆記本的顯存不大,小模型還可以跑,大模型建議在本地用CPU跑通,到Tesla平臺上訓練。

注意點:選擇正確的 CUDA 和 cuDNN 版本搭配,不要只安裝最新版本,tensorflow可能不支持。

目前Tensorflow已支持到CUDA 9 & cuDNN 7,之前本人安裝只支持CUDA 8 & cuDNN 6,所以用是的:

CUDA8.1 https://developer.nvidia.com/cuda-80-ga2-download-archive

cudnn 6 https://developer.nvidia.com/cudnn ,將cudnn包解壓,把文件放到cuda安裝的對應目錄中,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0,bin對應bin,include對應include,再添加bin目錄到環境變量path中。

  1. pip install tensorflow-gpu #通過包管理來安裝 
  2. pip install whl-file #http://mirrors.oa.com/tensorflow/windows/gpu/tensorflow_gpu-1.2.1-cp35-cp35m-win_amd64.whl  

一些python工具包安裝。用到啥安啥就行, pip install,不行就找源碼編譯安裝

  1. (tensorflow) D:\> pip install opencv-python   #opencv, tensoflow 虛擬環境中 
  2. (tensorflow) D:\> pip install scipy    #圖片讀取寫入,scipy.misc.imread 
  3. (tensorflow) D:\> pip install Pillow   #PIL/Pillow,這里有個坑,壓縮過的PNG圖,在1.x版本解析會出現透明通道質量下降,升級 

2 了解Tensorflow運行機制

  • 上代碼。注意注釋說明
  1. import tensorflow as tf 
  2. hello_world = tf.constant('Hello World!', dtype=tf.string) #常量tensor 
  3. print(hello_world) #這時hello_world是一個tensor,代表一個運算的輸出 
  4. #out: Tensor("Const:0", shape=(), dtype=string) 
  5. hello = tf.placeholder(dtype=tf.string, shape=[None])#占位符tensor,在sess.run時賦值 
  6. world = tf.placeholder(dtype=tf.string, shape=[None]) 
  7. hello_world2 = hello+world #加法運算tensor 
  8. print(hello_world2) 
  9. #out: Tensor("add:0", shape=(?,), dtype=string) 
  10. #math 
  11. x = tf.Variable([1.0, 2.0]) #變量tensor,可變。 
  12. y = tf.constant([3.0, 3.0]) 
  13. mul = tf.multiply(x, y) #點乘運算tensor 
  14. #logical 
  15. rgb = tf.constant([[[255], [0], [126]]], dtype=tf.float32) 
  16. logical = tf.logical_or(tf.greater(rgb,250.), tf.less(rgb, 5.))#邏輯運算,rgb中>250 or <5的位置被標為True,其它False 
  17. where = tf.where(logical, tf.fill(tf.shape(rgb),1.), tf.fill(tf.shape(rgb),5.))#True的位置賦值1,False位置賦值5 
  18. # 啟動默認圖. 
  19. # sess = tf.Session() 
  20. with tf.Session() as sess: 
  21.     sess.run(tf.global_variables_initializer())#變量初始化 
  22.     result = sess.run(hello_world) #Fetch, 獲取tensor運算結果 
  23.     print(result, result.decode(), hello_world.eval())#`t.eval()` is a shortcut for calling  `tf.get_default_session().run(t)`. 
  24.     #out: b'Hello World!' Hello World! b'Hello World!' #前輟'b'表示bytestring格式,decode解成string格式 
  25.     print(sess.run(hello, feed_dict={hello: ['Hello']})) 
  26.     #out: ['Hello'
  27.     print(sess.run(hello_world2, feed_dict={hello: ['Hello'], world: [' World!']}))#Feed,占位符賦值 
  28.     #out: [b'Hello World!'
  29.     print(sess.run(mul)) 
  30.     #out: [ 3.  6.] 
  31.     print(sess.run(logical)) 
  32.     #out: [[[ True] [ True] [False]]] #rgb中>250 or <5的位置被標為True,其它False 
  33.     print(sess.run(where)) 
  34.     #out: [[[ 1.] [ 1.] [ 5.]]] #True的位置賦值1,False位置賦值5 
  35. #sess.close()#sess如果不是用with方式定義,需要close 
  • Tensor。是一個句柄,代表一個運算的輸出,但并沒有存儲運算輸出的結果,需要通過tf.Session.run(Tensor)或者Tensor.eval()執行運算過程后,才能得到輸出結果。A Tensor is a symbolic handle to one of the outputs of an Operation,It does not hold the values of that operation's output, but instead provides a means of computing those values in a TensorFlow.
  • Tensorflow運行過程:定義計算邏輯,構建圖(Graph) => 通過會話(Session),獲取結果數據。基本用法參見鏈接。

3 MNIST(手寫數字識別 ) softmax性線回歸

  • 分析

MNIST是一個入門級的計算機視覺數據集,它包含各種手寫數字圖片:

它也包含每一張圖片對應的標簽,告訴我們這個是數字幾。比如,上面這四張圖片的標簽分別是5,0,4,1。

數據集圖片大小28x28,單通道灰度圖。存儲樣式如下:

MNIST手寫數字識別的目的是輸入這樣的包含手寫數字的28x28的圖片,預測出圖片中包含的數字。

softmax線性回歸認為圖片中數字是N可能性由圖像中每個像素點用

表示是 數字 i 的可能性,計算出所有數字(0-9)的可能性,也就是所有數字置信度,然后把可能性最高的數字作為預測值。

evidence的計算方式如下:

其中 

 代表權重,

 代表數字 i 類的偏置量,j 代表給定圖片 x 的像素索引(0~28x28=784),用于像素求和。即圖片每個像素值x權重之和,再加上一個偏置b,得到可能性值。

引入softmax的目的是對可能性值做歸一化normalize,讓所有可能性之和為1。這樣可以把這些可能性轉換成概率 y:

 

  • 開始實現

數據

X樣本 size 28x28 = 784

Y樣本 ,樣式如

讀取

  1. from tensorflow.examples.tutorials.mnist import input_data 
  2. mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) #total 55000,one_hot方式,圖片x格式為1維數組,大小784 
  3. batch_xs, batch_ys = mnist.train.next_batch(batch_size) #分batch讀取 

 構建圖(Graph)

Inference推理,由輸入 x 到輸出預測值 y 的推理過程

  1. x = tf.placeholder(tf.float32, [None, 784], name="input")#None表示batch size待定 
  2. with tf.variable_scope("inference"):#定義作用域,名子inference 
  3.     W = tf.Variable(tf.zeros([784, 10])) #初值為0,size 784x10 
  4.     b = tf.Variable(tf.zeros([10])) #初值為0 size 10 
  5.     y = tf.matmul(x, W) + b #矩陣相乘 

 Loss 損失函數,分類一般采用交叉熵,這里用的是softmax交交叉熵。交叉熵是用來度量兩個概率分布間的差異性信息,交叉熵公式如下:

  1. with tf.variable_scope("loss"): 
  2.     loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y), name="loss"
  3.     #softmax交叉熵公式: z * -log(softmax(x)) + (1 - z) * -log(1 - softmax (x)) # x: logits, z: label 

 計算loss的方法有很多種,常見的還有L1 loss 、L2 loss、sigmoid 交叉熵、聯合loss、自定義loss...

Accuracy 準確率,預測值與真實值相同的概率。矩陣相乘輸出y值是一個數組,tf.argmax函數可能從數據中找出最大元素下標,預測值的最大值下標和真值的最大值下標一致即為正確。

  1. with tf.variable_scope("accuracy"): 
  2.     accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)), tf.float32), name="accuracy"

Training 訓練,訓練的目的是讓Loss接近最小化,預測值接近真值,Tensorflow通過優化器Optimizers來實現。在y = Wx+b中,W、b在訓練之初會賦初值(隨機 or 0),經過Optimizer不短優化,Loss逼近最小值,使W、b不斷接近理想值。W、b一起共784x10+10個參數。

  1. train_step = tf.train.GradientDescentOptimizer(FLAGS.learning_rate).minimize(loss) 

minimize函數:更新參數,讓Loss最小化,包含兩個步驟:計算梯度;更新參數。

  1. grad_var = compute_gradients(loss) # return (gradient, variable) pairs 
  2. apply_gradients(grad_var) #沿著參數的梯度反方向更新參數,讓Loss變小 

 GradientDescentOptimizer:梯度下降算法優化器, Tensorflow實現的是SGD(隨機梯度下降)。其缺點是依賴當前batch,波動較大。

其它一些增強版Optimizers:參考鏈接。 MomentumOptimizer、AdadeltaOptimizer、AdamOptimizer、RMSPropOptimizer、AdadeltaOptimizer ...

Session:Tensorflow需要通過Session(會話)來執行推理運算,有兩種創建方式,兩者差別在于InteractiveSession會將自己設置為默認session,有了默認session,tensor.eval()才能執行。

  1. sess = tf.Session() 
  2. sess = tf.InteractiveSession() 

也可以通過下設置默認session:

  1. with sess.as_default(): xx.eval() 
  2. with tf.Session() as sess: xx.eval() 

 配置gpu相關session參數:

  1. sess_config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=False)#允許沒有gpu或者gpu不足時用軟件模擬 
  2. sess_config.gpu_options.allow_growth = True #動態申請顯存。不加會申請全部,導致其他訓練程序不能運行 
  3. #sess_config.gpu_options.per_process_gpu_memory_fraction = 0.8 #按比例申請顯存 
  4. sess = tf.InteractiveSession(config=sess_config) 

 一個網絡的訓練過程是一個不斷迭代(前向+反向)的過程。前向算法由前向后計算網絡各層輸出,反向算法由后向前計算參數梯度,優化參數,減小Loss。流程如圖:

注意:每隔一段時間輸出一下網絡Loss和Accuracy,查看效果。每隔一段時間緩存一下網絡參數,防止被突然中斷,可再恢復。

模型參數的保存與恢復:

    check point:默認保存方式。

    pb:mobile使用。

    npz:字典保存方式,{name: value}, numpy的一種保存方式。對參數按名保存,按名恢復。save和restore方法自己控制,可以選擇性保存和恢復。參見附近代碼中【tools.py】save_npz_dict & load_and_assign_npz_dict方法。

  1. saver = tf.train.Saver(max_to_keep = 3, write_version = 2) 
  2. save_path = saver.save(sess, FLAGS.out_model_dir+'/model.ckpt')# check point方式 
  3. output_graph_def = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def, output_node_names=['output'])#指定輸出節點名稱,這個需要在網絡中定義 
  4. with tf.gfile.FastGFile(FLAGS.out_model_dir+'/mobile-model.pb', mode='wb'as f: 
  5.     f.write(output_graph_def.SerializeToString()) #pb方式 
  6. tools.save_npz_dict(save_list=tf.global_variables(), name=FLAGS.out_model_dir+'/model.npz', sess=sess) #pnz方式 

     恢復:

  1. #check point 
  2. saver = tf.train.Saver(max_to_keep = 3, write_version = 2) 
  3. model_file=tf.train.latest_checkpoint(FLAGS.log_dir) 
  4. if model_file: 
  5.      saver.restore(sess, model_file) 
  6. #npz 
  7. tools.load_and_assign_npz_dict(name=FLAGS.log_dir+'/model.npz', sess=sess))打印網絡中各參數信息:方便查看網絡參數是否正確。 
  1. def print_all_variables(train_only=False): 
  2.     if train_only: 
  3.         t_vars = tf.trainable_variables() 
  4.         print("  [*] printing trainable variables"
  5.     else
  6.         t_vars = tf.global_variables() 
  7.         print("  [*] printing global variables"
  8.     for idx, v in enumerate(t_vars): 
  9.         print("  var {:3}: {:15}   {}".format(idx, str(v.get_shape()), v.name)) 
  •  可視化。Tensorflow提供tensorboard可視化工具,通過命令打開web服務,由瀏覽器查看,輸入網址http://localhost:6006
  1. tensorboard --logdir=your-log-path #path中不要出現中文 
  2. # 需要在訓練過程指定相應log路徑,寫入相關信息 
  3. # 參考附件【sample.py】中summary、writer相關關鍵字代碼。 

Graph可視化:

訓練過程可視化:

batch size = 128, 訓練集,驗證集。可以看到loss在收斂,accuracy在提高。由于訓練集曲線反應的是當前batch的loss和accuracy,batch size相對不高,抖動較大。而驗證集是全部圖片進行測試,曲線較平滑。

4 MNIST深度卷積神經網絡(CNN)

Softmax性線回歸網絡中,輸出y是輸入x的線性組合,即y = Wx+b,這是線性關系。在很多問題中其解法并非線性關系能完成的,在深度學習,能過能多層卷積神經網絡組合非線性激活函數來模擬更復雜的非線性關系,效果往往比單一的線性關系更好。先看深度卷積神經網絡(CNN,Convolutional Neural Network)構建的MNIST預測模型,再逐一介紹各網絡層。

  • MNIST CNN Inference推理圖。從輸入到輸出中間包含多個網絡層:reshape、conv卷積、pool池化、fc全鏈接、dropout。自底向上輸入原始圖片數據x經過各層串行處理,得到各數字分類概率預測輸出y。Inference的結果轉給loss用作迭代訓練,圖中的

可以看出用的是AdamOptimizer優化器。

  • reshape 變形,對數據的邏輯結構進行改變,如二維變四維:[1, 784] => [1, 28, 28, 1],數據存儲內容未發生改變。這里由于輸入數據存儲的手寫圖片是一維數據,轉成[batch_size, height, width, channels]格式
  1. with tf.name_scope('reshape'): #scope 
  2.        inputs = tf.reshape(inputs, [-1, 28, 28, 1]) 
  3.        #[batch_size, height, width, channels], batch size=-1表示由inputs決定, 
  4.        #batch_size=inputs_size/(28x28x1) 
  • conv2d 卷積, 卷積核(yellow)與Image元(green)素相乘,累加得到輸出元素值(red)。Image的每個Channel(通道)都對應一個不同的卷積核,Channel內卷積核參數共享。所有輸入channel與其kernel相乘累加多層得到輸出的一個channel值。輸出如有多個channel,則會重復多次,kernel也是不同的。所以會有input_channel_count * output_channel_count個卷積核。在卷積層中訓練的是卷積核。
  1. def conv2d(x, W): #W: filter [kernel[0], kernel[1], in_channels, out_channels] 
  2.   return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME'

 tf.nn.conv2d:

data_format: input和output數據的邏輯結構,NHWC : batch height width channel。NCHW: batch channel height width。常用的是NHWC格式;在一些輸入數據中各通道數據分開存放,這種更適合NCHW。

input:輸入,data_format=NHWC時,shape為batch, in_height, in_width, in_channels,Tensor。

filter:卷積核,shape為filter_height, filter_width, in_channels, out_channels,共有in_channels*out_channels個filter_height, filter_width的卷積核,輸入輸出channel越多,計算量越大。

strides: 步長,shape為1, stride_h, stride_w, 1,通常stride_h和stride_w相等,表示卷積核延縱橫方向上每次前進的步數。上gif圖stride為1。

padding:卷積計算時數據不對齊時填充方式,VALID:丟棄多余;SAME:兩端補0,讓多余部分可被計算。

output:輸出,shape為batch, out_height, out_width, out_channels

  1. output[b, i, j, k] = 
  2.     sum_{di, dj, q} input[b, strides[1] * i + di, strides[2] * j + dj, q] * 
  3.                     filter[di, dj, q, k] 
  • 激活函數,與卷積搭配使用。激活函數不是真的要去激活什么,在神經網絡中,激活函數的作用是能夠給神經網絡加入一些非線性因素,使得神經網絡可以更好地解決較為復雜的問題。

tf.nn.relu即是激活函數,對卷積輸出作非線性處理,其函數如下:

其它還有如sigmoid:

tanh:

  • Pool池化,有最大池化和平均值池化,計算與卷積計算類似,但無卷積核,求核所覆蓋范圍的最大值或平均值,輸入channel對應輸出channel,沒有多層累加情況。輸入與輸出 channel數相同,輸出height、width取決于strides。
  1. if is_max_pool: 
  2.     x = tf.nn.max_pool(x, [1,kernel[0],kernel[1],1], strides=[1,stride[0],stride[1],1], padding=padding, name='pool'
  3. else
  4.     x = tf.nn.avg_pool(x, [1,kernel[0],kernel[1],1], strides=[1,stride[0],stride[1],1], padding=padding, name='pool'
  • Dropout,隨機刪除一些數據,讓網絡在這些刪除的數據上也能訓練出準確的結果,讓網絡有更強的適應性,減少過擬合。
  1. x = tf.nn.dropout(x, keep_prob) #keep_prob 保留比例,keep_prob=1.0表示無dropout 
  •  BN(batch normalize),批規范化。Inference中未標出,demo中未使用,但也是網絡中很常用的一層。BN常作用在非線性映射前,即對Conv結果做規范化。一般的順序是 卷積-> BN -> 激活函數。

BN好處:提升訓練速度,加快loss收斂,增加網絡適應性,一定程序的解決反向傳播過程中的梯度消失和爆炸問題。詳細請戳。

  • FC(Full Connection)全連接,核心是矩陣相乘

,softmax性線回歸就是一個FC。在CNN中全連接常出現在最后幾層,用于對前面設計的特征做加權和。Tensorflow提供了相應函數tf.layers.dense。

  • 日志,下圖打印了模型中需要訓練的參數的shape 和 各層輸出數據的shape(batch_size=1時),附件【tool.py】中有相關代碼。目的是方便觀自己搭的網絡結構是否符合預期。

數據由[1x784] -reshape-> [1x28x28x1](batch_size, height, width, channels) -conv-> [1x28x28x32] -pool-> [1x14x14x32] -conv-> [1x14x14x64] -pool-> [1x7x7x64] -fc-> [1x1024] -fc-> [1x10](每類數字的概率)

  • 訓練效果,詳細代碼參考附件【cnn.py】

  • 一個網上的可視化手寫識別DEMO,http://scs.ryerson.ca/~aharley/vis/conv/flat.html
  • CNN家族經典網絡,如LeNet,AlexNet,VGG-Net,GoogLeNet,ResNet、U-Net、FPN。它們也都是由基本網絡層元素(上述介紹)堆疊而成,像搭積木一樣。

VGG,如下圖,非常有名的特征提取和分類網絡。由多層卷積池化層組成,最后用FC做特征融合實現分類,很多網絡基于其前幾層卷積池化層做特征提取,再發展自己的業務。

5 tool工具類

【tool.py】是一個自己基于tensorflow二次封裝的工具類,位于附件中。好處是以后編程更方便,代碼結構更好看。網上也有現成的開源庫,如TensorLayer、Keras、Tflearn,自己封裝的目的是更好的理解tensorflow API,自己造可控性也更強一些,如果控制是參數是否被訓練、log打印。

下圖是MNIST CNN網絡的Inference推理代碼:

6 CPU & GPU & multi GPU

  • CPU, Tensorflow默認所有cpu都是/cpu:0,默認占所有cpu,可以通過代碼指定占用數。
  1. sess_config = tf.ConfigProto(device_count={"CPU": 14}, allow_soft_placement=True, log_device_placement=False
  2. sess_config.intra_op_parallelism_threads = 56 
  3. sess_config.inter_op_parallelism_threads = 56 
  4. sess = tf.InteractiveSession(config=sess_config) 
  • GPU,Tensorflow默認占用/gpu:0, 可通過指定device來確定代碼運行在哪個gpu。下面
  1. with tf.device('/device:GPU:2'): 
  2.    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a'
  3.    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b'
  4.    c = tf.matmul(a, b) 
  5. #下面的代碼配置可以避免GPU被占滿,用多少內存占多少 
  6. sess_config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=False
  7. sess_config.gpu_options.allow_growth = True 
  8. sess_config.gpu_options.per_process_gpu_memory_fraction = 0.8 
  9. sess = tf.InteractiveSession(config=sess_config) 

 多塊GPU時,可以通過在終端運行下面指令來設置CUDA可見GPU塊來控制程序使用哪些GPU。

  1. export CUDA_VISIBLE_DEVICES=2,3 
  • 多GPU使用,在Tensorflow中多GPU編程比較尷尬,資料較好,代碼寫起比較復雜,這一點不如Caffe。

在Tensorflow中你需要自己寫代碼控制多GPU的loss和gradient的合并,這里有個官方例子請戳。自己也寫過多GPU的工程,附件代碼【tmp-main-gpus-不可用.py】可做參考,但此處不可用,來自它工程。

7 學習資料

收藏了一些機器學習相關資料,分享一下。自己也只看過很小一部分,仍在學習中....

Google最近出的機器學習速成課程 https://developers.google.cn/machine-learning/crash-course/ml-intro

斯坦福大學公開課 :機器學習課程 Andrew Ng吳恩達 http://open.163.com/special/opencourse/machinelearning.html

我愛機器學習博客 https://www.52ml.net/

曉雷機器學習筆記 https://zhuanlan.zhihu.com/xiaoleimlnote

lilicao博客 http://www.cnblogs.com/lillylin/

貓狗大戰知乎專欄 https://zhuanlan.zhihu.com/alpha-smart-dog

計算機視覺,機器學習相關領域源代碼大集合 https://zhuanlan.zhihu.com/p/26691794

物體檢測大集合 https://handong1587.github.io/deep_learning/2015/10/09/object-detection.html#r-cnn

機器學習筆記 https://feisky.xyz/machine-learning/

原文鏈接:https://cloud.tencent.com/developer/article/1058521

【本文是51CTO專欄作者“云加社區”的原創稿件,轉載請通過51CTO聯系原作者獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-03-16 08:46:43

TensorFlow安裝入門

2022-11-04 11:52:36

機器學習

2017-10-23 15:46:37

2021-11-02 09:40:50

TensorFlow機器學習人工智能

2017-05-17 08:24:08

TensorFlow機器學習線性回歸

2022-06-09 16:48:10

TensorFlow機器學習

2018-12-29 08:00:00

機器學習TensorFlowKubeflow

2017-05-09 08:48:44

機器學習

2020-05-19 14:29:50

機器學習TensorFlow

2020-08-25 10:30:59

TensorFlow數據機器學習

2019-03-08 09:28:42

Google 開源技術

2018-09-10 14:38:16

編程語言TensorFlow.機器學習

2017-11-24 10:43:43

Madlib機器學習

2024-11-29 12:00:00

Python機器學習

2017-10-24 14:32:48

2017-04-26 11:00:34

Spring BootHelloWorld詳解

2020-08-12 09:46:46

TensorFlow數據機器學習

2020-11-06 09:00:00

機器學習集成學習人工智能

2020-07-15 13:51:48

TensorFlow數據機器學習

2016-05-17 14:24:56

亞馬遜機器學習
點贊
收藏

51CTO技術棧公眾號

乱子伦视频在线看| 亚洲一区制服诱惑| 日韩和欧美的一区| 成人一级免费视频| 国产日韩精品在线观看| 国产福利91精品一区二区三区| 国产欧美熟妇另类久久久| 91亚洲精华国产精华| 91免费观看在线| 黄色片免费在线| 高清视频一区| 99精品一区二区| 777电影在线观看| 艳母动漫在线观看| 色菇凉天天综合网| 国产一区二区三区四区五区3d| 精品日韩久久久| 欧美一区日韩一区| 久久免费视频66| 受虐m奴xxx在线观看| 欧美成人小视频| 欧美理论一区二区| 中文字幕欧美激情| 国产理论电影在线| 亚洲av无码久久精品色欲| 中文字幕视频在线免费欧美日韩综合在线看| 欧美日韩一区二区国产| 一区二区不卡视频在线观看| 麻豆视频成人| 亚洲精品网站在线观看| 日韩福利一区| 性色av蜜臀av浪潮av老女人| 在线观看91久久久久久| 日韩高清电影一区| 好操啊在线观看免费视频| 亚洲福利精品视频| 欧美成人合集magnet| 99精品欧美一区| 成人在线免费| 亚洲精品国产精品乱码| 精品欧美国产| 欧美亚洲愉拍一区二区| 激情欧美日韩一区| av网页在线| 国产在线不卡av| 日本最新高清不卡中文字幕| 自拍av一区二区三区| 日韩激情啪啪| 亚洲大尺度网站| 久久国产精品久久久| 岛国精品在线观看| 亚洲福利影视| 人人妻人人澡人人爽久久av | 茄子视频成人在线| 国产精品夜夜夜| 国产偷人妻精品一区二区在线| 亚洲精品视频一区二区三区| 欧美日韩精品高清| 99av国产精品欲麻豆| www.中文字幕久久久| 精品久久久久久无码人妻| 2019中文字幕免费视频| 曰韩精品一区二区| 色中色综合网| 国产三级在线| 久久久久亚洲av无码专区首jn| 91av福利视频| 精品美女久久久久久免费| 国产精品久久久久一区二区三区厕所 | 在线成人性视频| 亚洲欧洲xxxx| av电影在线观看完整版一区二区| 国产成人澳门| 亚洲精品一区二区三区区别| 极品人妻一区二区| 91视频最新| 91精品国产综合久久福利| 国产一区二区视频在线播放| 国产日本亚洲| 国产一区二区小视频| www.99av.com| 91精品免费看| 91精品国产美女浴室洗澡无遮挡| 久久国产精品72免费观看| 国产精品美女久久久久人| 99热这里只有精品5| 一级全黄裸体片| 蜜桃传媒一区二区| 久久精品国产免费观看| 一区二区三区av电影| 在线亚洲一区| 亚洲精品伦理| 国产熟女一区二区丰满| 一级黄色免费视频| 国产高清在线一区二区| 欧美精品一区视频| 99re成人精品视频| 日韩一区二区三区免费播放| 日韩经典av| 中国女人真人一级毛片| 国产精品19p| 午夜久久资源| 45www国产精品网站| 日韩一区二区中文字幕| av电影一区二区| 精品久久美女| 午夜羞羞小视频在线观看| 无码一区二区三区| 中文字幕人妻无码系列第三区| 国产精品白丝jk白祙| 亚洲网站视频福利| 亚洲国产日韩a在线播放性色| 久草这里只有精品视频| 色综合中文网| 国内激情视频在线观看| 91成人国产综合久久精品| 51妺嘿嘿午夜福利| 欧美日韩亚洲第一| 欧美日韩高清免费| 国产精品精品一区二区三区午夜版 | 国产在线日韩在线| 一区二区福利视频| 亚洲一级二级三级在线免费观看| 日韩福利视频网| 秋霞蜜臀av久久电影网免费| 日本伦理一区二区| 国产精品伦一区二区三区| 一区二区三区四区免费| 丁香六月激情婷婷| 国产美女高潮久久白浆| 国产亚洲人成a一在线v站| 色先锋资源久久综合| 国产日韩精品视频一区| 模特精品在线| 精品国产精品| 欧美美女被草| 在线观看h片| 亚洲成人一级片| 毛片aaaaa| 玖玖爱视频在线| 中文字幕中文字幕一区三区| 91精品视频在线| 久久777国产线看观看精品| 精品国产乱码久久久久久图片 | 国产91色综合久久免费分享| 国产美女诱惑一区二区| 免费视频亚洲| 午夜免费欧美电影| 日韩国产激情| 精品黄色免费中文电影在线播放| 手机看片福利永久| 亚洲性生活大片| 五月天婷婷丁香| 女人18毛片毛片毛片毛片区二| 国产xxxxxxxxx| 日韩av自拍偷拍| 欧美成人黄色网址| 欧美成人xxxxx| 欧美另类videos| 日本免费一区二区三区| 国产精品一区二区不卡视频| 国产精品xxx视频| 久久精品人人爽| 日韩亚洲综合在线| 精品国产精品一区二区夜夜嗨| 在线观看亚洲成人| 天天综合网 天天综合色| 亚洲三级在线观看| 久久精品视频在线看| 91在线看国产| 91免费观看视频| 91丨porny丨首页| 久久夜色精品一区| 国产人成亚洲第一网站在线播放| 99久久99久久免费精品蜜臀| 91免费看`日韩一区二区| 成人av在线播放网址| 国产麻豆欧美日韩一区| 久久av老司机精品网站导航| 国产一区亚洲一区| 从欧美一区二区三区| a在线欧美一区| 国产三级一区二区| 国产精品色哟哟网站| 国产精品久久久久久户外露出 | 国产精品中文字幕在线观看| 国产免费观看久久黄| 成人黄色短视频在线观看| 99在线看视频| 亚洲精品免费在线看| 免费成人午夜视频| 欧美一级小视频| 国产精品成人99一区无码 | 免费污视频在线观看| 神马久久午夜| 国产伦精品一区二区三区免费优势| 亚洲国产视频二区| 国产成人精品亚洲线观看| 97视频热人人精品免费| 亚洲一区二区毛片| 久久精品99久久久| www.66久久| 国产精品久久久久毛片软件| 亚洲成年人影院| 欧洲精品一区二区| 亚洲激情 国产| 欧美伦理91i| 国产欧美 在线欧美| 日韩av高清| 欧在线一二三四区| 国模大尺度视频| aa片在线观看视频在线播放| 麻豆亚洲av成人无码久久精品| 欧美一区二区三区久久久| 草逼视频免费看| 成人在线观看网站| 国产精品186在线观看在线播放| 精品123区| 成人一区二区| 激情小说亚洲一区| 亚洲精品欧美专区| 日韩欧美中文字幕精品| 久久久精品免费视频| 国产aⅴ夜夜欢一区二区三区| 91超碰在线免费观看| 精品日韩在线播放| 日本成人xxx| 五月天av网站| 性xxxx视频播放免费| 日日av拍夜夜添久久免费| 国产a久久精品一区二区三区| 久久久噜噜噜久久狠狠50岁| 久久综合九色综合97_久久久| 在线欧美一区二区| 久久精品人人爽| 国产三级精品在线不卡| 精品视频无码一区二区三区| 91导航在线观看| 午夜国产在线视频| 天堂久久av| 丝袜亚洲精品中文字幕一区| 中文字幕av资源一区| 91精品国产色综合久久不卡电影| 久久久国产精品一区| 国产日本一区二区三区| 在线黄色免费看| 亚洲精品中文字幕乱码三区91| 好了av在线| 日韩免费看片| 久久久激情视频| 在线不卡的av| 26uuu久久噜噜噜噜| 国产奶头好大揉着好爽视频| 日本aaa视频| 黄色av网址在线| 亚洲天堂导航| 亚洲经典一区| 国产精品全国免费观看高清| 亚洲精品国产福利| 国产精品免费区二区三区观看| 15—17女人毛片| 在线观看黄色国产| 国产欧美一区二区三区精品酒店| 午夜精品婷婷| 中文字幕永久在线不卡| 精品福利视频一区二区三区| 91九色综合久久| 性欧美在线视频| 99er热精品视频| 中文字幕区一区二区三| 国产福利精品一区二区| 欧美亚洲综合久久| 国产精品视频播放| 日本三区在线观看| 中文字幕乱码无码人妻系列蜜桃| av大全在线| 今天的高清视频免费播放成人| 亚洲永久免费av| 2019中文字幕在线| 97人人爽人人| 蜜臀av午夜精品| 美女精品久久| 老牛影视一区二区三区| 欧美视频一区二区在线观看| 91日韩在线播放| 精品人妻无码一区二区三区换脸| 秋霞网一区二区| 四季av一区二区凹凸精品| 亚洲一卡二卡三卡四卡五卡| 热re91久久精品国99热蜜臀| 久久久精品三级| 三级av在线免费观看| 国产污视频在线播放| 国产精品一区二区无线| 亚洲精品中文字幕av| 亚洲欧美影院| 国产一级一片免费播放| 亚洲天堂1区| 91小视频在线观看| 久久久国产在线视频| 在线不卡一区二区三区| 天堂av在线播放| 日韩精品免费一区二区在线观看 | 免费中文字幕在线观看| 欧美xxxx性| 久久久久久久免费视频了| 国内揄拍国内精品少妇国语| 91插插插插插插插插| 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻av无码一区二区三区 | 欧美激情视频在线| 性一交一黄一片| 色多多视频在线观看| 日韩精品久久久久久| 国产婷婷成人久久av免费高清 | 成人免费直播live| 亚洲aaa视频| 国产电影一区二区| 日韩美女视频一区二区| 国产99久久精品一区二区| 日韩少妇一区二区| 日韩精品99| 亚洲情趣在线观看| 91视频免费进入| 欧美 日韩 国产 一区二区三区| 精品久久毛片| 一区二区三区中文字幕精品精品| 97se国产在线视频| 久久午夜无码鲁丝片| 天堂在线精品| 色8久久人人97超碰香蕉987| 椎名由奈jux491在线播放| 国产裸体无遮挡| 亚洲久色影视| 日韩精品www| 人妻无码视频一区二区三区| 美国成人毛片| 亚洲在线观看| 日韩视频免费大全中文字幕| 黄色三级视频片| 国产精品一区二区三区视频网站| 国产电影精品久久禁18| 欧美怡春院一区二区三区| 色欲AV无码精品一区二区久久| 天堂а√在线最新版中文在线| 亚洲天堂成人网| 欧美亚洲一级二级| 亚洲精品国产一区二| 日本美女一区二区三区| 色综合久久久888| 国产探花在线视频| 51亚洲精品| 91久久精品日日躁夜夜躁欧美| 欧美与动交zoz0z| 成人福利在线| 久久精品一区二区三区四区| 亚洲自拍欧美色图| 国产乱人乱偷精品视频| 国产精品视频| 韩国欧美亚洲国产| 国产精选第一页| 午夜久久黄色| 久久天天躁狠狠躁夜夜躁2014| 狂野欧美性猛交| 国内精品久久久久久久影视简单| 亚洲精品成人久久| 亚洲天堂资源在线| 欧美黄视频在线观看| 欧美精品久久久久久久久老牛影院| 69久久久久久| 久久天堂久久| 精品久久人人做人人爽| 99国产精品免费视频| 国产一区二区三区黄网站| 欧美一级在线视频| 日韩av片网站| 日韩欧美中文字幕一区二区三区| 精品视频在线免费看| 亚洲爆乳无码专区| 国产亚洲欧美日韩精品一区二区三区| 欧美午夜精品理论片a级按摩| av免费网站观看| 久久久久久久性潮| 日韩一区和二区| 女同性恋一区二区三区| 欧美精品久久久久久| 欧美乱大交xxxxx另类电影| 国产精品999久久久| 热久久一区二区| 国产欧美在线视频| 国产日韩在线观看一区| 成人禁用看黄a在线| 免费日韩在线观看| a欧美人片人妖| 欧美mv日韩mv| 国精品人伦一区二区三区蜜桃| 欧美精品激情| 92国产精品久久久久首页| 天天操天天射天天舔| 国产精品美女一区二区| 大陆极品少妇内射aaaaa|