摘要:本文的目的是聚焦于數(shù)據(jù)操作能力,講述中比較重要的一些,幫助大家實現(xiàn)各自的業(yè)務(wù)邏輯。傳入輸入值,指定輸出的基本數(shù)據(jù)類型。
引言
用TensorFlow做好一個機器學(xué)習(xí)項目,需要具備多種代碼能力:
工程開發(fā)能力:怎么讀取數(shù)據(jù)、怎么設(shè)計與運行Computation Graph、怎么保存與恢復(fù)變量、怎么保存統(tǒng)計結(jié)果、怎么共享變量、怎么分布式部署
數(shù)據(jù)操作能力:怎么將原始數(shù)據(jù)一步步轉(zhuǎn)化為模型需要的數(shù)據(jù),中間可能涉及到Tensor轉(zhuǎn)換、字符串處理、JSON處理等
模型理論知識:線性回歸,邏輯回歸,softmax regression,支持向量機,決策樹,隨機森林,GBDT,CNN,RNN
數(shù)值計算理論知識:交叉熵數(shù)值計算的潛在問題(為什么要用tf.nn.softmax_cross_entropy_with_logits),梯度下降法,海森矩陣與特征向量,牛頓法,Adam梯度法。
本系列文章已對TensorFlow的工程開發(fā)和與模型理論知識的結(jié)合做了較多的總結(jié)。本文的目的是聚焦于數(shù)據(jù)操作能力,講述TensorFlow中比較重要的一些API,幫助大家實現(xiàn)各自的業(yè)務(wù)邏輯。
Tensor Transformation 拼接TensorFlow提供兩種類型的拼接:
tf.concat(values, axis, name="concat"):按照指定的已經(jīng)存在的軸進行拼接
tf.stack(values, axis=0, name="stack"):按照指定的新建的軸進行拼接
t1 = [[1, 2, 3], [4, 5, 6]] t2 = [[7, 8, 9], [10, 11, 12]] tf.concat([t1, t2], 0) ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] tf.concat([t1, t2], 1) ==> [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]] tf.stack([t1, t2], 0) ==> [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]] tf.stack([t1, t2], 1) ==> [[[1, 2, 3], [7, 8, 9]], [[4, 5, 6], [10, 11, 12]]] tf.stack([t1, t2], 2) ==> [[[1, 7], [2, 8], [3, 9]], [[4, 10], [5, 11], [6, 12]]]
上面的結(jié)果讀起來不太直觀,我們從shape角度看一下就很容易明白了:
t1 = [[1, 2, 3], [4, 5, 6]] t2 = [[7, 8, 9], [10, 11, 12]] tf.concat([t1, t2], 0) # [2,3] + [2,3] ==> [4, 3] tf.concat([t1, t2], 1) # [2,3] + [2,3] ==> [2, 6] tf.stack([t1, t2], 0) # [2,3] + [2,3] ==> [2*,2,3] tf.stack([t1, t2], 1) # [2,3] + [2,3] ==> [2,2*,3] tf.stack([t1, t2], 2) # [2,3] + [2,3] ==> [2,3,2*]抽取
tf.slice(input_, begin, size, name=None):按照指定的下標范圍抽取連續(xù)區(qū)域的子集
tf.gather(params, indices, validate_indices=None, name=None):按照指定的下標集合從axis=0中抽取子集,適合抽取不連續(xù)區(qū)域的子集
input = [[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]], [[5, 5, 5], [6, 6, 6]]] tf.slice(input, [1, 0, 0], [1, 1, 3]) ==> [[[3, 3, 3]]] tf.slice(input, [1, 0, 0], [1, 2, 3]) ==> [[[3, 3, 3], [4, 4, 4]]] tf.slice(input, [1, 0, 0], [2, 1, 3]) ==> [[[3, 3, 3]], [[5, 5, 5]]] tf.gather(input, [0, 2]) ==> [[[1, 1, 1], [2, 2, 2]], [[5, 5, 5], [6, 6, 6]]]
假設(shè)我們要從input中抽取[[[3, 3, 3]]],這個輸出在inputaxis=0的下標是1,axis=1的下標是0,axis=2的下標是0-2,所以begin=[1,0,0],size=[1,1,3]。
假設(shè)我們要從input中抽取[[[3, 3, 3], [4, 4, 4]]],這個輸出在inputaxis=0的下標是1,axis=1的下標是0-1,axis=2的下標是0-2,所以begin=[1,0,0],size=[1,2,3]。
假設(shè)我們要從input中抽取[[[3, 3, 3], [5, 5, 5]]],這個輸出在inputaxis=0的下標是1-2,axis=1的下標是0,axis=2的下標是0-2,所以begin=[1,0,0],size=[2,1,3]。
假設(shè)我們要從input中抽取[[[1, 1, 1], [2, 2, 2]],[[5, 5, 5], [6, 6, 6]]],這個輸出在input的axis=0的下標是[0, 2],不連續(xù),可以用tf.gather抽取。
類型轉(zhuǎn)化tf.string_to_number(string_tensor, out_type=None, name=None): 將字符串轉(zhuǎn)化為tf.float32(默認)和tf.int32
tf.to_double(x, name="ToDouble"):轉(zhuǎn)化為tf.float64
tf.to_float(x, name="ToFloat"):轉(zhuǎn)化為tf.float32
tf.to_int32(x, name="ToInt32"):轉(zhuǎn)化為tf.int32
tf.to_int64(x, name="ToInt64"):轉(zhuǎn)化為tf.int64
tf.cast(x, dtype, name=None):轉(zhuǎn)化為dtype指定的類型
形狀轉(zhuǎn)化tf.reshape(tensor, shape, name=None):轉(zhuǎn)化為新shape,若有一個維度設(shè)置為-1,會自動推導(dǎo)
SparseTensorTensorFlow使用三個dense tensor來表達一個sparse tensor:indices、values、dense_shape。
假如我們有一個dense tensor:
[[1, 0, 0, 0] [0, 0, 2, 0] [0, 0, 0, 0]]
那么用SparseTensor表達這個數(shù)據(jù)對應(yīng)的三個dense tensor如下:
indices:[[0, 0], [1, 2]]
values:[1, 2]
dense_shape:[3, 4]
可以通過以下兩種方法,將sparse tensor轉(zhuǎn)化為dense tensor:
tf.sparse_to_dense(sparse_indices, output_shape, sparse_values, default_value=0, validate_indices=True, name=None)
tf.sparse_tensor_to_dense(sp_input, default_value=0, validate_indices=True, name=None)
字符串操作 拆分tf.string_split(source, delimiter=" ")
source是一維數(shù)組,用于將一組字符串按照delimiter拆分為多個元素,返回值為一個SparseTensor。
假如有兩個字符串,source[0]是“hello world”,source[1]是“a b c”,那么輸出結(jié)果如下:
st.indices: [0, 0; 0, 1; 1, 0; 1, 1; 1, 2]
st.values: ["hello", "world", "a", "b", "c"]
st.dense_shape:[2, 3]
拼接tf.string_join(inputs, separator=None, name=None),用起來比較簡單:
tf.string_join(["hello", "world"], separator=" ") ==> "hello world"自定義op
通過tf.py_func(func, inp, Tout, stateful=True, name=None)可以將任意的python函數(shù)func轉(zhuǎn)變?yōu)門ensorFlow op。
func接收的輸入必須是numpy array,可以接受多個輸入?yún)?shù);輸出也是numpy array,也可以有多個輸出。inp傳入輸入值,Tout指定輸出的基本數(shù)據(jù)類型。
先看一個解析json的例子,輸入是一個json array,輸出是一個特征矩陣。
import tensorflow as tf import numpy as np import json json_str_1 = """ {"name": "shuiping.chen", "score": 95, "department": "industrial engineering", "rank": 2 } """ json_str_2 = """ {"name": "zhuibing.dan", "score": 87, "department": "production engineering", "rank": 4 } """ input_array = np.array([json_str_1, json_str_2]) def parse_json(json_str_array): fea_dict_array = [ json.loads(item) for item in json_str_array ] ret_feature = [] for fea_dict in fea_dict_array: feature = [fea_dict["score"], fea_dict["rank"]] ret_feature.append(feature) return np.array(ret_feature, dtype=np.float32) parse_json_op = tf.py_func(parse_json, [input_array], tf.float32) sess = tf.Session() print sess.run(parse_json_op)
再看一個多輸入多輸出的例子,輸入兩個numpy array,輸出三個array,分別是和、差、乘積。
array1 = np.array([[1, 2], [3, 4]], dtype=np.float32) array2 = np.array([[5, 6], [7, 8]], dtype=np.float32) def add_minus_dot(array1, array2): return array1 + array2, array1 - array2, np.dot(array1, array2) add_minus_dot_op = tf.py_func(add_minus_dot, [array1, array2], [tf.float32, tf.float32, tf.float32]) print sess.run(add_minus_dot_op)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/38532.html
摘要:貢獻者飛龍版本最近總是有人問我,把這些資料看完一遍要用多長時間,如果你一本書一本書看的話,的確要用很長時間。為了方便大家,我就把每本書的章節(jié)拆開,再按照知識點合并,手動整理了這個知識樹。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻者:飛龍版...
摘要:首頁地址關(guān)于我們我們不是的官方組織機構(gòu)團體,只是技術(shù)棧以及的愛好者基礎(chǔ)編程思想和大數(shù)據(jù)中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔區(qū)塊鏈中文文檔數(shù)學(xué)筆記線性代數(shù)筆記數(shù)據(jù)科學(xué)中文文檔中文文檔中文文檔課本計算 首頁地址:http://www.apachecn.org關(guān)于我們:http://www.apachecn.org/about 我們不是 Apach...
摘要:首頁地址關(guān)于我們我們不是的官方組織機構(gòu)團體,只是技術(shù)棧以及的愛好者基礎(chǔ)編程思想和大數(shù)據(jù)中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔區(qū)塊鏈中文文檔數(shù)學(xué)筆記線性代數(shù)筆記數(shù)據(jù)科學(xué)中文文檔中文文檔中文文檔課本計算 首頁地址:http://www.apachecn.org關(guān)于我們:http://www.apachecn.org/about 我們不是 Apach...
閱讀 3053·2021-11-11 16:55
閱讀 3169·2021-10-18 13:34
閱讀 591·2021-10-14 09:42
閱讀 1641·2021-09-03 10:30
閱讀 847·2021-08-05 10:02
閱讀 969·2019-08-30 11:27
閱讀 3483·2019-08-29 15:14
閱讀 1253·2019-08-29 13:02