用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.tpcf.cn/news/915089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 语…