tensorflow之欠擬合與過擬合,正則化緩解

過擬合泛化性弱

欠擬合解決方法:

? ? ? ? 增加輸入特征項

? ? ? ? 增加網絡參數

? ? ? ? 減少正則化參數

過擬合的解決方法:

? ? ? ? 數據清洗

? ? ? ? 增大訓練集

? ? ? ? 采用正則化

? ? ? ? 增大正則化參數

正則化緩解過擬合

正則化在損失函數中引入模型復雜度指標,利用給w增加權重,弱化數據集的噪聲,loss = loss(y與y_) + REGULARIZER*loss(w)

模型中所有參數的損失函數,如交叉上海,均方誤差

利用超參數REGULARIZER給出參數w在總loss中的比例,即正則化權重, w是需要正則化的參數

正則化的選擇

L1正則化大概率會使很多參數變為0,因此該方法可通過系數參數,減少參數的數量,降低復雜度

L2正則化會使參數很接近0但不為0,因此該方法可通過減少參數值的大小降低復雜度?

with tf.GradientTape() as tape:h1 = tf.matul(x_train, w1) + b1h1 = tf.nn.relu(h1)y = tf.matmul(h1, w2) + b2loss_mse = tf.reduce_mean(tf.square(y_train - y))loss_ragularization = []loss_regularization.append(tf.nn.l2_loss(w1))loss_regularization.append(tf.nn.l2_loss(w2))loss_regularization = tf.reduce_sum(loss_regularization)loss = loss_mse + 0.03 * loss_regularization
variables = [w1, b1, w2, b2】
grads = tape.gradient(loss, variables)

生成網格覆蓋這些點,會對每個坐標生成一個預測值,輸出預測值為0.5的連成線,這個線就是紅點和藍點的分界線。

# 導入所需模塊
import tensorflow as tf
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd# 讀入數據/標簽 生成x_train y_train
df = pd.read_csv('dot.csv')
x_data = np.array(df[['x1', 'x2']])
y_data = np.array(df['y_c'])x_train = x_data
y_train = y_data.reshape(-1, 1)Y_c = [['red' if y else 'blue'] for y in y_train]# 轉換x的數據類型,否則后面矩陣相乘時會因數據類型問題報錯
x_train = tf.cast(x_train, tf.float32)
y_train = tf.cast(y_train, tf.float32)# from_tensor_slices函數切分傳入的張量的第一個維度,生成相應的數據集,使輸入特征和標簽值一一對應
train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)# 生成神經網絡的參數,輸入層為4個神經元,隱藏層為32個神經元,2層隱藏層,輸出層為3個神經元
# 用tf.Variable()保證參數可訓練
w1 = tf.Variable(tf.random.normal([2, 11]), dtype=tf.float32)
b1 = tf.Variable(tf.constant(0.01, shape=[11]))w2 = tf.Variable(tf.random.normal([11, 1]), dtype=tf.float32)
b2 = tf.Variable(tf.constant(0.01, shape=[1]))lr = 0.005  # 學習率為
epoch = 800  # 循環輪數# 訓練部分
for epoch in range(epoch):for step, (x_train, y_train) in enumerate(train_db):with tf.GradientTape() as tape:  # 記錄梯度信息h1 = tf.matmul(x_train, w1) + b1  # 記錄神經網絡乘加運算h1 = tf.nn.relu(h1)y = tf.matmul(h1, w2) + b2# 采用均方誤差損失函數mse = mean(sum(y-out)^2)loss_mse = tf.reduce_mean(tf.square(y_train - y))# 添加l2正則化loss_regularization = []# tf.nn.l2_loss(w)=sum(w ** 2) / 2loss_regularization.append(tf.nn.l2_loss(w1))loss_regularization.append(tf.nn.l2_loss(w2))# 求和# 例:x=tf.constant(([1,1,1],[1,1,1]))#   tf.reduce_sum(x)# >>>6loss_regularization = tf.reduce_sum(loss_regularization)loss = loss_mse + 0.03 * loss_regularization  # REGULARIZER = 0.03# 計算loss對各個參數的梯度variables = [w1, b1, w2, b2]grads = tape.gradient(loss, variables)# 實現梯度更新# w1 = w1 - lr * w1_gradw1.assign_sub(lr * grads[0])b1.assign_sub(lr * grads[1])w2.assign_sub(lr * grads[2])b2.assign_sub(lr * grads[3])# 每200個epoch,打印loss信息if epoch % 20 == 0:print('epoch:', epoch, 'loss:', float(loss))# 預測部分
print("*******predict*******")
# xx在-3到3之間以步長為0.01,yy在-3到3之間以步長0.01,生成間隔數值點
xx, yy = np.mgrid[-3:3:.1, -3:3:.1]
# 將xx, yy拉直,并合并配對為二維張量,生成二維坐標點
grid = np.c_[xx.ravel(), yy.ravel()]
grid = tf.cast(grid, tf.float32)
# 將網格坐標點喂入神經網絡,進行預測,probs為輸出
probs = []
for x_predict in grid:# 使用訓練好的參數進行預測h1 = tf.matmul([x_predict], w1) + b1h1 = tf.nn.relu(h1)y = tf.matmul(h1, w2) + b2  # y為預測結果probs.append(y)# 取第0列給x1,取第1列給x2
x1 = x_data[:, 0]
x2 = x_data[:, 1]
# probs的shape調整成xx的樣子
probs = np.array(probs).reshape(xx.shape)
plt.scatter(x1, x2, color=np.squeeze(Y_c))
# 把坐標xx yy和對應的值probs放入contour函數,給probs值為0.5的所有點上色  plt.show()后 顯示的是紅藍點的分界線
plt.contour(xx, yy, probs, levels=[.5])
plt.show()# 讀入紅藍點,畫出分割線,包含正則化
# 不清楚的數據,建議print出來查看

存在過擬合現象,輪廓不夠平滑, 使用l2正則化緩解過擬合

# 導入所需模塊
import tensorflow as tf
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd# 讀入數據/標簽 生成x_train y_train
df = pd.read_csv('dot.csv')
x_data = np.array(df[['x1', 'x2']])
y_data = np.array(df['y_c'])x_train = x_data
y_train = y_data.reshape(-1, 1)Y_c = [['red' if y else 'blue'] for y in y_train]# 轉換x的數據類型,否則后面矩陣相乘時會因數據類型問題報錯
x_train = tf.cast(x_train, tf.float32)
y_train = tf.cast(y_train, tf.float32)# from_tensor_slices函數切分傳入的張量的第一個維度,生成相應的數據集,使輸入特征和標簽值一一對應
train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)# 生成神經網絡的參數,輸入層為4個神經元,隱藏層為32個神經元,2層隱藏層,輸出層為3個神經元
# 用tf.Variable()保證參數可訓練
w1 = tf.Variable(tf.random.normal([2, 11]), dtype=tf.float32)
b1 = tf.Variable(tf.constant(0.01, shape=[11]))w2 = tf.Variable(tf.random.normal([11, 1]), dtype=tf.float32)
b2 = tf.Variable(tf.constant(0.01, shape=[1]))lr = 0.005  # 學習率為
epoch = 800  # 循環輪數# 訓練部分
for epoch in range(epoch):for step, (x_train, y_train) in enumerate(train_db):with tf.GradientTape() as tape:  # 記錄梯度信息h1 = tf.matmul(x_train, w1) + b1  # 記錄神經網絡乘加運算h1 = tf.nn.relu(h1)y = tf.matmul(h1, w2) + b2# 采用均方誤差損失函數mse = mean(sum(y-out)^2)loss_mse = tf.reduce_mean(tf.square(y_train - y))# 添加l2正則化loss_regularization = []# tf.nn.l2_loss(w)=sum(w ** 2) / 2loss_regularization.append(tf.nn.l2_loss(w1))loss_regularization.append(tf.nn.l2_loss(w2))# 求和# 例:x=tf.constant(([1,1,1],[1,1,1]))#   tf.reduce_sum(x)# >>>6loss_regularization = tf.reduce_sum(loss_regularization)loss = loss_mse + 0.03 * loss_regularization  # REGULARIZER = 0.03# 計算loss對各個參數的梯度variables = [w1, b1, w2, b2]grads = tape.gradient(loss, variables)# 實現梯度更新# w1 = w1 - lr * w1_gradw1.assign_sub(lr * grads[0])b1.assign_sub(lr * grads[1])w2.assign_sub(lr * grads[2])b2.assign_sub(lr * grads[3])# 每200個epoch,打印loss信息if epoch % 20 == 0:print('epoch:', epoch, 'loss:', float(loss))# 預測部分
print("*******predict*******")
# xx在-3到3之間以步長為0.01,yy在-3到3之間以步長0.01,生成間隔數值點
xx, yy = np.mgrid[-3:3:.1, -3:3:.1]
# 將xx, yy拉直,并合并配對為二維張量,生成二維坐標點
grid = np.c_[xx.ravel(), yy.ravel()]
grid = tf.cast(grid, tf.float32)
# 將網格坐標點喂入神經網絡,進行預測,probs為輸出
probs = []
for x_predict in grid:# 使用訓練好的參數進行預測h1 = tf.matmul([x_predict], w1) + b1h1 = tf.nn.relu(h1)y = tf.matmul(h1, w2) + b2  # y為預測結果probs.append(y)# 取第0列給x1,取第1列給x2
x1 = x_data[:, 0]
x2 = x_data[:, 1]
# probs的shape調整成xx的樣子
probs = np.array(probs).reshape(xx.shape)
plt.scatter(x1, x2, color=np.squeeze(Y_c))
# 把坐標xx yy和對應的值probs放入contour函數,給probs值為0.5的所有點上色  plt.show()后 顯示的是紅藍點的分界線
plt.contour(xx, yy, probs, levels=[.5])
plt.show()# 讀入紅藍點,畫出分割線,包含正則化
# 不清楚的數據,建議print出來查看

python EmptyDataError No columns to parse from file sites:stackoverflow.com

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

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

相關文章

點線面推進未來智造

如今,寧波擁有門類齊全的制造業體系,形成了以石油化工、汽車及零部件、電工電器、紡織服裝等為支柱的產業集群。 寧波工業的發展并非一蹴而就,藍卓總經理譚彰詳細解讀了寧波制造業的發展歷程與當下目標,從工業小市到工業大市、工業…

基于Matlab和Python泰勒圖的繪制

一、泰勒圖介紹 泰勒圖:泰勒圖1常用于評價模型的精度,常用的精度指標有相關系數,標準差以及均方根誤差(RMSE)。一般而言,泰勒圖中的散點代表模型,輻射線代表相關系數,橫縱軸代表標準差,而虛線代表均方根誤差。泰勒圖一改以往用散點圖這種只能呈現兩個指標來表示模型精度…

Qt使用筆記1(智能指針,deleteLater,多屏)

1、Qt智能指針 1.1、QPointer :解決野指針問題,必須是QObject對象。 1.2、QScopedPoint:作用域指針,出作用域自動釋放。 1.3、QScopedArrayPoint:作用域數組指針,出作用域自動釋放數組。 1.4、QSharedP…

RedHat運維-Ansible自動化運維基礎20-從ansible-galaxy下載role

1. 社區管理的role倉庫:___________________________________; 2. 社區管理的role倉庫:___________________________________; 3. 社區管理的role倉庫:___________________________________; 4. 在ansible …

Python數據結構的庫之Fuk使用詳解

概要 fuk 是一個用于處理 Python 數據結構的庫,全稱為 "Fast and Uncomplicated Kit"。它提供了一系列高效、簡潔的數據結構實現,以及對 Python 內置數據結構的擴展。通過使用 fuk,開發者可以更加方便地處理列表、集合、字典等數據類型,提高代碼的執行效率和可讀…

vite+vue3拍照上傳到nodejs服務器

一:效果展示: 拍照效果 二:Nodejs后端接口代碼: 三:前端完整代碼:

Vue基礎--v-model/v-for/事件屬性/偵聽器

目錄 一 v-model表單元素 1.1 v-model綁定文本域的value 1.1.1 lazy屬性:光標離開再發請求 1.1.2 number屬性:如果能轉成number就會轉成numer類型 1.1.3 trim屬性:去文本域輸入的前后空格 1.2v-model綁定單選checkbox 1.3代碼展示 二 …

esp8266+micropython+irsend紅外發射調試記錄

在網上搜索esp8266micropython的紅外發射庫,沒找到,發現 接收庫是有的,可以參考:基于MicroPython的ESP8266連接外設IO(二)_micropython 紅外接收-CSDN博客 可惜沒有發射,很不方便。 這里都有介…

PHP財務記賬管理系統小程序源碼

理財小能手必備!揭秘財務記賬管理系統的魔力? 🌟 引入篇:告別糊涂賬,擁抱財務自由 你是否曾為月底的賬單頭疼不已?是否覺得自己的錢總是莫名其妙地消失?別擔心,財務記賬管理系統來拯救你的錢…

【機器學習】必會數學知識:一文掌握數據科學核心數學知識點(下),收藏~

核心數學知識點 1、引言2、數據科學必會數學知識2.13 K均值聚類2.14 決策樹2.15 隨機森林2.16 梯度下降2.17 隨機梯度下降(SGD)2.18 卷積2.19 拉普拉斯變換2.20 傅里葉變換2.21 信息論2.22 時間序列分析2.23 生成模型與判別模型2.24 支持向量機&#xff…

git merge 分支回退

1. 使用git merge --abort(如果合并正在進行中) git merge --abort2. 使用git reset(合并已經提交) 硬重置(--hard)會丟棄所有合并后的更改,并將HEAD指向合并前的提交。這是最徹底的方式&…

DDOS 攻擊原理

DDoS攻擊的基本原理 資源耗盡:攻擊者通過發送大量的請求或數據包,耗盡目標系統的資源(如帶寬、CPU、內存等),使其無法處理正常的用戶請求。 分布式攻擊:與傳統的DoS(拒絕服務)攻擊不…

Java-面向對象基礎

在面向對象編程(Object-Oriented Programming, OOP)中,類(Class)是一種用來描述對象共同特征的藍圖或模板。它是創建對象的原型,定義了對象可以有的屬性(字段)和行為(方法…

物聯網應用,了解一點 WWAN全球網絡標準

WWAN/蜂窩無線電認證,對跨地區應用場景,特別重要。跟隨全球業務的腳步,我們像大唐先輩一樣走遍全球業務的時候,了解一點全球化的 知識信息,就顯得有那么點意義。 NA (北美):美國和加…

OpenSSH漏洞(CVE-2024-6387)

漏洞信息 請參考:OpenSSH遠程代碼執行漏洞 (CVE-2024-6387) 影響范圍 8.5p1 <= OpenSSH < 9.8p1 參考鏈接中內容補充 利用方式 關于OpenSSH漏洞CVE-2024-6387,攻擊者可以利用一個有用的代碼路徑并在正確的時間點上被SIGALRM信號打斷,從而導致sshd(OpenSSH守護…

基于Python的嗶哩嗶哩數據分析系統設計實現過程,技術使用flask、MySQL、echarts,前端使用Layui

背景和意義 隨著互聯網和數字媒體行業的快速發展&#xff0c;視頻網站作為重要的內容傳播平臺之一&#xff0c;用戶量和內容豐富度呈現爆發式增長。本研究旨在設計并實現一種基于Python的嗶哩嗶哩數據分析系統&#xff0c;采用Flask框架、MySQL數據庫以及echarts數據可視化技術…

工控、物聯網、電力行業調試工具大全

工控、物聯網、電力行業調試工具大全 文章目錄 工控、物聯網、電力行業調試工具大全Modbus調試工具MQTT調試工具IEC104/IEC101調試工具IEC61850 調試工具DL/T645 調試工具 Modbus調試工具 Modbus 是一種用于工業自動化系統中的通信協議&#xff0c;最早由 Modicon&#xff08;…

信號111

2、核心轉儲 當進程出現魔種異常的時候&#xff0c;是否有OS將當前進程在內存中的相關核心數據&#xff0c;轉存到磁盤中&#xff01; 一般而言云服務器的核心轉儲功能是關閉的。 3、驗證進程等待中的core dump標記位。 4、為什么生產環境一般都要關閉 core dump 系統調用接口…

解釋器模式在金融業務中的應用及其在Spring框架中的實現

引言 解釋器模式&#xff08;Interpreter Pattern&#xff09;是一種行為設計模式&#xff0c;它為特定語言定義了一個解釋器&#xff0c;用于解釋語言中的語句。該模式用于需要解釋和執行特定語言或表達式的場景&#xff0c;例如腳本引擎、規則引擎等。在金融業務中&#xff…

NSObject‘s MetaClass 的 super_class 指向誰 ?

在 Objective-C 運行時系統中&#xff0c;NSObject 是所有類的根類。為了理解 NSObject 的元類&#xff08;MetaClass&#xff09;以及它的 super_class 指針指向誰&#xff0c;我們需要理解元類的繼承關系。 類和元類的關系 每個類對象都有一個 isa 指針&#xff0c;指向其元…