0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Tensorflow 2.0將正式入場(chǎng),給暗流涌動(dòng)的框架之爭(zhēng)再燃一把火

DPVg_AI_era ? 來(lái)源:未知 ? 作者:李倩 ? 2018-11-27 09:10 ? 次閱讀

幾天前,Tensorflow剛度過(guò)自己的3歲生日,作為當(dāng)前最受歡迎的機(jī)器學(xué)習(xí)框架,Tensorflow在這個(gè)寶座上已經(jīng)盤(pán)踞了近三年。無(wú)論是成熟的Keras,還是風(fēng)頭正盛的pytorch,它的地位似乎總是無(wú)法被撼動(dòng)。而就在即將到來(lái)的2019年,Tensorflow 2.0將正式入場(chǎng),給暗流涌動(dòng)的框架之爭(zhēng)再燃一把火。

如果說(shuō)兩代Tensorflow有什么根本不同,那應(yīng)該就是Tensorflow 2.0更注重使用的低門(mén)檻,旨在讓每個(gè)人都能應(yīng)用機(jī)器學(xué)習(xí)技術(shù)。考慮到它可能會(huì)成為機(jī)器學(xué)習(xí)框架的又一個(gè)重要里程碑,本文會(huì)介紹1.x和2.x版本之間的所有(已知)差異,重點(diǎn)關(guān)注它們之間的思維模式變化和利弊關(guān)系。

通過(guò)閱讀這篇文章,熟悉Tensorflow的老用戶可以盡早轉(zhuǎn)變思維,適應(yīng)新版本的變化。而新手也可以直接以Tensorflow 2.0的方式思考,至少目前沒(méi)有必要急著去學(xué)習(xí)別的框架。

Tensorflow 2.0:為什么?何時(shí)?

Tensorflow 2.0的開(kāi)發(fā)初衷是制作一個(gè)更簡(jiǎn)單易用的Tensorflow。

第一個(gè)向公眾透露項(xiàng)目具體開(kāi)發(fā)內(nèi)容的人是Google Brain的工程師Martin Wicke,我們可以在他的公告郵件列表里找到Tensorflow 2.0的蛛絲馬跡。在這里,我們對(duì)它做一些簡(jiǎn)單提要:

Tensorflow 2.0的核心功能是動(dòng)態(tài)圖機(jī)制Eager execution。它允許用戶像正常程序一樣去編寫(xiě)、調(diào)試模型,使TensorFlow更易于學(xué)習(xí)和應(yīng)用。

支持更多平臺(tái)、更多語(yǔ)言,通過(guò)標(biāo)準(zhǔn)化API的交換格式和提供準(zhǔn)線改善這些組件之間的兼容性。

刪除已棄用的API并減少重復(fù)的API數(shù),避免給用戶造成混淆。

2.0版的設(shè)計(jì)對(duì)公眾開(kāi)放:社區(qū)可以和Tensorflow開(kāi)發(fā)人員一起工作,共同探討新功能。

兼容性和連續(xù)性:Tensorflow 2.0會(huì)提供Tensorflow 1.x的兼容性模塊,也就是它會(huì)內(nèi)置所有Tensorflow 1.x API的模塊。

硬盤(pán)兼容性:只需修改一些變量名稱,Tensorflow 1.x中導(dǎo)出的模型(checkpoints和模型freeze)就能和Tensorflow 2.0兼容。

tf.contrib退出歷史舞臺(tái)。其中有維護(hù)價(jià)值的模塊會(huì)被移動(dòng)到別的地方,剩余的都將被刪除。

換言之,如果你在這之前從沒(méi)接觸過(guò)Tensorflow,你是幸運(yùn)的。但是,如果你和我們一樣是從0.x版本用起的,那么你就可能得重寫(xiě)所有代碼庫(kù)——雖然官方說(shuō)會(huì)發(fā)布轉(zhuǎn)換工具方便老用戶,但這種工具肯定有很多bug,需要一定的手動(dòng)干預(yù)。

而且,你也必須開(kāi)始轉(zhuǎn)變思維模式。這做起來(lái)不容易,但真的猛士不就應(yīng)該喜歡挑戰(zhàn)嗎?

所以為了應(yīng)對(duì)挑戰(zhàn),我們先來(lái)適應(yīng)第一個(gè)巨大差異:移除tf.get_variable,tf.variable_scope,tf.layers,強(qiáng)制轉(zhuǎn)型到基于Keras的方法,也就是用tf.keras。

關(guān)于Tensorflow 2.0的發(fā)布日期,官方并沒(méi)有給出明確時(shí)間。但根據(jù)開(kāi)發(fā)小組成員透露的消息,我們可以確定它的預(yù)覽版會(huì)在今年年底發(fā)布,官方正式版可能會(huì)在2019年春季發(fā)布。

所以留給老用戶的時(shí)間已經(jīng)不多了。

Keras(OOP)vs Tensorflow 1.x

在GitHub上,RFC:TensorFlow 2.0中的變量這份意見(jiàn)稿已經(jīng)被官方接受,它可能是對(duì)現(xiàn)有代碼庫(kù)影響最大的RFC,值得參考。

我們都知道,在Tensorflow里,每個(gè)變量在計(jì)算圖中都有一個(gè)唯一的名稱,我們也已經(jīng)習(xí)慣按照這種模式設(shè)計(jì)計(jì)算圖:

哪些操作連接我的變量節(jié)點(diǎn):把計(jì)算圖定義為連接的多個(gè)子圖,并用tf.variable_scope在內(nèi)部定義每個(gè)子圖,以便定義不同計(jì)算圖的變量,并在Tensorboard中獲得清晰的圖形表示。

需要在執(zhí)行同一步驟時(shí)多次使用子圖:一定要用tf.variable_scope里的reuse參數(shù),不然Tensorflow會(huì)生成一個(gè)前綴為_(kāi)n的新計(jì)算圖。

定義計(jì)算圖:定義參數(shù)初始化節(jié)點(diǎn)(你調(diào)用過(guò)幾次tf.global_variables_initializer()?)。

把計(jì)算圖加載到Session,運(yùn)行。

下面,我們就以在Tensorflow中實(shí)現(xiàn)簡(jiǎn)單的GAN為例,更生動(dòng)地展現(xiàn)上述步驟。

Tensorflow 1.x的GAN

要定義GAN的判別器D,我們一定會(huì)用到tf.variable_scope里的reuse參數(shù)。因?yàn)槭紫任覀儠?huì)把真實(shí)圖像輸入判別器,之后把生成的假樣本再輸進(jìn)去,在且僅在最后計(jì)算D的梯度。相反地,生成器G里的參數(shù)不會(huì)在一次迭代中被用到兩次,所以沒(méi)有擔(dān)心的必要。

def generator(inputs):

"""generator network.

Args:

inputs: a (None, latent_space_size) tf.float32 tensor

Returns:

G: the generator output node

"""

with tf.variable_scope("generator"):

fc1 = tf.layers.dense(inputs, units=64, activation=tf.nn.elu, name="fc1")

fc2 = tf.layers.dense(fc1, units=64, activation=tf.nn.elu, name="fc2")

G = tf.layers.dense(fc1, units=1, name="G")

return G

def discriminator(inputs, reuse=False):

"""discriminator network

Args:

inputs: a (None, 1) tf.float32 tensor

reuse: python boolean, if we expect to reuse (True) or declare (False) the variables

Returns:

D: the discriminator output node

"""

with tf.variable_scope("discriminator", reuse=reuse):

fc1 = tf.layers.dense(inputs, units=32, activation=tf.nn.elu, name="fc1")

D = tf.layers.dense(fc1, units=1, name="D")

return D

當(dāng)這兩個(gè)函數(shù)被調(diào)用時(shí),Tensorflow會(huì)默認(rèn)在計(jì)算圖內(nèi)部定義兩個(gè)不同的子圖,每個(gè)子圖都有自己的scope(生成器/判別器)。請(qǐng)注意,這個(gè)函數(shù)返回的是定義好的子圖的張量,而不是子圖本身。

為了共享D這個(gè)子圖,我們需要定義兩個(gè)輸入(真實(shí)圖像/生成樣本),并定義訓(xùn)練G和D所需的損失函數(shù)。

# Define the real input, a batch of values sampled from the real data

real_input = tf.placeholder(tf.float32, shape=(None,1))

# Define the discriminator network and its parameters

D_real = discriminator(real_input)

# Arbitrary size of the noise prior vector

latent_space_size = 100

# Define the input noise shape and define the generator

input_noise = tf.placeholder(tf.float32, shape=(None,latent_space_size))

G = generator(input_noise)

# now that we have defined the generator output G, we can give it in input to

# D, this call of `discriminator` will not define a new graph, but it will

# **reuse** the variables previously defined

D_fake = discriminator(G, True)

最后要做的是分別定義訓(xùn)練D和G所需的2個(gè)損失函數(shù)和2個(gè)優(yōu)化器。

D_loss_real = tf.reduce_mean(

tf.nn.sigmoid_cross_entropy_with_logits(logits=D_real, labels=tf.ones_like(D_real))

)

D_loss_fake = tf.reduce_mean(

tf.nn.sigmoid_cross_entropy_with_logits(logits=D_fake, labels=tf.zeros_like(D_fake))

)

# D_loss, when invoked it first does a forward pass using the D_loss_real

# then another forward pass using D_loss_fake, sharing the same D parameters.

D_loss = D_loss_real + D_loss_fake

G_loss = tf.reduce_mean(

tf.nn.sigmoid_cross_entropy_with_logits(logits=D_fake, labels=tf.ones_like(D_fake))

)

定義損失函數(shù)不難,對(duì)抗訓(xùn)練的一個(gè)特點(diǎn)是把真實(shí)圖像和由G生成的圖像輸入判別器D,由后者輸出評(píng)估結(jié)果,并把結(jié)果饋送給生成器G做參考。這意味著對(duì)抗訓(xùn)練其實(shí)是分兩步走,G和D同在一個(gè)計(jì)算圖內(nèi),但在訓(xùn)練D時(shí),我們不希望更新G中的參數(shù);同理,訓(xùn)練G時(shí),我們也不希望更新D里的參數(shù)。

因此,由于我們?cè)谀J(rèn)計(jì)算圖中定義了每個(gè)變量,而且它們都是全局變量,我們必須在2個(gè)不同的列表中收集正確的變量并正確定義優(yōu)化器,從而計(jì)算梯度,對(duì)正確的子圖進(jìn)行更新。

# Gather D and G variables

D_vars = tf.trainable_variables(scope="discriminator")

G_vars = tf.trainable_variables(scope="generator")

# Define the optimizers and the train operations

train_D = tf.train.AdamOptimizer(1e-5).minimize(D_loss, var_list=D_vars)

train_G = tf.train.AdamOptimizer(1e-5).minimize(G_loss, var_list=G_vars)

到這里,我們已經(jīng)完成了上面提到的“第3步:定義計(jì)算圖”,最后是定義參數(shù)初始化節(jié)點(diǎn):

init_op = tf.global_variables_initializer()

優(yōu)/缺點(diǎn)

只要正確定義了計(jì)算圖,且在訓(xùn)練循環(huán)內(nèi)和session內(nèi)使用,上述GAN就能正常訓(xùn)練了。但是,從軟件工程角度看,它有一些值得注意的點(diǎn):

用tf.variable_scope修改由tf.layers定義的(完整)變量名稱:這其實(shí)是對(duì)不同scope的變量重新用了一次tf.layers.*,導(dǎo)致的結(jié)果是定義了新scope下的一組新變量。

布爾標(biāo)志reuse可以完全改變調(diào)用tf.layers.*后的所有行為(定義/reuse)。

每個(gè)變量都是全局變量:tf.layers調(diào)用tf.get_variable(也就是在tf.layers下面調(diào)用)定義的變量可以隨處訪問(wèn)。

定義子圖很麻煩:你沒(méi)法通過(guò)調(diào)用discriminator獲得一個(gè)新的、完全獨(dú)立的判別器,這有點(diǎn)違背常理。

子圖定義的輸出值(調(diào)用generator/discriminator)只是它的輸出張量,而不是內(nèi)部所有圖的信息(盡管可以回溯輸出,但這么做很麻煩)。

定義參數(shù)初始化節(jié)點(diǎn)很麻煩(不過(guò)這個(gè)可以用tf.train.MonitoredSession和tf.train.MonitoredTrainingSession規(guī)避)。

以上6點(diǎn)都可能是用Tensorflow構(gòu)建GAN的缺點(diǎn)。

Tensorflow 2.x的GAN

前面提到了,Tensorflow 2.x移除了tf.get_variable,tf.variable_scope,tf.layers,強(qiáng)制轉(zhuǎn)型到了基于Keras的方法。明年,如果我們想用它構(gòu)建GAN,我們就必須用tf.keras定義生成器G和判別器的:這其實(shí)意味著我們憑空多了一個(gè)可以用來(lái)定義D的共享變量函數(shù)。

注:明年tf.layers就沒(méi)有了,所以你最好從現(xiàn)在就開(kāi)始適應(yīng)用tf.keras來(lái)定義自己的模型,這是過(guò)渡到2.x版本的必要準(zhǔn)備。

def generator(input_shape):

"""generator network.

Args:

input_shape: the desired input shape (e.g.: (latent_space_size))

Returns:

G: The generator model

"""

inputs = tf.keras.layers.Input(input_shape)

net = tf.keras.layers.Dense(units=64, activation=tf.nn.elu, name="fc1")(inputs)

net = tf.keras.layers.Dense(units=64, activation=tf.nn.elu, name="fc2")(net)

net = tf.keras.layers.Dense(units=1, name="G")(net)

G = tf.keras.Model(inputs=inputs, outputs=net)

return G

def discriminator(input_shape):

"""discriminator network.

Args:

input_shape: the desired input shape (e.g.: (latent_space_size))

Returns:

D: the discriminator model

"""

inputs = tf.keras.layers.Input(input_shape)

net = tf.keras.layers.Dense(units=32, activation=tf.nn.elu, name="fc1")(inputs)

net = tf.keras.layers.Dense(units=1, name="D")(net)

D = tf.keras.Model(inputs=inputs, outputs=net)

return D

看到和Tensorflow的不同了嗎?在這里,generator和discriminator都返回了一個(gè)tf.keras.Model,而不僅僅是輸出張量。

在Keras里,變量共享可以通過(guò)多次調(diào)用同樣的Keras層或模型來(lái)實(shí)現(xiàn),而不用像TensorFlow那樣需要考慮變量的scope。所以我們?cè)谶@里只需定義一個(gè)判別器D,然后調(diào)用它兩次。

# Define the real input, a batch of values sampled from the real data

real_input = tf.placeholder(tf.float32, shape=(None,1))

# Define the discriminator model

D = discriminator(real_input.shape[1:])

# Arbitrary set the shape of the noise prior vector

latent_space_size = 100

# Define the input noise shape and define the generator

input_noise = tf.placeholder(tf.float32, shape=(None,latent_space_size))

G = generator(input_noise.shape[1:])

再重申一遍,這里我們不需要像原來(lái)那樣定義D_fake,在定義計(jì)算圖時(shí)也不用提前擔(dān)心變量共享。

之后就是定義G和D的損失函數(shù):

D_real = D(real_input)

D_loss_real = tf.reduce_mean(

tf.nn.sigmoid_cross_entropy_with_logits(logits=D_real, labels=tf.ones_like(D_real))

)

G_z = G(input_noise)

D_fake = D(G_z)

D_loss_fake = tf.reduce_mean(

tf.nn.sigmoid_cross_entropy_with_logits(logits=D_fake, labels=tf.zeros_like(D_fake))

)

D_loss = D_loss_real + D_loss_fake

G_loss = tf.reduce_mean(

tf.nn.sigmoid_cross_entropy_with_logits(logits=D_fake, labels=tf.ones_like(D_fake))

)

最后,我們要做的是定義分別優(yōu)化D和G的2個(gè)優(yōu)化器。由于用的是tf.keras,所以我們不用手動(dòng)創(chuàng)建要更新的變量列表,tf.keras.Models的對(duì)象本身就是我們要的東西。

# Define the optimizers and the train operations

train_D = tf.train.AdamOptimizer(1e-5).minimize(D_loss, var_list=D.trainable_variables)

train_G = tf.train.AdamOptimizer(1e-5).minimize(G_loss, var_list=G.trainable_variables)

截至目前,因?yàn)槲覀冇玫倪€是靜態(tài)圖,所以還要定義變量初始化節(jié)點(diǎn):

init_op = tf.global_variables_initializer()

優(yōu)/缺點(diǎn)

從tf.layers到過(guò)渡tf.keras:Keras里有所有tf.layers的對(duì)應(yīng)操作。

tf.keras.Model幫我們完全省去了變量共享和計(jì)算圖重新定義的煩惱。

tf.keras.Model不是一個(gè)張量,而是一個(gè)自帶變量的完整模型。

定義變量初始化節(jié)點(diǎn)還是很麻煩,但之前也提到了,我們可以用tf.train.MonitoredSession規(guī)避。

以上是Tensorflow 1.x和2.x版本的第一個(gè)巨大差異,在下文中,我們?cè)賮?lái)看看第二個(gè)差異——Eager模式。

Eager Execution

Eager Execution(動(dòng)態(tài)圖機(jī)制)是TensorFlow的一個(gè)命令式編程環(huán)境,它無(wú)需構(gòu)建計(jì)算圖,可以直接評(píng)估你的操作:直接返回具體值,而不是構(gòu)建完計(jì)算圖后再返回。它的優(yōu)點(diǎn)主要有以下幾點(diǎn):

直觀的界面。更自然地構(gòu)建代碼和使用Python數(shù)據(jù)結(jié)構(gòu),可完成小型模型和小型數(shù)據(jù)集的快速迭代。

更容易調(diào)試。直接調(diào)用ops來(lái)檢查運(yùn)行模型和測(cè)試更改,用標(biāo)準(zhǔn)Python調(diào)試工具獲取即時(shí)錯(cuò)誤報(bào)告。

更自然的流程控制。直接用Python流程控制而不是用計(jì)算圖。

簡(jiǎn)而言之,有了Eager Execution,我們不再需要事先定義計(jì)算圖,然后再在session里評(píng)估它。它允許用python語(yǔ)句控制模型的結(jié)構(gòu)。

這里我們舉個(gè)典型例子:Eager Execution獨(dú)有的tf.GradientTape。在計(jì)算圖模式下,如果我們要計(jì)算某個(gè)函數(shù)的梯度,首先我們得定義一個(gè)計(jì)算圖,從中知道各個(gè)節(jié)點(diǎn)是怎么連接的,然后從輸出回溯到計(jì)算圖的輸入,層層計(jì)算并得到最終結(jié)果。

但在Eager Execution下,用自動(dòng)微分計(jì)算函數(shù)梯度的唯一方法是構(gòu)建圖。我們得先用tf.GradientTape根據(jù)可觀察元素(如變量)構(gòu)建操作圖,然后再計(jì)算梯度。下面是tf.GradientTape文檔中的一個(gè)原因和示例:

x = tf.constant(3.0)

with tf.GradientTape() as g:

g.watch(x)

y = x * x

dy_dx = g.gradient(y, x) # Will compute to 6.0

此外,用python語(yǔ)句(如if語(yǔ)句和循環(huán)語(yǔ)句)進(jìn)行流程控制區(qū)別于靜態(tài)圖的tf.get_variable,tf.variable_scope,tf.layers。

之前官方發(fā)布了一個(gè)名為Autograph的工具,它的作用是把普通Python代碼轉(zhuǎn)換成復(fù)雜的計(jì)算圖代碼,也就是允許用戶用Python直接編寫(xiě)計(jì)算圖。但它指的Python事實(shí)上并不是真正意義上的Python(比如必須定義一個(gè)函數(shù),讓它返回一個(gè)具有指定Tensorflow數(shù)據(jù)類(lèi)型的元素列表),也沒(méi)法發(fā)揮編程語(yǔ)言的強(qiáng)大功能。

就個(gè)人而言,我不太喜歡Eager Execution,因?yàn)槲乙呀?jīng)習(xí)慣靜態(tài)圖了,而這個(gè)新改變有點(diǎn)像是對(duì)PyTorch的拙劣模仿。至于其他變化,我會(huì)在下面以問(wèn)答方式做簡(jiǎn)單介紹。

一問(wèn)一答

下面是我認(rèn)為從TensorFlow過(guò)渡到TensorFlow 2.0會(huì)出現(xiàn)的一些常見(jiàn)問(wèn)題。

問(wèn):如果我的項(xiàng)目要用到tf.contrib怎么辦?

你可以用pip安裝一個(gè)新的Python包,或者把tf.contrib.something重命名為tf.something。

問(wèn):如果在Tensorflow 1.x里能正常工作的東西到2.x沒(méi)法運(yùn)行了怎么辦?

不應(yīng)該存在這種錯(cuò)誤,建議你仔細(xì)檢查一下代碼轉(zhuǎn)換得對(duì)不對(duì),閱讀GitHub上的錯(cuò)誤報(bào)告。

問(wèn):我的項(xiàng)目在靜態(tài)圖上好好的,一放到Eager Execution上就不行了怎么辦?

我也遇到了這個(gè)問(wèn)題,而且目前還不知道具體原因。所以建議先不要用Eager Execution。

問(wèn):我發(fā)現(xiàn)Tensorflow 2.x里好像沒(méi)有某個(gè)tf.函數(shù)怎么辦?

這個(gè)函數(shù)很有可能只被移到別的地方去了。在Tensorflow 1.x中,很多函數(shù)會(huì)有重復(fù)、有別名,Tensorflow 2.x對(duì)這些函數(shù)做了統(tǒng)一刪減整理,也移動(dòng)了部分函數(shù)的位置。你可以在RFC:TensorFlow命名空間里找到將要新增、刪除、移動(dòng)的所有函數(shù)。官方即將發(fā)布的工具也能幫你適應(yīng)這個(gè)更新。

小結(jié)

看了這么多,相信讀者現(xiàn)在已經(jīng)對(duì)Tensorflow 2.x有了大致了解,也有了心理準(zhǔn)備??偟膩?lái)說(shuō),正如大部分產(chǎn)品都要經(jīng)歷更新迭代,我認(rèn)為T(mén)ensorflow 2.x相比Tensorflow 1.x會(huì)是有明顯改進(jìn)的一個(gè)版本。最后,我們?cè)賮?lái)看一下Tensorflow的發(fā)展時(shí)間軸,回憶過(guò)去三年來(lái)它帶給我們的記憶和知識(shí)。

pIYBAFv8mfSAKhrTAACBip0DDGI553.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8435

    瀏覽量

    132884
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    329

    瀏覽量

    60580

原文標(biāo)題:Tensorflow 2.0的這些新設(shè)計(jì),你適應(yīng)好了嗎?

文章出處:【微信號(hào):AI_era,微信公眾號(hào):新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    綠源電動(dòng)車(chē)少年足球燒了一把

    青少年足球得從基礎(chǔ)做起,著眼長(zhǎng)遠(yuǎn),面向未來(lái),以企業(yè)自有的責(zé)任感,綠源電動(dòng)車(chē)幫助青少年足球在原始的精神動(dòng)力上助一把。夢(mèng)想永遠(yuǎn)是不會(huì)放棄的原動(dòng)力。
    發(fā)表于 06-03 23:26

    【FireBLE試用體驗(yàn)】之一把鑰匙開(kāi)一把

    ` 俗話說(shuō)條條大路通羅馬,俗話也說(shuō)一把鑰匙一把鎖。到底哪句話說(shuō)的對(duì)呢,都沒(méi)錯(cuò)。 上邊是凱旋門(mén)廣場(chǎng)的俯視圖,看起來(lái)真的是很直觀的條條大路通羅馬了,通向FireBLE這座羅馬城的道路也不只條,應(yīng)該走哪條路呢,那就是另
    發(fā)表于 08-28 18:42

    【FireBLE試用體驗(yàn)】之一把鑰匙一把

    俗話說(shuō)條條大路通羅馬,俗話也說(shuō)一把鑰匙一把鎖。到底哪句話說(shuō)的對(duì)呢,都沒(méi)錯(cuò)。 上邊是凱旋門(mén)廣場(chǎng)的俯視圖,看起來(lái)真的是很直觀的條條大路通羅馬了,通向FireBLE這座羅馬城的道路也不只條,應(yīng)該走哪條路
    發(fā)表于 08-29 21:09

    深度學(xué)習(xí)框架TensorFlow&TensorFlow-GPU詳解

    TensorFlow&TensorFlow-GPU:深度學(xué)習(xí)框架TensorFlow&TensorFlow-GPU的簡(jiǎn)介、安裝、使用方法詳細(xì)
    發(fā)表于 12-25 17:21

    TensorFlow的特點(diǎn)和基本的操作方式

    2015年11月在GitHub上開(kāi)源,在2016年4月補(bǔ)充了分布式版本,最新版本為1.10,2018年下半年發(fā)布Tensorflow 2.0預(yù)覽版。Tensorflow目前仍處于快速
    發(fā)表于 11-23 09:56

    如何筆記本上一把U鎖

    如何筆記本上一把U鎖   數(shù)據(jù)往往超過(guò)筆記本的價(jià)值   2010年的今天,筆記本電腦在我們工作中的重要性與日聚
    發(fā)表于 01-23 11:14 ?1029次閱讀

    云計(jì)算市場(chǎng)競(jìng)爭(zhēng)暗流涌動(dòng) 小鳥(niǎo)云不懼行業(yè)變革

    云計(jì)算市場(chǎng)競(jìng)爭(zhēng)暗流涌動(dòng) 小鳥(niǎo)云不懼行業(yè)變革 數(shù)年來(lái),云計(jì)算市場(chǎng)的競(jìng)爭(zhēng)從來(lái)就是暗流涌動(dòng),如今因價(jià)格戰(zhàn)變得更加激烈火爆。但也有業(yè)界人士分析,云計(jì)算市場(chǎng)的價(jià)格戰(zhàn)形勢(shì)會(huì)因巨頭們的
    發(fā)表于 11-28 11:37 ?722次閱讀

    L’Oreal發(fā)布全球第一把智能發(fā)梳,一把要189美元,你會(huì)買(mǎi)嗎?

    頭發(fā)梳理整齊的梳子,般幾塊錢(qián)就有個(gè),不過(guò)法國(guó)化妝品 L’Oreal 旗下的頭發(fā)護(hù)理品牌 Kerastase 最近就在 CES 發(fā)布了一把價(jià)值 189 美元的發(fā)梳,究竟
    發(fā)表于 01-07 16:37 ?2016次閱讀

    華為的次大膽嘗試燒起了一把,所有手機(jī)都借鑒這個(gè)功能

    華為的次大膽嘗試燒起了一把,所有手機(jī)都借鑒這個(gè)功能!華為向在技術(shù)創(chuàng)新和大膽嘗試上出名,這次也是依靠其果敢的嘗試,掀起了場(chǎng)手機(jī)革命。
    發(fā)表于 02-08 10:14 ?970次閱讀

    TensorFlow框架結(jié)構(gòu)解析

    TensorFlow是谷歌的第二代開(kāi)源的人工智能學(xué)習(xí)系統(tǒng),是用來(lái)實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的內(nèi)置框架學(xué)習(xí)軟件庫(kù)。目前,TensorFlow機(jī)器學(xué)習(xí)已經(jīng)成為了個(gè)研究熱點(diǎn)。由基本的機(jī)器學(xué)習(xí)算法入手,簡(jiǎn)
    發(fā)表于 04-04 14:39 ?7126次閱讀
    <b class='flag-5'>TensorFlow</b>的<b class='flag-5'>框架</b>結(jié)構(gòu)解析

    TensorFlow2.0 版本將來(lái)臨

    TensorFlow 2.0部分,我們停止分發(fā) tf.contrib。我們將在未來(lái)幾個(gè)月與 contrib 模塊的所有者合作制定詳細(xì)的遷移計(jì)劃,包括如何在我們的社區(qū)頁(yè)面和文檔
    的頭像 發(fā)表于 08-15 09:01 ?5530次閱讀

    機(jī)器學(xué)習(xí)框架Tensorflow 2.0的這些新設(shè)計(jì)你了解多少

    總是無(wú)法被撼動(dòng)。而就在即將到來(lái)的2019年,Tensorflow 2.0正式入場(chǎng),暗流
    的頭像 發(fā)表于 11-17 11:33 ?3177次閱讀

    中國(guó)動(dòng)力電池市場(chǎng)暗流不斷涌動(dòng) 日韓電池廠紛至沓來(lái)

    距離2020年不到20天了,留給他們的時(shí)間不多了。表面波瀾不驚的中國(guó)動(dòng)力電池市場(chǎng),底下的暗流不斷涌動(dòng)。
    發(fā)表于 12-17 10:44 ?401次閱讀

    出海之路暗流涌動(dòng),如何開(kāi)足馬力成功“上岸”?

    原文標(biāo)題:出海之路暗流涌動(dòng),如何開(kāi)足馬力成功“上岸”? 文章出處:【微信公眾號(hào):谷歌開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
    的頭像 發(fā)表于 12-26 19:55 ?679次閱讀

    深度學(xué)習(xí)框架tensorflow介紹

    深度學(xué)習(xí)框架tensorflow介紹 深度學(xué)習(xí)框架TensorFlow簡(jiǎn)介 深度學(xué)習(xí)框架TensorFl
    的頭像 發(fā)表于 08-17 16:11 ?2576次閱讀