用Python實現神經網絡(二)

#Overfitting是機器學習的主要問題。下面我們來看一下過擬合現像:

import numpy as np

import matplotlib.pyplot as plt

import matplotlib as mpl

import tensorflow as tf

from scipy.optimize import curve_fit

# Generic matplotlib parameters for plots and figures

mpl.rcParams['figure.figsize'] = [8,5]

font = {'size'?? : 16}

mpl.rc('font', **font)

def func_0(p, a):

??? return a

def func_2(p, a, b, c):

??? return a+b*p + c*p**2

def func_3(p, a, b, c,d):

??? return a+b*p + c*p**2+d*p**3

def func_5(p, a, b, c,d,e,f):

??? return a+b*p + c*p**2+d*p**3+e*p**4+f*p**5

def func_14(p, a,b,c,d,e,f,g,h, i,j,k,l,m,n,o):

??? return a+b*p + c*p**2+d*p**3+e*p**4 + f*p**5 + g*p**6 + h*p**7+i*p**8 + j*p**9+k*p**10+l*p**11 + m*p**12 + n*p**13 + o*p**14

def func_21(p, a,b,c,d,e,f,g,h, i,j,k,l,m,n,o, q, r, s, t, u, v, x):

??? return a+b*p + c*p**2+d*p**3+e*p**4 + f*p**5 + g*p**6 + h*p**7+i*p**8 + j*p**9+k*p**10+l*p**11 + m*p**12 + n*p**13 + o*p**14+q*p**15+r*p**16+s*p**17+t*p**18+u*p**19+v*p**20+x*p**21????

def func_1(p, a, b):

??? return a+b*p

x = np.arange(-5.0, 5.0, 0.1, dtype = np.float64)

y = func_2(x, 1,2,3)+18.0*np.random.normal(0, 1, size=len(x))

popt, pcov = curve_fit(func_2, x, y)

print(popt)

fig = plt.figure()

ax = fig.add_subplot(1, 1, 1)

ax.scatter(x,y, color = 'red', label = 'With added noise')

ax.plot(x, func_2(x, 1,2,3), lw = 3,? label = 'True Function')

ax.set_xlabel('x')

ax.set_ylabel('y')

plt.legend()

一次多項式

popt, pcov = curve_fit(func_1, x, y)

print(popt)

fig = plt.figure()

ax = fig.add_subplot(1, 1, 1)

ax.scatter(x,y, color = 'red')

ax.plot(x, func_1(x, popt[0], popt[1]),? lw=3, color = 'orange', label = '1st order pol.')

ax.plot(x, func_2(x, 1,2,3), lw = 3, color ='blue', label = 'True Function')

ax.set_xlabel('x')

ax.set_ylabel('y')

ax.set_title('Too much bias')

plt.legend()

二次多項式

popt, pcov = curve_fit(func_2, x, y)

print(popt)

fig = plt.figure()

ax = fig.add_subplot(1, 1, 1)

ax.scatter(x,y, color = 'red')

ax.plot(x, func_2(x, *popt),? lw=3, color ='orange', label = '2nd order pol.')

ax.plot(x, func_2(x, 1,2,3), lw = 3, color ='blue', label = 'True Function')

ax.set_xlabel('x')

ax.set_ylabel('y')

ax.set_title('Good balance between bias and variance')

plt.legend()

21次多項式

popt, pcov = curve_fit(func_21, x, y)

print(popt)

fig = plt.figure()

ax = fig.add_subplot(1, 1, 1)

ax.scatter(x,y, color = 'red')

ax.plot(x, func_21(x, *popt),? lw=3,color ='orange', label = '21st order pol.')

ax.plot(x, func_2(x, 1,2,3), lw = 3, color ='blue', label = 'True Function')

ax.set_xlabel('x')

ax.set_ylabel('y')

plt.title('Strong overfitting')

plt.legend()

比較藍線

yy = []

poptl = []

for i in range (0,10):

??? np.random.seed(seed = i)

??? yy.append(func_2(x, 1,2,3)+18.0*np.random.normal(0, 1, size=len(x)))

??? popt, _ = curve_fit(func_21, x, yy[i])

poptl.append(popt)

fig = plt.figure()

ax = fig.add_subplot(1, 1, 1)

for i in range(0,10):

??? ax.plot(x, func_21(x, *poptl[i]),? lw=3)

ax.set_xlabel('x')

ax.set_ylabel('y')

yy = []

poptl = []

for i in range (0,10):

??? np.random.seed(seed = i)

??? yy.append(func_2(x, 1,2,3)+18.0*np.random.normal(0, 1, size=len(x)))

??? popt, _ = curve_fit(func_1, x, yy[i])

poptl.append(popt)

fig = plt.figure()

ax = fig.add_subplot(1, 1, 1)

plt.ylim(0,100)

for i in range(0,10):

??? ax.plot(x, func_1(x, *poptl[i]),? lw=3)

ax.set_xlabel('x')

ax.set_ylabel('y')

偏置 - 變化的妥協

x = np.arange(-5.0, 5.0, 0.25, dtype = np.float64)

y = func_5(x, 1,2,3,4,5,6)/1.0+2000.0*np.random.normal(0, 1, size=len(x))

ytest = func_5(x, 1,2,3,4,5,6)/1.0+2000.0*np.random.normal(0, 1, size=len(x))

fig = plt.figure()

ax = fig.add_subplot(1, 1, 1)

ax.scatter(x[:,],y[:,], color = 'red', label = 'training data')

ax.scatter(x[:,],ytest[:,], color = 'blue', label = 'test data')

ax.legend();

ax.set_xlabel('x')

ax.set_ylabel('y')

我們來計算偏置和變化用增加復雜度的多項式。我們考慮 0 到10階, 即常數到 9次多項式(最高次項為?9x9)

kmax = 10

bias = np.empty(kmax)

variance = np.empty(kmax)

def make_func(N):

??? def func(x, *p):

??????? res = np.zeros(len(x))

??????? for i in range (0,N+1):

??????????? res = res + p[i]*x**i

?? ?????return res

??? return func

for K in range (0,kmax):

??? func = make_func(K)

??? popt, _ = curve_fit(make_func(K), x, y, p0=[1.0]*(K+1))

??? bias[K] = np.mean((func(x, *popt)-y)**2)

??? variance[K] = np.var((func(x, *popt)))

fig = plt.figure()

ax = fig.add_subplot(1, 1, 1)

ax.plot(range(0,kmax),bias, color = 'red',? label = r'bias$^2$', marker = 'o')

ax.plot(range(0,kmax),variance, color = 'blue',? label = 'Variance', marker = 'o')

ax.set_xlabel('x')

plt.legend()

plt.tight_layout()

神經網絡進行回歸

xx = x.reshape(len(x),1)

yy = y.reshape(len(y),1)/1000.0+20.0

yytest = ytest.reshape(1,len(ytest))/1000.0+20.0

xx,yy

我們嘗試一些瘋狂的事情:有150個神經元的層。你希望什么?

#tf.reset_default_graph()

input_Dim=1

H1_NN=500

output_Dim=1

np.random.seed(612)

w1=tf.Variable(tf.random.normal([input_Dim, H1_NN], stddev=1))

b1 = tf.Variable(tf.zeros(H1_NN),dtype=tf.float32)

w2=tf.Variable(tf.random.normal([H1_NN,output_Dim], stddev=1))

b2 = tf.Variable(tf.zeros(output_Dim),dtype=tf.float32)

#W=[W1,W2]

#B=[B1,B2]

#定義模型函數

def model(x,w1,b1,w2,b2):

??? x=tf.matmul(x,w1)+b1

??? x=tf.nn.relu(x)

??? x=tf.matmul(x,w2)+b2

??? pred=tf.nn.relu(x)

??? return (pred)

#np.random.seed(612)

#W = tf.Variable(np.random.randn(784,10),dtype=tf.float32)

#B = tf.Variable(np.random.randn(10),dtype=tf.float32)

def loss(x,y,w1,b1,w2,b2):

??? #pred = model(x,w,b)

??? #loss_=tf.keras.losses.categorical_crossentropy(y_true=y,y_pred=pred)

??? #Loss_ = 0.5 * tf.reduce_mean(tf.square(Y_train - PRED_train))

??? #return tf.reduce_mean(loss_)???

??? err = model(x,w1,b1,w2,b2)-y

??? squared_err = tf.square(err)

??? return tf.reduce_mean(squared_err)???

???

def grad(x,y,w1,b1,w2,b2):

??? with tf.GradientTape() as tape:

??????? loss_ = loss(x,y,w1,b1,w2,b2)

??? return tape.gradient(loss_,[w1,b1,w2,b2])?

#def accuracy(x,y,w1,b1,w2,b2):

#???? pred = model(x,w1,b1,w2,b2)

#???? correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))

#???? return tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

cost_history = np.empty(shape=[1], dtype = float)

#learning_rate = tf.placeholder(tf.float32, shape=())

#learning_rate = tf.Variable(tf.random.normal(1))

#設置迭代次數和學習率

#train_epochs = 20

batch_size=1

learning_rate = 0.01

#構建線性函數的斜率和截距

training_epochs=1000

steps=int(training_epochs/batch_size)

loss_list_train = []

loss_list_valid = []

acc_list_train = []

acc_valid_train = []

#training_epochs=100

optimizer= tf.keras.optimizers.Adam(learning_rate=learning_rate)

#開始訓練,輪數為epoch,采用SGD隨機梯度下降優化方法

for epoch in range(training_epochs):

??? #for step in range(steps):

??????? #xs=xx[step*batch_size:(step+1)*batch_size]

??????? #ys=yy[step*batch_size:(step+1)*batch_size]

??? xs=tf.cast(xx,tf.float32)

??? ys=tf.cast(yy,tf.float32)

??????? #計算損失,并保存本次損失計算結果

??? grads=grad(xs,ys,w1,b1,w2,b2)

??? optimizer.apply_gradients(zip(grads,[w1,b1,w2,b2]))

??? loss_train =loss(xs,ys,w1,b1,w2,b2).numpy()

??? #loss_valid =loss(valid_x,valid_y,W,B).numpy()

??? #acc_train=accuracy(xs,ys,w1,b1,w2,b2).numpy()

??? #acc_valid=accuracy(valid_x,valid_y,W,B).numpy()

??? loss_list_train.append(loss_train)

?? ?#loss_list_valid.append(loss_valid)

??? #acc_list_train.append(acc_train)

??? #acc_valid_train.append(acc_valid)

??? #print("epoch={:3d},train_loss={:.4f},train_acc={:.4f},val_loss={:.4f},val_acc={:.4f}".format(epoch+1,loss_train,acc_train,loss_valid,acc_valid))

??? if (epoch % 100 == 0):

????????? print("epoch={:3d},train_loss={:.4f}".format(epoch+1,loss_train))

??? plt.figure()

plt.title("Cost Function vs. epoch number")

plt.xlabel("epochs")

plt.ylabel("Cost function $J$")

plt.plot(range(len(loss_list_train)), loss_list_train)

xs=tf.cast(xx,tf.float32)

ys=tf.cast(yy,tf.float32)

pred_y=model(xs,w1,b1,w2,b2).numpy()

#pred_y.shape

mse=loss(xs,ys,w1,b1,w2,b2).numpy()

#mse = tf.reduce_mean(tf.square(pred_y - yy))

print("MSE: %.4f" % mse)

fig = plt.figure()

ax = fig.add_subplot(1, 1, 1)

ax.scatter(xx[:,0],yy, color = 'red')

ax.plot(xx[:,0], pred_y.flatten(),? lw=3)

ax.set_xlabel('x')

ax.set_ylabel('y')

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

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

相關文章

數據結構入門 (二):掙脫連續空間的束縛 —— 單向鏈表詳解

TOC(目錄) 引言:整齊的代價 在上一篇文章中,我們一起探索了數據結構大家族的第一位成員——順序表。我們了解到,順序表作為一種線性結構,其最大的特點在于邏輯順序與物理順序的一致性,即元素之間不僅存在邏輯上的前后關…

AI-視頻一致性與多幀控制在AIGC中的技術挑戰與突破!

全文目錄:開篇語前言1. 視頻中人物一致性建模的難點與現有解決方案**人物一致性建模的挑戰****現有解決方案****案例代碼:基于姿態估計的多幀一致性保持**2. 光照/紋理/姿態跨幀保持方法剖析**跨幀光照與紋理一致性****跨幀姿態一致性**3. 幀間插值與關鍵…

基于Qwen2.5-3B-Instruct的LoRA微調與推理實戰指南

前言 大語言模型(LLM)的微調是當前AI領域的熱門話題,而參數高效微調方法(如LoRA)因其低成本和高效率備受關注。本文將手把手教你如何使用Qwen2.5-3B-Instruct模型進行LoRA微調,并構建完整的推理流程。 一、環境準備 1.1 硬件要求 ? GPU: 至少16GB顯存(如…

電腦插上u盤不顯示怎么回事

對于經常使用電腦的用戶來說,U盤是一種再熟悉不過的存儲工具。不管是拷貝資料、備份文件,還是制作啟動盤,U盤都發揮著重要作用。然而,有時候你可能會遇到這樣的情況:“U盤插上電腦,燈亮了,但電腦…

2025年6月GESP(C++二級): 冪和數

2025年6月GESP(C++二級): 冪和數 題目描述 對于正整數 n n n,如果 n n n 可以表為兩個

Windows、macOS、liunx下使用qemu搭建riscv64/linux

背景 在Windows、macOS和Linux環境下使用QEMU搭建RISC-V 64位Linux系統,網絡上存在大量過時、不完整或錯誤的教程。且部分AI生成的內容“幻覺”現象嚴重,導致關鍵步驟錯誤且難以進行。為確保可靠性,本教程基于最新實測驗證,涵蓋三…

簡單使用MCP

1、說明# 測試環境服務器 CPU數量:2核 內存:4GB 磁盤:50GB# 補充 如果不想使用Docker進行操作,只需要跳過Docker相關命令操作 即:使用Ollama運行模型,使用Python來創建MCP2、安裝Docker# 安裝Docker https:…

電腦裝機軟件一鍵安裝管理器

軟件使用 現在的裝機軟件很多,主要幾種類型就是辦公、看圖、影音、下載等,如果每次裝機之后,手動一個一個去安裝,費時費力還容易安裝到全家桶。 就有人整理了網絡上常用的一系列裝機軟件純凈和諧版本,并打包到一起&a…

深度學習入門-深度學習簡介

深度學習是加深了層的深度神經網絡。只需通過疊加層,就可以創建深度網絡。1、 加深網絡將深度學習中的重要技術(構成神經網絡的各種層、學習時的有效技巧、對圖像特別有效的CNN、參數的最優化方法等)匯總起來,創建一個深度網絡&am…

Linux 下安裝DM8數據庫詳細教程

Linux 下安裝DM8數據庫詳細教程 一、環境準備 1.操作系統要求 DM 數據庫支持多種操作系統,如 Windows、Linux 等。對于 Linux 系統,確保內核版本符合要求,例如 CentOS 7 或更高版本。同時,要保證系統有足夠的磁盤空間(建議至少 10GB 以上)和內存(至少 1GB 以上)。 對…

搭建基于Gitee文檔筆記自動發布

搭建基于Gitee文檔筆記自動發布由于現在gitee不支持代理靜態頁面,并且github.io需要VPN,實際使用的話gitee更為方便。一、為服務器和個人PC添加免密push和pull 參考鏈接:https://help.gitee.com/base/account/SSH%E5%85%AC%E9%92%A5%E8%AE%BE…

【Lua】閉包可能會導致的變量問題

先思考下面這個問題:local function counter()local count 0return function()count count 1return countend endlocal a counter() local b counter()print(a()) --> ? print(a()) --> ? print(b()) --> ? print(a()) --> ?輸出結果&#xff…

可觀測性、OpenTracing、OpenCensus、OpenTelemetry、Jaeger

監控與觀測 隨著軟件應用從單片架構向分布式微服務體系轉變,應用監控(Monitoring)和觀測(Observability)的需求也隨之提升。兩者存在相同的定義,目的都是為了發現應用程序中的問題。但還是有差別: 監控:目的是為了捕獲已知的問題…

Linux下使用原始socket收發數據包

在Linux系統中,使用非原始的socket,可以收發TCP或者UDP等網絡層數據包。如果要處理網絡層以下的數據包,比如ICMP、ARP等,或者更底層,比如鏈路層數據包,就得使用原始socket了。 創建socket 創建socket要使用…

暑期自學嵌入式——Day05補充(C語言階段)

接續上文:暑期自學嵌入式——Day05(C語言階段)-CSDN博客 主頁點關注不迷路喲。你的點贊、收藏,一鍵三連,是我持續更新的動力喲!!! 主頁: 一位搞嵌入式的 genius-CSDN博…

.NET Core EFCore零基礎快速入門簡單使用

一、什么是 Entity Framework (EF) Core Entity Framework (EF) Core 是輕量化、可擴展和跨平臺版的對象關系映射程序 (O/RM)數據訪問技術,。 它將開發人員從編寫大量 SQL 語句中解放出來。 二、EF的相關程序包 Microsoft.EntityFrameworkCore 核心程序包&#x…

AAC音頻格式

目錄 AAC音頻格式介紹 主要特點 技術優勢 常見文件擴展名 應用領域 AAC與PCM的區別與優勢對比 基本概念差異 主要技術區別 各自優勢 PCM的優勢 AAC的優勢 應用場景選擇 AAC音頻數據格式解析 1. AAC 文件格式 (1) ADIF (Audio Data Interchange Format) (2) ADT…

pom.xml文件中的${}變量從哪里傳值

在 Maven 的 pom.xml 文件中,${} 格式的變量(稱為屬性占位符)的值來源主要有以下幾種途徑: 1. ?內置屬性(Maven 預定義)?? ${project.basedir}:項目根目錄${project.version}:項…

【人工智能】項目案例分析:使用TensorFlow進行大規模對象檢測

????歡迎大家來到我們的天空???? ?? 作者簡介:我們的天空 ??《頭銜》:大廠高級軟件測試工程師,阿里云開發者社區專家博主,CSDN人工智能領域新星創作者。 ??《博客》:人工智能,深度學習,機器學習,python,自然語言處理,AIGC等分享。 所屬的專欄:TensorF…

C++---cout、cerr、clog

在C編程里,cout、cerr和clog是標準庫提供的重要輸出流對象,在數據輸出方面發揮著關鍵作用。 一、cout:標準輸出流 cout 是 std::ostream 類的對象,其作用是向標準輸出設備(一般是控制臺)輸出數據。它和 C 語…