神經網絡構成、優化、常用函數+激活函數

Iris分類

數據集介紹,共有數據150組,每組包括長寬等4個輸入特征,同時給出輸入特征對應的Iris類別,分別用0,1,2表示。

從sklearn包datasets讀入數據集。

from sklearn import darasets
from pandas import DataFrame
import pandas as pd
x_data = datasets.load_iris().data #  輸入特征
y_data = datasets.load_iris().target # 標簽
x_data = DataFrame(x_data, columns=["花萼長度",'花萼寬度','花瓣長度','花瓣寬度'])
pd.set_option('display.unicode.east_asian_width',True) # 設置列名對齊
x_dara['類別'] = y_data # 新增一列

神經網絡實現分類步驟。

1.準備數據:

數據集讀入,數據集亂序,生成訓練集和測試集,配成輸入特征/標簽對,每次讀入一部分

2.搭建網絡

定義神經網絡中的所有可訓練參數

3.參數優化

嵌套循環迭代,with結構更新參數,顯示當前loss

4.測試效果

計算當前向前傳播后的準確率,顯示當前acc

5可視化acc/loss

# -*- coding: UTF-8 -*-
# 利用鳶尾花數據集,實現前向傳播、反向傳播,可視化loss曲線# 導入所需模塊
import tensorflow as tf
from sklearn import datasets
from matplotlib import pyplot as plt
import numpy as np# 導入數據,分別為輸入特征和標簽
x_data = datasets.load_iris().data
y_data = datasets.load_iris().target# 隨機打亂數據(因為原始數據是順序的,順序不打亂會影響準確率)
# seed: 隨機數種子,是一個整數,當設置之后,每次生成的隨機數都一樣(為方便教學,以保每位同學結果一致)
np.random.seed(116)  # 使用相同的seed,保證輸入特征和標簽一一對應
np.random.shuffle(x_data)
np.random.seed(116)
np.random.shuffle(y_data)
tf.random.set_seed(116)# 將打亂后的數據集分割為訓練集和測試集,訓練集為前120行,測試集為后30行
x_train = x_data[:-30]
y_train = y_data[:-30]
x_test = x_data[-30:]
y_test = y_data[-30:]# 轉換x的數據類型,否則后面矩陣相乘時會因數據類型不一致報錯
x_train = tf.cast(x_train, tf.float32)
x_test = tf.cast(x_test, tf.float32)# from_tensor_slices函數使輸入特征和標簽值一一對應。(把數據集分批次,每個批次batch組數據)
train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)
test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)# 生成神經網絡的參數,4個輸入特征故,輸入層為4個輸入節點;因為3分類,故輸出層為3個神經元
# 用tf.Variable()標記參數可訓練
# 使用seed使每次生成的隨機數相同(方便教學,使大家結果都一致,在現實使用時不寫seed)
w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1))
b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1))lr = 0.1  # 學習率為0.1
train_loss_results = []  # 將每輪的loss記錄在此列表中,為后續畫loss曲線提供數據
test_acc = []  # 將每輪的acc記錄在此列表中,為后續畫acc曲線提供數據
epoch = 500  # 循環500輪
loss_all = 0  # 每輪分4個step,loss_all記錄四個step生成的4個loss的和# 訓練部分
for epoch in range(epoch):  #數據集級別的循環,每個epoch循環一次數據集for step, (x_train, y_train) in enumerate(train_db):  #batch級別的循環 ,每個step循環一個batchwith tf.GradientTape() as tape:  # with結構記錄梯度信息y = tf.matmul(x_train, w1) + b1  # 神經網絡乘加運算y = tf.nn.softmax(y)  # 使輸出y符合概率分布(此操作后與獨熱碼同量級,可相減求loss)y_ = tf.one_hot(y_train, depth=3)  # 將標簽值轉換為獨熱碼格式,方便計算loss和accuracyloss = tf.reduce_mean(tf.square(y_ - y))  # 采用均方誤差損失函數mse = mean(sum(y-out)^2)loss_all += loss.numpy()  # 將每個step計算出的loss累加,為后續求loss平均值提供數據,這樣計算的loss更準確# 計算loss對各個參數的梯度grads = tape.gradient(loss, [w1, b1])# 實現梯度更新 w1 = w1 - lr * w1_grad    b = b - lr * b_gradw1.assign_sub(lr * grads[0])  # 參數w1自更新b1.assign_sub(lr * grads[1])  # 參數b自更新# 每個epoch,打印loss信息print("Epoch {}, loss: {}".format(epoch, loss_all/4))train_loss_results.append(loss_all / 4)  # 將4個step的loss求平均記錄在此變量中loss_all = 0  # loss_all歸零,為記錄下一個epoch的loss做準備# 測試部分# total_correct為預測對的樣本個數, total_number為測試的總樣本數,將這兩個變量都初始化為0total_correct, total_number = 0, 0for x_test, y_test in test_db:# 使用更新后的參數進行預測y = tf.matmul(x_test, w1) + b1y = tf.nn.softmax(y)pred = tf.argmax(y, axis=1)  # 返回y中最大值的索引,即預測的分類# 將pred轉換為y_test的數據類型pred = tf.cast(pred, dtype=y_test.dtype)# 若分類正確,則correct=1,否則為0,將bool型的結果轉換為int型correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)# 將每個batch的correct數加起來correct = tf.reduce_sum(correct)# 將所有batch中的correct數加起來total_correct += int(correct)# total_number為測試的總樣本數,也就是x_test的行數,shape[0]返回變量的行數total_number += x_test.shape[0]# 總的準確率等于total_correct/total_numberacc = total_correct / total_numbertest_acc.append(acc)print("Test_acc:", acc)print("--------------------------")# 繪制 loss 曲線
plt.title('Loss Function Curve')  # 圖片標題
plt.xlabel('Epoch')  # x軸變量名稱
plt.ylabel('Loss')  # y軸變量名稱
plt.plot(train_loss_results, label="$Loss$")  # 逐點畫出trian_loss_results值并連線,連線圖標是Loss
plt.legend()  # 畫出曲線圖標
plt.show()  # 畫出圖像# 繪制 Accuracy 曲線
plt.title('Acc Curve')  # 圖片標題
plt.xlabel('Epoch')  # x軸變量名稱
plt.ylabel('Acc')  # y軸變量名稱
plt.plot(test_acc, label="$Accuracy$")  # 逐點畫出test_acc值并連線,連線圖標是Accuracy
plt.legend()
plt.show()

?根據MP模型可以看出,求出的y實際上就是計算出屬于哪一種分類的概率

?

?其求出的loss就是概率和0/1相減,再將loss和w與b求偏導,通過公式運算得到w和b

預備函數

tf.where

a=tf.constant([1,2,3,1,1])

b=tf.constant([0,1,3,4,5])

c=tf.where(tf.greater(a,b),a,b)

2.np.random.RandomState.rand(維度)返回[0,1]的隨機數

3.np.vstack() 將兩個數組按垂直方向疊加

4np.mgridp[起始值:結束值:步長,....] [)

5.x.ravel() 將x變為一維數組

6.np.c_ [數組1,數組2]返回的間隔數值點配對

神經網絡復雜度

指數衰減學習率

可以先用較大的學習率,快速得到較優解,然后逐步減小學習率,使模型在訓練后期穩定

指數衰減學習率=初始學習率*學習率衰減率^(當前輪數/多少輪衰減一次)更新頻率

epoch = 40
LR_BASE = 0.2
LR_DECAY = 0.99
LR_STEP = 1
for epoch in range(epoch):lr = LR_BASE*LR_DECAY**(epoch/LR_STEP)with tf.GradientTape() as tape:loss = tf.square(w + 1)grads = tape.gradient(loss, w)w.assign_sub(;lr*grads)

激活函數

1.Signmoid函數

特點:容易造成梯度消失,輸出非0均值,收斂慢,冪運算復雜,訓練時間長

2.Tanh函數

特點:輸出是0均值,容易造成梯度消失,冪運算復雜,訓練時間長

3.Relu函數

解決梯度消失問題正區間,容易造成神經元死亡,改變隨機初始化,避免過多設置更小學習率,減少參數的巨大變化,避免訓練中產生過多負數特征進入函數

Leaky Rely

1首選relu函數

2學習率設置較小值

3輸入特征標準化,既讓輸入特征滿足以0為均值,1為標準差的正態分布

4初始參數中心化,既讓隨機生成的參數滿足以0為均值,sqrt(2/當前層輸入特征個數)為標準差的正態分布

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43181.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43181.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43181.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vulnhub-NOOB-1

確認靶機 掃描靶機發現ftp Anonymous 的A大小寫都可以 查看文件 解密 登錄網頁 點擊about us會下載一個壓縮包 使用工具提取 steghide info 目標文件 //查看隱藏信息 steghide extract -sf 目標文件 //提取隱藏的文件 steghide embed -cf 隱藏信息的文件 -ef…

什么樣的開放式耳機好用舒服?南卡、倍思、Oladance高人氣質量絕佳產品力薦!

?開放式耳機在如今社會中已經迅速成為大家購買耳機的新趨勢,深受喜歡聽歌和熱愛運動的人群歡迎。當大家談到佩戴的穩固性時,開放式耳機都會收到一致好評。對于熱愛運動的人士而言,高品質的開放式耳機無疑是理想之選。特別是在近年來的一些騎…

算法學習記錄4

L2-012 關于堆的判斷 def checkHeap(heap, target):if target 0:return heapif heap[target] < heap[(target - 1) // 2]:temp heap[target]heap[target] heap[(target - 1) // 2]heap[(target - 1) // 2] tempheap checkHeap(heap, (target - 1) // 2)return heapdef…

2024.7.7刷題記錄

目錄 一、849. Dijkstra求最短路 I - AcWing題庫 二、850. Dijkstra求最短路 II - AcWing題庫 根據講解視頻寫的代碼 一、849. Dijkstra求最短路 I - AcWing題庫 N 600 MAXL 10010 # 最長邊長 # 稠密圖鄰接矩陣 g [[MAXL] * N for _ in range(N)] dist [MAXL] * N …

圖片kb太大了怎么改小?修改圖片kb的方法介紹

圖片kb太大了怎么改小&#xff1f;將圖片的文件大小&#xff08;以KB為單位&#xff09;縮小可以帶來多種優點&#xff0c;但也有一些缺點需要注意。縮小圖片文件大小可以顯著減少它在硬盤或其他存儲設備上占用的空間&#xff0c;使你能夠存儲更多的圖片和其他文件。而且&#…

KIVY 3D Rotating Monkey Head?

7 Python Kivy Projects (With Full Tutorials) – Pythonista Planet KIVY 3D Rotating Monkey Head kivy 3D 旋轉猴子頭How to display rotating monkey example in a given layout. Issue #6688 kivy/kivy GitHub 3d 模型下載鏈接 P99 - Download Free 3D model by …

【Qt】QItemSelectionModel 添加選中行

1. 介紹 QItemSelectionModel 中沒有直接添加選中行的方法&#xff0c;可以通過下面的方式添加。 2. 代碼 //定義 QSqlTableModel* m_tableModel; QItemSelectionModel* m_selectionModel;//添加選中行, 全選 void addAllLine() {for(int i0; i<m_tableModel->rowCoun…

【AI大模型新型智算中心技術體系深度分析 2024】

文末有福利&#xff01; ChatGPT 系 列 大 模 型 的 發 布&#xff0c; 不 僅 引 爆 全 球 科 技 圈&#xff0c; 更 加 夯 實 了 人 工 智 能&#xff08;Artificial Intelligence, AI&#xff09;在未來改變人類生產生活方式、引發社會文明和競爭力代際躍遷的戰略性地位。當…

mysql select count返回null

注意 mysql select count返回null 下面是百度的回答 在MySQL中&#xff0c;當SELECT COUNT(*)查詢返回NULL時&#xff0c;通常意味著查詢結果為空集&#xff0c;即沒有記錄匹配查詢條件。COUNT()函數在沒有匹配行的情況下返回NULL&#xff0c;而不是0。 解決方法&#xff1a…

ImportError: xxx: cannot open shared object file: No such file or directory

一類常見錯誤&#xff1a;編譯器器無法在目錄下找到共享目標文件&#xff0c; Linux(ubuntu)中共享的庫目錄為/usr/lib/x86_64-linux-gnu&#xff0c;gcc的編譯庫 在該目錄下創建共享文件&#xff08;偽造、下載&#x1f91c;cp)即可 sudo ln -s libtiff.so.6 libtiff.so.5

昇思25天學習打卡營第11天|ResNet50圖像分類

文章目錄 昇思MindSpore應用實踐基于MindSpore的ResNet50圖像分類1、ResNet50 簡介2、數據集預處理及可視化3、構建網絡構建 Building Block構建 Bottleneck Block構建 ResNet50 網絡 4、模型訓練5、圖像分類模型推理 Reference 昇思MindSpore應用實踐 本系列文章主要用于記錄…

Emacs相關

Emacs 詳細介紹 Emacs&#xff0c;全稱 Editor MACroS&#xff0c;是一款功能強大、歷史悠久的文本編輯器。它最早由 Richard Stallman 于 1976 年開發&#xff0c;是自由軟件運動的重要組成部分。Emacs 的設計理念強調可定制性和擴展性&#xff0c;使得它不僅僅是一個編輯器&…

AsyncRequestTimeoutException

在Spring MVC中&#xff0c;當一個異步請求超過配置的最大等待時間時&#xff0c;會拋出AsyncRequestTimeoutException異常。這個異常通常是由于服務器端的處理時間超過了客戶端允許的等待時間&#xff0c;或者是服務器本身的異步處理時間配置過短導致的。 spring: mvc: async…

scrapy寫爬蟲

Scrapy是一個用于爬取網站數據并提取結構化信息的Python框架 一、Scrapy介紹 1.引擎&#xff08;Engine&#xff09; – Scrapy的引擎是控制數據流和觸發事件的核心。它管理著Spider發送的請求和接收的響應&#xff0c;以及處理Spider生成的Item。引擎是Scrapy運行的驅動力。…

基于go-zero二次開發的腳本

param$2 # 字符串風格格式為&#xff1a;DemoName model_name$(echo "${param}" | awk -F _ {for(i1;i<NF;i) $itoupper(substr($i,1,1)) tolower(substr($i,2));}1 | tr -d ) # 字符串風格格式為&#xff1a;demoName struct_name$(echo "${model_name}&qu…

ClickHouse表引擎概述

ClickHouse表引擎概述 表引擎的功能&#xff1a; 數據的存儲方式 數據的存儲位置 是否可以使用索引 是否可以使用分區 是否支持數據副本 并發數據訪問 ClickHouse在建表時必須指定表引擎。 表引擎主要分為四大類&#xff1a;MergeTree系列、Log系列、與其他存儲/處理系…

字節碼編程bytebuddy之獲取方法信息和方法入參信息

寫在前面 本文看下通過bytebuddy如何獲取方法信息和方法的入參信息。 1&#xff1a;代碼 package com.dahuyou.bytebuddy.bb;import com.dahuyou.bytebuddy.TT; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implement…

【高中數學/對數函數】比較a=ln2/2,b=ln5/5的大小

【問題】 比較aln2/2,bln5/5的大小 【解答】 a-bln2/2-ln5/5(5*ln2-2*ln5)/10(ln2^5-ln5^2)/10(ln32-ln25)/10>0 所以a>b 【圖像】 如果繪出函數ylnx/x的圖像&#xff0c;再標記出a,b的位置&#xff0c;則繪出圖像如下&#xff1a; 由上圖可以看出&#xff0c;a,b兩…

隨手記:對比兩個對象不一樣的值,生成一個新的對象

diffObject(obj1, obj2) {let changeForm {}for (let key in obj1) {if (!obj1.hasOwnProperty(key) || obj1[key] ! obj2[key]) {// 新舊數據不相同的key值changeForm[key] obj1[key]}}console.log(changeForm, changeForm)},

初次用bable遍歷vue項目下的中文

利用 babel 找到 AST 中的中文 // vite-plugin-babel-transform.js const parser require(babel/parser) const traverse require(babel/traverse).default // const types require(babel/types) // const generate require(babel/generator).default const fs require(f…