日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

神经网络基础原理(三)-----分类问题实弹演练及一些小干货

發(fā)布時(shí)間:2024/3/13 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 神经网络基础原理(三)-----分类问题实弹演练及一些小干货 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

現(xiàn)在基本的概念已經(jīng)介紹得差不多了,是時(shí)候?qū)崙?zhàn)演示一下如何利用神經(jīng)網(wǎng)絡(luò)來(lái)處理分類問(wèn)題的。按照一直的做法,自己出題自己解決。這次拿一個(gè)現(xiàn)實(shí)生活中的一個(gè)小問(wèn)題來(lái)練練手:根據(jù)人的身高,體重,把人劃分成輕,正常,偏胖,肥胖這四種情況。按照現(xiàn)在流行的觀點(diǎn)認(rèn)為,人正常的BMI指數(shù)范圍在20-25之間,低于20就是過(guò)輕,高于25低于28是偏胖,高于28就是肥胖了。

按照前面介紹的方法,解決問(wèn)題的第一步是建模和打標(biāo)簽。根據(jù)問(wèn)題的描述,可以把訓(xùn)練樣本定義成一個(gè)2維向量,其中第1維表示身高(以米為計(jì)算單位),第2維是體重(以千克為單位)。訓(xùn)練樣本有了之后就是打標(biāo)。有點(diǎn)編程經(jīng)驗(yàn)的人一眼就可以看出來(lái)這里可以用機(jī)器打標(biāo)。標(biāo)簽數(shù)據(jù)是一個(gè)4維布爾值向量,第1維表示過(guò)輕,第2維表示正常,第3維表示偏胖,第4維表示肥胖。

第二步是建立模型,對(duì)于分類問(wèn)題而言,最好的是先根據(jù)問(wèn)題的規(guī)模來(lái)確定結(jié)點(diǎn)的數(shù)量,從上面的問(wèn)題描述中大概可以猜出至少需要3個(gè)結(jié)點(diǎn),才能劃分出四個(gè)分類。因此不妨就將隱層結(jié)點(diǎn)數(shù)定義成3或4。這里建議大家訓(xùn)練模型的時(shí)候,根據(jù)先簡(jiǎn)單后復(fù)雜的原則來(lái)調(diào)整網(wǎng)絡(luò)。因?yàn)橐婚_(kāi)始就訓(xùn)練很復(fù)雜的網(wǎng)絡(luò),不僅不一定得到很好的結(jié)果,而且訓(xùn)練的時(shí)間太長(zhǎng),也不利于檢驗(yàn)?zāi)P偷馁|(zhì)量。

第三步就是訓(xùn)練模型,不停改進(jìn)模型,直至得到較滿意的精度。

下面給出訓(xùn)練代碼:

import tensorflow as tf

import numpy as np

?

#設(shè)置訓(xùn)練集大小

train_set_size=1000

#隨機(jī)生成身高數(shù)據(jù),以男性1.7m為平均身高,上下浮動(dòng)0.2m

height=tf.Variable(tf.random.truncated_normal([train_set_size,1],mean=1.7,dtype=tf.double,stddev=0.1))

#隨機(jī)生成體重?cái)?shù)據(jù),以體重60kg為平均值,上下浮動(dòng)20kg

weight=tf.Variable(tf.random.truncated_normal([train_set_size,1],mean=60,dtype=tf.double,stddev=20))

#歸并數(shù)據(jù)

x=tf.concat([height,weight],1)

?

# 計(jì)算BMI指數(shù)

def getBMI(x):

return x[1] / (x[0] ** 2)

?

# 根據(jù)BMI指數(shù)自動(dòng)生成標(biāo)簽

def getLable(x):

label = np.zeros(shape=[train_set_size,4],dtype=float)

for i in range(len(x)):

bmi = getBMI(x[i])

if bmi < 20:

label[i][0] = 1

elif bmi >=?20 and bmi < 25:

label[i][1] = 1

elif bmi >=?25 and bmi < 28:

label[i][2] = 1

else:

label[i][3] = 1

?

return label

?

# 將標(biāo)簽數(shù)據(jù)轉(zhuǎn)換成tensorflow框架能處理的張量

y_=tf.convert_to_tensor(getLable(x))

?

# ?設(shè)計(jì)兩層神經(jīng)網(wǎng)絡(luò),第一層隱含層共4個(gè)結(jié)點(diǎn),激活函數(shù)為RELU;第二層為輸出層也包含4個(gè)結(jié)點(diǎn),對(duì)應(yīng)4個(gè)分類,激活函數(shù)為softmax

model = tf.keras.models.Sequential([

??tf.keras.layers.Dense(4, activation='relu',input_shape=[2]),

??tf.keras.layers.Dense(4,activation='softmax')

])

?

# ?定義優(yōu)化器,用于優(yōu)化學(xué)習(xí)率等超參數(shù)指標(biāo)

optimizer = tf.keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=1e-06)

?

# ?編譯模型,loss='categorical_crossentropy'指定損失函數(shù)為交叉熵,Metrics標(biāo)注網(wǎng)絡(luò)評(píng)價(jià)指標(biāo)accuracy為準(zhǔn)確率

model.compile(loss='categorical_crossentropy',

????????????????optimizer=optimizer,

????????????????metrics=['accuracy'])

?

# ?打印網(wǎng)絡(luò)參數(shù)模型,僅用于自檢

model.summary()

?

# ?重復(fù)訓(xùn)練3000次

for i in range(3000):

# ?輸入樣本x和標(biāo)簽y, batch_size=1,每輸入1條數(shù)據(jù),就運(yùn)行反向傳播算法,更新網(wǎng)絡(luò)參數(shù)。

model.fit(x=x,y=y_,batch_size=1)

?

# ?準(zhǔn)備測(cè)試集

test_size=3

h_t=tf.Variable(tf.random.truncated_normal([test_size,1],mean=1.7,dtype=tf.double,stddev=0.1))

w_t=tf.Variable(tf.random.truncated_normal([test_size,1],mean=60,dtype=tf.double,stddev=20))

x_t=tf.concat([h_t,w_t],1)

?

# ?打印測(cè)試集內(nèi)容和模型預(yù)測(cè)的結(jié)果

print(x_t)

print(model.predict(x_t))

?

下面是訓(xùn)練結(jié)果:

1000/1000 [==============================] - 0s 455us/step - loss: 0.1065 - accuracy: 0.9580

1000/1000 [==============================] - 0s 449us/step - loss: 0.0986 - accuracy: 0.9550

1000/1000 [==============================] - 0s 447us/step - loss: 0.1108 - accuracy: 0.9560

1000/1000 [==============================] - 0s 449us/step - loss: 0.1104 - accuracy: 0.9570

1000/1000 [==============================] - 0s 452us/step - loss: 0.0977 - accuracy: 0.9570

tf.Tensor(

[[ 1.87404843 51.79656559]

?[ 1.69247713 54.36136267]

?[ 1.80369327 53.8165295 ]], shape=(3, 2), dtype=float64)

[[1.0000000e+00 7.5280788e-35 0.0000000e+00 0.0000000e+00]

?[9.9999952e-01 5.1134185e-07 7.3078410e-31 0.0000000e+00]

?[1.0000000e+00 3.5876334e-22 0.0000000e+00 0.0000000e+00]]

?

連續(xù)訓(xùn)練3000次以上,準(zhǔn)確率穩(wěn)定在95%以上,證明算法是有效可靠的。而且從預(yù)測(cè)方面的能力看,效果還是挺不錯(cuò)的。從結(jié)果來(lái)看,一切都挺有趣的。但這個(gè)模型沒(méi)有什么實(shí)際意義。正如前文所言,如果可以用普通的邏輯判斷語(yǔ)句就可以實(shí)現(xiàn)分類,那根本就沒(méi)有神經(jīng)網(wǎng)絡(luò)什么事。神經(jīng)網(wǎng)絡(luò)的分類能力主要還是用于數(shù)據(jù)挖掘上面,在海量數(shù)據(jù)中挖掘出人們還沒(méi)或者不可能發(fā)現(xiàn)潛在的聯(lián)系。

小結(jié)(內(nèi)含干貨,請(qǐng)認(rèn)真閱讀)

對(duì)于一些普通的業(yè)務(wù)需求而言,用神經(jīng)網(wǎng)絡(luò)來(lái)分類真的是脫褲子放屁---多此一舉嗎?在我看來(lái),并不一定!!!

首先,從宏觀的角度來(lái)看,用神經(jīng)網(wǎng)絡(luò)進(jìn)行分類,起碼是一種思維定式上的轉(zhuǎn)變。過(guò)去我們認(rèn)為,只有給電腦制定特定的運(yùn)行邏輯(這個(gè)過(guò)程就是所謂的編程),電腦才能按照我們的想法工作。有了神經(jīng)網(wǎng)絡(luò)后,這個(gè)定式就打破了。實(shí)際上我們并不需要給電腦這么多條條框框,制定那么多那么細(xì)的規(guī)則。只要我們告訴電腦什么是對(duì)的,什么是錯(cuò)的?電腦自己就會(huì)去學(xué)習(xí)?這時(shí)候電腦是不是越來(lái)越有點(diǎn)人類的味道?沒(méi)錯(cuò),很多時(shí)候,我們作為成人,作為家長(zhǎng),對(duì)于小孩的教育,往往都是先從告訴他什么是對(duì)的,什么是錯(cuò)的開(kāi)始。如果我們把一大段復(fù)雜冗長(zhǎng)的邏輯,壓縮成足夠多的事例,是不是就等于把邏輯內(nèi)嵌到神經(jīng)網(wǎng)絡(luò)的模型參數(shù)里面呢?上面的例子,就是一個(gè)很好的示范案例。它把求BMI,然后根據(jù)BMI指數(shù)來(lái)劃分人的體重情況這一大段邏輯,壓縮成了 (2 * 4 + 4)+ (4 * 4 + 4)=32 個(gè)參數(shù),按每個(gè)參數(shù)以64位浮點(diǎn)型來(lái)存儲(chǔ),一共才浪費(fèi)了32 * (64 / 8)= 256個(gè)字節(jié)。比原來(lái)的代碼(凈代碼不含注釋約占354個(gè)字節(jié))節(jié)省了98個(gè)字節(jié)。

壓縮代碼容量好像沒(méi)有什么了不起的。而且還以犧牲準(zhǔn)確率為代價(jià)(準(zhǔn)確率下降了4%)。神經(jīng)網(wǎng)絡(luò)看起來(lái)好像還是個(gè)廢物點(diǎn)心呀!但請(qǐng)記住,“神經(jīng)網(wǎng)絡(luò)在某些分類問(wèn)題上沒(méi)用”這句話,是針對(duì)有編程基礎(chǔ)的人而言。而且就算是有足夠編程基礎(chǔ)的大神,也不能保證所寫(xiě)的代碼完全沒(méi)有bug。一旦代碼有bug,準(zhǔn)確率就是一個(gè)未知之?dāng)?shù)了。所以再牛X的大牛,也還要寫(xiě)單元測(cè)試,要借助測(cè)試用例來(lái)檢驗(yàn)自己的代碼有沒(méi)有bug。但問(wèn)題是,有時(shí)候,大牛自己寫(xiě)的單元測(cè)試和生成的測(cè)試用例也是可能有bug的。。。。。從上面的分析可以看出,bug這種東西從人們學(xué)會(huì)編程的那一刻就已經(jīng)是根深蒂固的存在了。那用神經(jīng)網(wǎng)絡(luò)訓(xùn)練的邏輯就沒(méi)Bug了嗎?有,肯定有。但就算有,也有解決辦法讓bug的出現(xiàn)概率限制在特定的誤差范圍內(nèi)。

其次,神經(jīng)網(wǎng)絡(luò)將人工智能輔助編程變成一種可能。前面已經(jīng)介紹過(guò),一個(gè)多分支邏輯判斷語(yǔ)句可以等價(jià)為一個(gè)n分類神經(jīng)網(wǎng)絡(luò)。其中一個(gè)條件分支就對(duì)應(yīng)著一個(gè)分類。因此,可以將用一般的高級(jí)程序語(yǔ)言寫(xiě)的邏輯判斷語(yǔ)句,直接轉(zhuǎn)化成一個(gè)(或一組)神經(jīng)網(wǎng)絡(luò)。眾所周知,神經(jīng)網(wǎng)絡(luò)有較好的魯棒性(Robust),它僅與問(wèn)題規(guī)模有關(guān),而與問(wèn)題所涉及具體的業(yè)務(wù)場(chǎng)景無(wú)關(guān)。因此用神經(jīng)網(wǎng)絡(luò)構(gòu)建人工智能編程環(huán)境,能適應(yīng)所有現(xiàn)階段已知的業(yè)務(wù)類型。之前的示例很好的說(shuō)明了這一點(diǎn),不管我們是建立體重的BMI測(cè)量模型,還是建立工資收入與消費(fèi)支出的統(tǒng)計(jì)學(xué)模型,神經(jīng)網(wǎng)絡(luò)都能輕松駕馭。

第三,人工智能輔助編程將極大地提升軟件有效生產(chǎn)率。估計(jì)看到這里,不少碼農(nóng)朋友可能又要聽(tīng)到“狼來(lái)了”的聲音。如果計(jì)算機(jī)自己都會(huì)編程了,那碼農(nóng)們是不是要集體失業(yè)了。不!正好相反,神經(jīng)網(wǎng)絡(luò)只是”輔助”人類編程,而不是去搶奪我們的主動(dòng)權(quán)。首先,計(jì)算機(jī)沒(méi)有自主意識(shí),它不知道在什么時(shí)候干什么才是有意義的。其次,計(jì)算機(jī)能控制的范圍都盡在人類的掌控之中。現(xiàn)今的所有計(jì)算機(jī)理論都是建立在嚴(yán)密的數(shù)學(xué)理論上面,也就是說(shuō),所有未來(lái)可能出現(xiàn)的情況,都可以在那一堆復(fù)雜的數(shù)學(xué)公式中找到答案。

人工智能輔助編程其實(shí)是廣大碼農(nóng)的福音!自此之后,大家不用再花時(shí)間去996,寫(xiě)那枯燥乏味的業(yè)務(wù)代碼。人們只需要按照業(yè)務(wù)需求場(chǎng)景,搭建好網(wǎng)絡(luò)模型,然后把業(yè)務(wù)數(shù)據(jù)準(zhǔn)備好,輸入到神經(jīng)網(wǎng)絡(luò)中,最后就可以靜待神經(jīng)網(wǎng)絡(luò)返回正確的結(jié)果。相信不久的將來(lái),碼農(nóng)們已經(jīng)可以擺脫代碼的束縛,不再僅將關(guān)注點(diǎn)放在如何實(shí)現(xiàn)這件事上面,而更多的會(huì)從如何做好這件事去思考(這已經(jīng)是產(chǎn)品思維了)

最后,人工智能輔助編程將進(jìn)一步降低人們學(xué)習(xí)計(jì)算機(jī)編程的門檻。以后所有現(xiàn)在所謂的高級(jí)程序語(yǔ)言(如Java,C++,Ruby)可能都將成為歷史。未來(lái)的編程語(yǔ)言隨著NLP (自然語(yǔ)言理解)和人工智能輔助編程的持續(xù)發(fā)展,將會(huì)逐步演化為一門更貼近人類母語(yǔ)語(yǔ)法,更簡(jiǎn)練直觀的語(yǔ)言。將來(lái)編程將不再是一門只有少數(shù)人掌握的技能,而是一項(xiàng)像喝水吃飯一樣簡(jiǎn)單的本能。

總結(jié)

以上是生活随笔為你收集整理的神经网络基础原理(三)-----分类问题实弹演练及一些小干货的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。