開(kāi)始使用
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、虛擬主機(jī)、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、長(zhǎng)沙網(wǎng)站維護(hù)、網(wǎng)站推廣。
TensorFlow并不是一個(gè)純粹的神經(jīng)網(wǎng)絡(luò)框架, 而是使用數(shù)據(jù)流圖進(jìn)行數(shù)值分析的框架.
TensorFlow使用有向圖(graph)表示一個(gè)計(jì)算任務(wù).圖的節(jié)點(diǎn)稱為ops(operations)表示對(duì)數(shù)據(jù)的處理,圖的邊f(xié)low 描述數(shù)據(jù)的流向.
該框架計(jì)算過(guò)程就是處理tensor組成的流. 這也是TensorFlow名稱的來(lái)源.
TensorFlow使用tensor表示數(shù)據(jù). tensor意為張量即高維數(shù)組,在python中使用numpy.ndarray表示.
TensorFlow使用Session執(zhí)行圖, 使用Variable維護(hù)狀態(tài).tf.constant是只能輸出的ops, 常用作數(shù)據(jù)源.
下面我們構(gòu)建一個(gè)只有兩個(gè)constant做輸入, 然后進(jìn)行矩陣乘的簡(jiǎn)單圖:
from tensorflow import Session, device, constant, matmul'''構(gòu)建一個(gè)只有兩個(gè)constant做輸入, 然后進(jìn)行矩陣乘的簡(jiǎn)單圖:'''#如果不使用with session()語(yǔ)句, 需要手動(dòng)執(zhí)行session.close().
#with device設(shè)備指定了執(zhí)行計(jì)算的設(shè)備:
# ? ?"/cpu:0": 機(jī)器的 CPU.
# ? ?"/gpu:0": 機(jī)器的第一個(gè) GPU, 如果有的話.
# ? ?"/gpu:1": 機(jī)器的第二個(gè) GPU, 以此類推.
with Session() as session: ?# 創(chuàng)建執(zhí)行圖的上下文
with device('/cpu:0'): ?# 指定運(yùn)算設(shè)備
mat1 = constant([[3, 3]]) ?# 創(chuàng)建源節(jié)點(diǎn)
mat2 = constant([[2], [2]])
product = matmul(mat1, mat2) # 指定節(jié)點(diǎn)的前置節(jié)點(diǎn), 創(chuàng)建圖
result = session.run(product) # 執(zhí)行計(jì)算 ? ? ? ?print(result)123456789101112131415161718
下面使用Variable做一個(gè)計(jì)數(shù)器:
from tensorflow import Session, constant, Variable, add, assign, initialize_all_variables
state = Variable(0, name='counter') # 創(chuàng)建計(jì)數(shù)器one = constant(1) # 創(chuàng)建數(shù)據(jù)源: 1val = add(state, one) # 創(chuàng)建新值節(jié)點(diǎn)update = assign(state, val) # 更新計(jì)數(shù)器setup = initialize_all_variables() # 初始化Variablewith Session() as session:
session.run(setup) # 執(zhí)行初始化
print(session.run(state)) # 輸出初值
for i in range(3):
session.run(update) # 執(zhí)行更新
print(session.run(state)) # 輸出計(jì)數(shù)器值12345678910111213
在使用變量前必須運(yùn)行initialize_all_variables()返回的圖, 運(yùn)行Variable節(jié)點(diǎn)將返回變量的值.
本示例中將構(gòu)建圖的過(guò)程寫(xiě)在了上下文之外, 而且沒(méi)有指定運(yùn)行設(shè)備.
上面示例中session.run只接受一個(gè)op作為參數(shù), 實(shí)際上run可以接受op列表作為輸入:
session.run([op1, op2])1
上述示例一直使用constant作為數(shù)據(jù)源, feed可以在運(yùn)行時(shí)動(dòng)態(tài)地輸入數(shù)據(jù):
from tensorflow import Session, placeholder, mul, float32
input1 = placeholder(float32)
input2 = placeholder(float32)
output = mul(input1, input2)with Session() as session: ? ?print session.run(output, feed_dict={input1: [3], input2: [2]})1234567
實(shí)現(xiàn)一個(gè)簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)
神經(jīng)網(wǎng)絡(luò)是應(yīng)用廣泛的機(jī)器學(xué)習(xí)模型, 關(guān)于神經(jīng)網(wǎng)絡(luò)的原理可以參見(jiàn)這篇隨筆, 或者在tensorflow playground上體驗(yàn)一下在線demo.
首先定義一個(gè)BPNeuralNetwork類:
class BPNeuralNetwork:
def __init__(self):
self.session = tf.Session()
self.input_layer = None
self.label_layer = None
self.loss = None
self.trainer = None
self.layers = [] ? ?def __del__(self):
self.session.close()1234567891011
編寫(xiě)一個(gè)生成單層神經(jīng)網(wǎng)絡(luò)函數(shù),每層神經(jīng)元用一個(gè)數(shù)據(jù)流圖表示.使用一個(gè)Variable矩陣表示與前置神經(jīng)元的連接權(quán)重, 另一個(gè)Variable向量表示偏置值, 并為該層設(shè)置一個(gè)激勵(lì)函數(shù).
def make_layer(inputs, in_size, out_size, activate=None):
weights = tf.Variable(tf.random_normal([in_size, out_size]))
basis = tf.Variable(tf.zeros([1, out_size]) + 0.1)
result = tf.matmul(inputs, weights) + basis ? ?if activate is None: ? ? ? ?return result ? ?else: ? ? ? ?return activate(result)12345678
使用placeholder作為輸入層.
self.input_layer = tf.placeholder(tf.float32, [None, 2])1
placeholder的第二個(gè)參數(shù)為張量的形狀, [None, 1]表示行數(shù)不限, 列數(shù)為1的二維數(shù)組, 含義與numpy.array.shape相同.這里, self.input_layer被定義為接受二維輸入的輸入層.
同樣使用placeholder表示訓(xùn)練數(shù)據(jù)的標(biāo)簽:
self.label_layer = tf.placeholder(tf.float32, [None, 1])1
使用make_layer為神經(jīng)網(wǎng)絡(luò)定義兩個(gè)隱含層, 并用最后一層作為輸出層:
self.loss = tf.reduce_mean(tf.reduce_sum(tf.square((self.label_layer - self.layers[1])), reduction_indices=[1]))1
tf.train提供了一些優(yōu)化器, 可以用來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò).以損失函數(shù)最小化為目標(biāo):
self.trainer = tf.train.GradientDescentOptimizer(learn_rate).minimize(self.loss)1
使用Session運(yùn)行神經(jīng)網(wǎng)絡(luò)模型:
initer = tf.initialize_all_variables()# do trainingself.session.run(initer)
for i in range(limit):
self.session.run(self.trainer, feed_dict={self.input_layer: cases, self.label_layer: labels})12345
使用訓(xùn)練好的模型進(jìn)行預(yù)測(cè):
self.session.run(self.layers[-1], feed_dict={self.input_layer: case})1
完整代碼:
import tensorflow as tfimport numpy as npdef make_layer(inputs, in_size, out_size, activate=None):
weights = tf.Variable(tf.random_normal([in_size, out_size]))
basis = tf.Variable(tf.zeros([1, out_size]) + 0.1)
result = tf.matmul(inputs, weights) + basis ? ?if activate is None: ? ? ? ?return result ? ?else: ? ? ? ?return activate(result)class BPNeuralNetwork:
def __init__(self):
self.session = tf.Session()
self.input_layer = None
self.label_layer = None
self.loss = None
self.optimizer = None
self.layers = [] ? ?def __del__(self):
self.session.close() ? ?def train(self, cases, labels, limit=100, learn_rate=0.05):
# 構(gòu)建網(wǎng)絡(luò)
self.input_layer = tf.placeholder(tf.float32, [None, 2])
self.label_layer = tf.placeholder(tf.float32, [None, 1])
self.layers.append(make_layer(self.input_layer, 2, 10, activate=tf.nn.relu))
self.layers.append(make_layer(self.layers[0], 10, 2, activate=None))
self.loss = tf.reduce_mean(tf.reduce_sum(tf.square((self.label_layer - self.layers[1])), reduction_indices=[1]))
self.optimizer = tf.train.GradientDescentOptimizer(learn_rate).minimize(self.loss)
initer = tf.initialize_all_variables() ? ? ? ?# 做訓(xùn)練
self.session.run(initer) ? ? ? ?for i in range(limit):
self.session.run(self.optimizer, feed_dict={self.input_layer: cases, self.label_layer: labels}) ? ?def predict(self, case):
return self.session.run(self.layers[-1], feed_dict={self.input_layer: case}) ? ?def test(self):
x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y_data = np.array([[0, 1, 1, 0]]).transpose()
test_data = np.array([[0, 1]])
self.train(x_data, y_data)
print(self.predict(test_data))
nn = BPNeuralNetwork()
nn.test()12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
上述模型雖然簡(jiǎn)單但是使用不靈活, 作者采用同樣的思想實(shí)現(xiàn)了一個(gè)可以自定義輸入輸出維數(shù)以及多層隱含神經(jīng)元的網(wǎng)絡(luò), 可以參見(jiàn)dynamic_bpnn.py
import tensorflow as tfimport numpy as npdef make_layer(inputs, in_size, out_size, activate=None):
weights = tf.Variable(tf.random_normal([in_size, out_size]))
basis = tf.Variable(tf.zeros([1, out_size]) + 0.1)
result = tf.matmul(inputs, weights) + basis ? ?if activate is None: ? ? ? ?return result ? ?else: ? ? ? ?return activate(result)class BPNeuralNetwork:
def __init__(self):
self.session = tf.Session()
self.loss = None
self.optimizer = None
self.input_n = 0
self.hidden_n = 0
self.hidden_size = []
self.output_n = 0
self.input_layer = None
self.hidden_layers = []
self.output_layer = None
self.label_layer = None
def __del__(self):
self.session.close() ? ?def setup(self, ni, nh, no):
# 設(shè)置參數(shù)個(gè)數(shù)
self.input_n = ni
self.hidden_n = len(nh) ?#隱藏層的數(shù)量
self.hidden_size = nh ?#每個(gè)隱藏層中的單元格數(shù)
self.output_n = no ? ? ? ?#構(gòu)建輸入層
self.input_layer = tf.placeholder(tf.float32, [None, self.input_n]) ? ? ? ?#構(gòu)建標(biāo)簽層
self.label_layer = tf.placeholder(tf.float32, [None, self.output_n]) ? ? ? ?#構(gòu)建隱藏層
in_size = self.input_n
out_size = self.hidden_size[0]
inputs = self.input_layer
self.hidden_layers.append(make_layer(inputs, in_size, out_size, activate=tf.nn.relu)) ? ? ? ?for i in range(self.hidden_n-1):
in_size = out_size
out_size = self.hidden_size[i+1]
inputs = self.hidden_layers[-1]
self.hidden_layers.append(make_layer(inputs, in_size, out_size, activate=tf.nn.relu)) ? ? ? ?#構(gòu)建輸出層
self.output_layer = make_layer(self.hidden_layers[-1], self.hidden_size[-1], self.output_n) ? ?def train(self, cases, labels, limit=100, learn_rate=0.05):
self.loss = tf.reduce_mean(tf.reduce_sum(tf.square((self.label_layer - self.output_layer)), reduction_indices=[1]))
self.optimizer = tf.train.GradientDescentOptimizer(learn_rate).minimize(self.loss)
initer = tf.initialize_all_variables() ? ? ? ?#做訓(xùn)練
self.session.run(initer) ? ? ? ?for i in range(limit):
self.session.run(self.optimizer, feed_dict={self.input_layer: cases, self.label_layer: labels}) ? ?def predict(self, case):
return self.session.run(self.output_layer, feed_dict={self.input_layer: case}) ? ?def test(self):
x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y_data = np.array([[0, 1, 1, 0]]).transpose()
test_data = np.array([[0, 1]])
self.setup(2, [10, 5], 1)
self.train(x_data, y_data)
print(self.predict(test_data))
nn = BPNeuralNetwork()
nn.test()12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
sigmoid。python中不是激活函數(shù)的是sigmoid。函數(shù)在數(shù)學(xué)上的定義:給定一個(gè)非空的數(shù)集A,對(duì)A施加對(duì)應(yīng)法則f,記作f(A),得到另一數(shù)集B。
使用關(guān)鍵詞 def 聲明這是一個(gè)函數(shù)
1def 函數(shù)名 (參數(shù)):
2 語(yǔ)句塊
參數(shù)可以沒(méi)有,也可以有多個(gè),用逗號(hào)隔開(kāi),第一行稱為函數(shù)頭,結(jié)尾一定要加冒號(hào),代表開(kāi)始進(jìn)入函數(shù)體的執(zhí)行。
語(yǔ)句塊也就是函數(shù)體,是關(guān)于這個(gè)函數(shù)要實(shí)現(xiàn)的功能的語(yǔ)句,語(yǔ)句要有返回值即return語(yǔ)句,如果沒(méi)有return語(yǔ)句,就代表return none.
#函數(shù)傳遞參數(shù)
def func_args( ?*vartuple ):
args = []
#任何傳入的參數(shù)都加入列表
for var in vartuple:
args.append(var)
return args
a = func_args("123","abc","ABC","000")
print(a)
import mathdef sigmoid(x,derivate=False): if derivate: return sigmoid(x)*(1-sigmoid(x)) return 1.0 / (1+math.exp(-x)) def relu(x): if x 0: return x else: return 0sigmoid 求導(dǎo)和其函數(shù)值相關(guān)
當(dāng)前文章:python寫(xiě)激勵(lì)函數(shù) python勵(lì)志代碼
轉(zhuǎn)載源于:http://m.rwnh.cn/article42/hichhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、ChatGPT、App設(shè)計(jì)、網(wǎng)站策劃、網(wǎng)站維護(hù)、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容