Theano入門

?Theano

Theano是什么

官方定義很簡(jiǎn)單:

Theano is a Python library that lets you to define, optimize, and evaluate mathematical expressions, especially ones with multi-dimensional arrays (numpy.ndarray).

其他翻譯成漢語(yǔ)應(yīng)該是:

Theano是一個(gè)Python庫(kù),專門用于定義、優(yōu)化、求值數(shù)學(xué)表達(dá)式,效率高,適用于多維數(shù)組。類型深度學(xué)習(xí)庫(kù)

Theano是一個(gè)Python庫(kù),允許您有效地定義,優(yōu)化和評(píng)估涉及多維數(shù)組的數(shù)學(xué)表達(dá)式。Theano特色:

與NumPy緊密集成 - 在Theano編譯的函數(shù)中使用numpy.ndarray。

透明使用GPU - 比CPU更快地執(zhí)行數(shù)據(jù)密集型計(jì)算。

有效的象征性差異 - Theano通過(guò)一個(gè)或多個(gè)輸入為您的函數(shù)做出衍生工具。

速度和穩(wěn)定性優(yōu)化 - log(1+x)即使x非常小,也能獲得正確的答案。

動(dòng)態(tài)C代碼生成 - 更快地評(píng)估表達(dá)式。

廣泛的單元測(cè)試和自我驗(yàn)證 - 檢測(cè)和診斷多種類型的錯(cuò)誤。

Theano官方文檔

其他深度學(xué)習(xí)庫(kù)

像?歌有?家的TensorFlow、Facebook有Torch、百度有Paddle Paddle、微軟有CNTK、?亞?遜的AWS則有MXNet,現(xiàn)在還有?持HADOOP的NL4J深度學(xué)習(xí)框架。

為什么我們用theano?

tensowflow 目前只能在 MacOS 和 Linux, theano 不僅可以在前兩個(gè)系統(tǒng)中運(yùn)行, 還可以在 Windows 系統(tǒng)下運(yùn)行;

theano 可以使用 GPU 進(jìn)行運(yùn)算,用GPU運(yùn)行比CPU快100倍左右,theano 是比較優(yōu)秀的 python 模塊。

對(duì)于初學(xué)者來(lái)說(shuō),如果可以在 theano 和 tensorflow 中選擇, 個(gè)人推薦使用 tensowflow. tensowflow 是比較商業(yè)化的模塊,用起來(lái)沒(méi)有theano 學(xué)術(shù)化。如果是使用機(jī)器學(xué)習(xí)進(jìn)行學(xué)術(shù)性研究,網(wǎng)上已經(jīng)有很多使用 theano 的學(xué)術(shù)性資料。所以 theano 在這種情況下是值得推薦的。

python

簡(jiǎn)單易?, 對(duì)數(shù)學(xué)矩陣向量等處理能?強(qiáng),且?guī)於?,適?性?

NumPy

NumPy是Python中科學(xué)計(jì)算的基礎(chǔ)軟件包。它是一個(gè)提供多了維數(shù)組對(duì)象,多種派生對(duì)象(如:掩碼數(shù)組、矩陣)以及用于快速操作數(shù)組的函數(shù)及API,它包括數(shù)學(xué)、邏輯、數(shù)組形狀變換、排序、選擇、I/O 、離散傅立葉變換、基本線性代數(shù)、基本統(tǒng)計(jì)運(yùn)算、隨機(jī)模擬等等。NumPy包的核心是ndarray對(duì)象。它封裝了python原生的同數(shù)據(jù)類型的n維數(shù)組,為了保證其性能優(yōu)良,其中有許多操作都是代碼在本地進(jìn)行編譯后執(zhí)行的。NumPy數(shù)組 和 標(biāo)準(zhǔn)Python Array(數(shù)組) 之間有區(qū)別。

NumPy 應(yīng)用

NumPy 通常與 SciPy(Scientific Python)和 Matplotlib(繪圖庫(kù))一起使用, 這種組合廣泛用于替代 MatLab,是一個(gè)強(qiáng)大的科學(xué)計(jì)算環(huán)境,有助于我們通過(guò) Python 學(xué)習(xí)數(shù)據(jù)科學(xué)或者機(jī)器學(xué)習(xí)。

SciPy 是一個(gè)開源的 Python 算法庫(kù)和數(shù)學(xué)工具包。

SciPy 包含的模塊有最優(yōu)化、線性代數(shù)、積分、插值、特殊函數(shù)、快速傅里葉變換、信號(hào)處理和圖像處理、常微分方程求解和其他科學(xué)與工程中常用的計(jì)算。

Matplotlib 是 Python 編程語(yǔ)言及其數(shù)值數(shù)學(xué)擴(kuò)展包 NumPy 的可視化操作界面。它為利用通用的圖形用戶界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向應(yīng)用程序嵌入式繪圖提供了應(yīng)用程序接口(API)。

NumPy官方文檔

GPU和CPU

CPU即中央處理器GPU即圖形處理器

兩者的相同之處:兩者都有總線和外界聯(lián)系,有??的緩存體系,以及數(shù)字和邏輯運(yùn)算單元。?句話,兩者都為了完成計(jì)算任務(wù)?設(shè)計(jì)。兩者的區(qū)別:存在于?內(nèi)的緩存體系和數(shù)字邏輯運(yùn)算單元的結(jié)構(gòu)差異:CPU雖然有多核,但總數(shù)沒(méi)有超過(guò)兩位數(shù),每個(gè)核都有?夠?的緩存和?夠多的數(shù)字和邏輯運(yùn)算單元,并輔助有很多加速分?判斷甚?更復(fù)雜的邏輯判斷的硬件;GPU的核數(shù)遠(yuǎn)超CPU,被稱為眾核(NVIDIA Fermi有512個(gè)核)。 簡(jiǎn)??之,當(dāng)程序員為CPU編寫程序時(shí),他們傾向于利?復(fù)雜的邏輯結(jié)構(gòu)優(yōu)化算法從?減少計(jì)算任務(wù)的運(yùn)?時(shí)間,即Latency。當(dāng)程序員為GPU編寫程序時(shí),則利?其處理海量數(shù)據(jù)的優(yōu)勢(shì),通過(guò)提?總的數(shù)據(jù)吞吐量(Throughput)來(lái)掩蓋Lantency。?前,CPU和GPU的區(qū)別正在逐漸縮?,因?yàn)镚PU也在處理不規(guī)則任務(wù)和線程間通信??有了??的進(jìn)步。另外,功耗問(wèn)題對(duì)于GPU?CPU更嚴(yán)重

GPU已經(jīng)不再局限于3D圖形處理了,GPU通?計(jì)算技術(shù)發(fā)展已經(jīng)引起業(yè)界不少的關(guān)注,事實(shí)也證明在浮點(diǎn)運(yùn)算、并?計(jì)算等部分計(jì)算??,GPU 可以提供數(shù)?倍乃?于上百倍于CPU的性能,如此強(qiáng)悍的“新星”難免會(huì)讓CPU?商??英特爾為未來(lái)?緊張,NVIDIA和英特爾也經(jīng)常為CPU和GPU 誰(shuí)更重要?展開??戰(zhàn)。

安裝要求

python 2 >=2.6 or python 3>=3.3

Numpy >= 1.7.1?

Scipy >= 0.11

通用安裝法

直接復(fù)制粘貼下面的命令, 然后在 terminal 當(dāng)中運(yùn)行. 如果要使用 GPU 加速運(yùn)算, 要確保在你的電腦上有 NVIDIA 的 GPU 顯卡, 而且能夠使用 CUDA 模塊.

# python 2+ 版本

pip install theano

?

# python 3+ 版本

pip3 install theano

如果遇到權(quán)限問(wèn)題, 請(qǐng)?jiān)?pip 前加一個(gè) sudo 如: sudo pip install theano.

更詳細(xì)的Theano安裝步驟:

Theano基本用法

在 theano 中學(xué)會(huì)定義矩陣 matrix 和功能 function 是一個(gè)比較重要的事, 我們?cè)谶@里簡(jiǎn)單的提及了一下在 theano 將要運(yùn)用到的東西.

在Theano中所有變量都被處理為張量(Tensor),比如:標(biāo)量 scalar、向量 vector、矩陣 matrix。

tensor就是數(shù)學(xué)上的張量,根據(jù)維度(dimension)數(shù)目不同,tensor variable分為scalar、vector、matrix、tensor3、tensor4等具體類型,他們的dimension數(shù)目分別為0、1、2、3、4。

如下定義一個(gè)scalar,也就是標(biāo)量:

importtheano.tensorasTT

x=TT.scalar('x',dtype='float32')

y=TT.fscalar('y')# f表示float

我們定義了兩個(gè)標(biāo)量tensor variable,x和y的數(shù)據(jù)類型均為float;單引號(hào)中的x和y表示名字,僅供調(diào)試方便,可以省略。vector,matrix,tensor3等地定義以此類推。

theano 和 tensorflow 類似,都是基于建立神經(jīng)網(wǎng)絡(luò)每個(gè)組件,在組件聯(lián)系起來(lái),數(shù)據(jù)放入組件,得到結(jié)果。

首先, 我們這次需要加載 theano 和 numpy 兩個(gè)模塊, 并且使用 theano 來(lái)創(chuàng)建 function.

import numpy as np

import theano.tensor as T

from theano import function

定義X和Y兩個(gè)常量 (scalar),把結(jié)構(gòu)建立好之后,把結(jié)構(gòu)放在function,在把數(shù)據(jù)放在function。

# basic

x = T.dscalar('x')? # 建立 x 的容器

y = T.dscalar('y')? # 建立 y 的容器

z = x+y ? ? #? 建立方程

?

# 使用 function 定義 theano 的方程,

# 將輸入值 x, y 放在 [] 里,? 輸出值 z 放在后面

f = function([x, y], z) ?

?

print(f(2,3))? # 將確切的 x, y 值放入方程中

# 5.0

使用 theano 中 的 pp (pretty-print) 能夠打印出原始方程:

from theano import pp

print(pp(z))

# (x + y)

定義矩陣,以及利用矩陣做相關(guān)運(yùn)算:

x = T.dmatrix('x')? # 矩陣 x 的容器

y = T.dmatrix('y')? # 矩陣 y 的容器

z = x + y ? # 定義矩陣加法

f = function([x, y], z) # 定義方程

?

print(f(

? ? ?? np.arange(12).reshape((3,4)),

? ? ?? 10*np.ones((3,4))

? ? ?? )

? ?? )

"""

[[ 10.? 11.? 12.? 13.]

[ 14.? 15.? 16.? 17.]

[ 18.? 19.? 20.? 21.]]

"""

Function 用法

注:theano 當(dāng)中的 function 就和 python 中的 function 類似, 不過(guò)因?yàn)橐挥迷诙噙M(jìn)程并行運(yùn)算中,所以他的 function 有他自己的一套使用方式.

這是涉及的是Theano 的function 用法。在theano中由于涉及到GPU加速以及CPU 的并行的運(yùn)算,所以他的function會(huì)有不同。

這次介紹了function的三種用法,并且各舉一個(gè)例.

首先 , 導(dǎo)入所需要的python包:

import numpy as np

import theano.tensor as T

import theano

激勵(lì)函數(shù)例子

使用activation function(激勵(lì)函數(shù))的例子。 activation function 的例子是使用 function 最簡(jiǎn)單的形式。 首先需要定義一個(gè) tensor T:

x = T.dmatrix('x')

然后聲明了概率計(jì)算方式,這里需要注意這里的計(jì)算方式要用到Theano里面的計(jì)算方式。而不能使用numpy包里面的exp()。

s = 1/(1+T.exp(-x)) # logistic or soft step

最后。調(diào)用 theano 定義的計(jì)算函數(shù) logistic

logistic = theano.function([x], s)

print(logistic([[0,1],[-2,-3]]))

"""

[[ 0.5? ? ? ? 0.73105858]

[ 0.26894142? 0.11920292]]

"""

多輸入/輸出的 function

假定我們的 theano 函數(shù)中的輸入值是兩個(gè),輸出也是兩個(gè)。 指定輸入的值是矩陣a,b

a,b = T.dmatrices('a','b')

計(jì)算輸入a,b 之間的差(diff), 差的絕對(duì)值(abs_diff),差的平方(diff_squared)

diff=a-b

abs_diff=abs(diff)

diff_squared = diff**2

在這次使用theano.function的時(shí)候可以指定兩個(gè)輸,并且輸出這兩個(gè)數(shù)值的差(diff),差的絕對(duì)值(abs_diff), 差的平方(diff_squared)。當(dāng)我們?cè)谡{(diào)用這個(gè)函數(shù)的時(shí)候會(huì)將這三個(gè)結(jié)果作為輸出值。

f = theano.function([a,b], [diff,abs_diff,diff_squared])

最后調(diào)用函數(shù)f, 并且向函數(shù)傳遞初始化之后的參數(shù)。

x1,x2,x3= f(

? ? np.ones((2,2)), # a

? ? np.arange(4).reshape((2,2))? # b

)

print(x1, x2, x3)

"""

array([[ 1.,? 0.],

? ? ? [-1., -2.]]),

array([[ 1.,? 0.],

? ? ? [ 1.,? 2.]]),

array([[ 1.,? 0.],

? ? ? [ 1.,? 4.]])?

"""

function 的名字

首先,我們可以使用 T.dscalars() 里面同時(shí)定義三個(gè)純量的容器。 以及輸出值z(mì)

x,y,w = T.dscalars('x','y','w')

z = (x+y)*w

接下來(lái)應(yīng)該是定義 theano 的函數(shù)了, 在定義函數(shù)的并且指定輸入值的時(shí)候,我們期望能夠有默認(rèn)值, 于是我們使用 theano 的默認(rèn)值書寫方式來(lái)指定

# name for a function

f = theano.function([x,

? ? ? ? ? ? ? ? ? ? theano.In(y, value=1),

? ? ? ? ? ? ? ? ? ? theano.In(w,value=2)],

? ? ? ? ? ? ? ? ? ? z)

print(f(23))? ? # 使用默認(rèn)

print(f(23,1,4)) # 不使用默認(rèn)

"""

48.0

100.0

"""

同時(shí),我們還可以在定義默認(rèn)值的時(shí)候,可以指定參數(shù)名字。 這樣做的目的是防止我們定義的參數(shù)過(guò)于多的情況下,忘記函數(shù)的順序。

f = theano.function([x,

? ? ? ? ? ? ? ? ? ? theano.In(y, value=1),

? ? ? ? ? ? ? ? ? ? theano.In(w,value=2,name='weights')],

? ? ? ? ? ? ? ? ? ? z)


print (f(23,1,weights=4)) ##調(diào)用方式

"""

100.0

"""

總結(jié)

這節(jié)中,我們介紹了function的三種方式: 首先,一個(gè)theano的function的簡(jiǎn)單用法; 其次在使用theano的function中可以有多個(gè)input和output; 最后是theano的function中可以有默認(rèn)值并且可以給參數(shù)指定名稱。在 fucntion 的參數(shù)會(huì)在CPU/GPU中共享

Shared 變量

shared variable這也是一個(gè)tensor variable,名字雖然叫shared,但這不是它的本質(zhì),它本質(zhì)上是一塊穩(wěn)定存在的存儲(chǔ)空間,類似于全局變量,但與全局變量不同的是,它可以存儲(chǔ)在顯存中,很多場(chǎng)景下GPU加速杠杠的。一個(gè)重要的語(yǔ)法特性是,Theano函數(shù)可以在每次執(zhí)行時(shí)順便修改shared variable的值。比如用shared variable實(shí)現(xiàn)累加操作

定義 Shared 變量 我們會(huì)用累加器來(lái)定義 Shared 變量,每一次向上面加一個(gè)值,每一次基于上面的變化,再加上另一個(gè)值,就這樣不斷地更新并保存這樣的值。

state = shared(0)

inc = T.iscalar('inc')

accumulator = function([inc], state, updates=[(state, state+inc)])

>>> print(state.get_value()) # 打印state的初始值

0

>>> accumulator(1) # 進(jìn)行一次函數(shù)調(diào)用

array(0)

>>> print(state.get_value()) # 函數(shù)返回后,state的值發(fā)生了變化

1

state是一個(gè)shared variable,初始化為0,每次調(diào)用accumulator(),state都會(huì)加上inc。shared variable可以像普通tensor variable一樣用于符號(hào)表達(dá)式,另外,他還有自己的值,可以直接用.get_value()和.set_value()方法來(lái)訪問(wèn)和修改。

上述代碼還引入了一個(gè)東西:updates。這是用theano函數(shù)操作shared variable的方法,參數(shù)是一個(gè)list,list的每個(gè)元素都是二元tuple,tuple首元素是要修改的shared,第二個(gè)元素是更新后的值。updatas中的share variable會(huì)在函數(shù)返回后更新自己的值。

updates表面上是一種語(yǔ)法糖,但它真正的作用在于執(zhí)行效率,updates多數(shù)時(shí)候可以用in-place的算法快速實(shí)現(xiàn),在GPU上,theano可以更好地控制何時(shí)何地給shared variable分配空間,帶來(lái)性能提升。最常見的,神經(jīng)網(wǎng)絡(luò)里權(quán)值的更新一般會(huì)用update實(shí)現(xiàn)。

求導(dǎo)

theano.tensor.grad(output, input)可以求表達(dá)式導(dǎo)數(shù),第一個(gè)參數(shù)是要求導(dǎo)的表達(dá)式,第二個(gè)參數(shù)是自變量,或者自變量組成的list。

import theano

import theano.tensor as TT

x = TT.dscalar('x')

y = x ** 2 # 定義函數(shù)y=x^2

gy = T.grad(y, x) # 導(dǎo)函數(shù)的表達(dá)式

f = theano.function([x], gy) # 將導(dǎo)函數(shù)編譯成Theano函數(shù)

這樣就得到了函數(shù)f(x)=x^2的導(dǎo)數(shù),然后測(cè)試一下:

>>> theano.pp(gy) # 打印優(yōu)化之前的導(dǎo)函數(shù)表達(dá)式

((fill((x ** TensorConstant{2}), TensorConstant{1.0}) * TensorConstant{2}) * (x ** (TensorConstant{2} - TensorConstant{1})))

>>> f(4) # 帶入數(shù)據(jù)計(jì)算x=4時(shí)的導(dǎo)數(shù)值

array(8.0)

>>> pp(f.maker.fgraph.outputs[0]) # 打印編譯優(yōu)化后的導(dǎo)函數(shù)表達(dá)式

(2.0 * x)

求解結(jié)果f'(4)=8,與預(yù)期相符。pp(gy)輸出grad的結(jié)果,是未經(jīng)優(yōu)化的,有多個(gè)節(jié)點(diǎn),編譯后的函數(shù)f則是優(yōu)化過(guò)的,只有一個(gè)節(jié)點(diǎn),這也反映出,函數(shù)編譯中的優(yōu)化是很重要的。

Regression 回歸例子

導(dǎo)入模板

引入需要使用的Python包:

import theano

import theano.tensor as T

import numpy as np

import matplotlib.pyplot as plt #引入了matplotlib這個(gè)工具包, 用來(lái)實(shí)現(xiàn)繪圖及數(shù)據(jù)可視化。

定義層結(jié)構(gòu)

接下來(lái)我們聲明我們的Layer類。 對(duì)于神經(jīng)網(wǎng)絡(luò)的每個(gè)Layer, 它需要具備輸入來(lái)源input,輸入神經(jīng)元維度in_size,輸出神經(jīng)元緯度out_size, 和我們之前設(shè)計(jì)的神經(jīng)元的激活函數(shù)activation_function, 默認(rèn)為None。

class Layer(object):

? ? def __init__(self, inputs, in_size, out_size, activation_function=None):

? ? ? ? self.W = theano.shared(np.random.normal(0, 1, (in_size, out_size)))

? ? ? ? self.b = theano.shared(np.zeros((out_size, )) + 0.1)

? ? ? ? self.Wx_plus_b = T.dot(inputs, self.W) + self.b

? ? ? ? self.activation_function = activation_function

? ? ? ? if activation_function is None:

? ? ? ? ? ? self.outputs = self.Wx_plus_b

? ? ? ? else:

? ? ? ? ? ? self.outputs = self.activation_function(self.Wx_plus_b)

偽造數(shù)據(jù)

接下來(lái),我們首先人工生成一個(gè)簡(jiǎn)單的帶有白噪聲的一維數(shù)據(jù) y = x^2 - 0.5 + noise。

# Make up some fake data

x_data = np.linspace(-1, 1, 300)[:, np.newaxis]

noise = np.random.normal(0, 0.05, x_data.shape)

y_data = np.square(x_data) - 0.5 + noise? ? ? ? # y = x^2 - 0.5 + wihtenoise

然后,我們用散點(diǎn)圖(Scatter)把它顯示出來(lái), 橫軸是x_data, 縱軸是y_data。

# show the fake data

plt.scatter(x_data, y_data)

plt.show()

顯示結(jié)果:

搭建網(wǎng)絡(luò)

然后,我們定義神經(jīng)網(wǎng)絡(luò)的輸入與目標(biāo);

# determine the inputs dtype

x = T.dmatrix("x")

y = T.dmatrix("y")

這里,T.dmatrix 意味著我使用的是float64的數(shù)據(jù)類型, 和我的輸入數(shù)據(jù)一致。

接著我們?cè)O(shè)計(jì)我們的神經(jīng)網(wǎng)絡(luò),它包括兩層,構(gòu)成1-10-1的結(jié)構(gòu)。 對(duì)于l1我們的input_size要和我們的x_data一致,然后我們假設(shè)了該層有10個(gè)神經(jīng)元,并且以relu作為激活函數(shù)。 所以,l2以l1.output為輸入,同時(shí)呢,它的輸出為1維,和我們的y_data保持一致,作為神經(jīng)網(wǎng)絡(luò)的輸出層,我們采用默認(rèn)的線性激活函數(shù)。

# determine the inputs dtype

# add layers

l1 = Layer(x, 1, 10, T.nnet.relu)

l2 = Layer(l1.outputs, 10, 1, None)

然后,我們定義一個(gè)cost,也就是損失函數(shù)(cost/loss function),我們采用的是l2.outputs 神經(jīng)網(wǎng)絡(luò)輸出與目標(biāo)值y的的平均平方差。

# compute the cost

cost = T.mean(T.square(l2.outputs - y))

根據(jù) cost 我們可以計(jì)算我們神經(jīng)網(wǎng)絡(luò)權(quán)值和偏置值的梯度(gradient), 這里Theano已經(jīng)集成好了對(duì)應(yīng)的函數(shù):

# compute the gradients

gW1, gb1, gW2, gb2 = T.grad(cost, [l1.W, l1.b, l2.W, l2.b])

有了以上的基本運(yùn)算步驟后,我們就可以開始,利用梯度下降法訓(xùn)練我們的神經(jīng)網(wǎng)絡(luò)。 首先我們定義一個(gè)學(xué)習(xí)率 learning_rate, 這個(gè)學(xué)習(xí)率的取值一般是根據(jù)數(shù)據(jù)及實(shí)驗(yàn)的經(jīng)驗(yàn)估計(jì)的,它會(huì)對(duì)模型的收斂性造成一定的影響,一般傾向于采用較小的數(shù)值。

然后,我們定義train這個(gè)函數(shù)來(lái)描述我們的訓(xùn)練過(guò)程,首先我們定義了函數(shù)的輸入inputs=[x, y], 函數(shù)的輸出為outputs=cost, 同時(shí)更新網(wǎng)絡(luò)的參數(shù)。

# apply gradient descent

learning_rate = 0.05

train = theano.function(

? ? inputs=[x, y],

? ? outputs=cost,

? ? updates=[(l1.W, l1.W - learning_rate * gW1),

? ? ? ? ? ? (l1.b, l1.b - learning_rate * gb1),

? ? ? ? ? ? (l2.W, l2.W - learning_rate * gW2),

? ? ? ? ? ? (l2.b, l2.b - learning_rate * gb2)])

然后我們定義一個(gè)預(yù)測(cè)函數(shù)來(lái)輸出我們最終的結(jié)果predict.

# prediction

predict = theano.function(inputs=[x], outputs=l2.outputs)

訓(xùn)練

最后,我們就要開始真正的訓(xùn)練啦!我們要把神經(jīng)網(wǎng)絡(luò)訓(xùn)練1000次,同時(shí)每訓(xùn)練50次時(shí)就輸出此時(shí)的誤差(cost):

for i in range(1000):

? ? # training

? ? err = train(x_data, y_data)

? ? if i % 50 == 0:

? ? ? ? print(err)

你大概會(huì)得到一下類似的結(jié)果:

"""

2.2858426513500967

0.011148671551881364

0.008641346716060181

0.007188403510180637

0.006250296000631469

0.005628021126864056

0.005142288453451058

0.004793442944984919

0.004539827398288326

0.004376693858775578

0.0042555015795511615

0.004156078781653181

0.0040801312408181726

0.004022424092526545

0.003974514689028584

0.003934815285052449

0.0039030377541023824

0.003875222239897254

"""

結(jié)果顯示我們的訓(xùn)練誤差是在不斷的減小的,也就是說(shuō)我們的神經(jīng)網(wǎng)絡(luò)在一點(diǎn)一點(diǎn)的逼近目標(biāo)值。?

相關(guān)鏈接

Theano入門

30個(gè)深度學(xué)習(xí)庫(kù):按Python和C++等10種語(yǔ)言分類

莫煩Python-Theano教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容