分段函数怎么用神经网络进行拟合_tkinter+tensorflow,利用神经网络拟合函数可视化小程序...

写这个小程序的目的有2个:

1. 向同事证明神经网络可以拟合函数;

2. 可视化地感受不同参数对拟合过程的影响。

下图是用tkinter做的GUI界面,请忽略丑陋的布局。

1. 网络结构:

理论认为:当隐藏层节点数足够多时,只需三层BP网络即可逼近任何连续函数。

程序中网络结构十分简单:1输入,1输出,中间隐藏层的节点数默认为10,为可调参数,目标函数为二次函数,数据点加了噪音。

2. 当数据过少时,容易出现过拟合:

当数据点的个数只有4个时,为了使得loss最小,神经网络经过了这四个点,学习结果为3个分段函数,与目标值二次函数存在较大出入,出现了明显的过拟合。

3. 学习率太大时,模型可能无法收敛:

4. 模型并不是越大越好:

当神经网络隐藏层节点数由5变为50时,直观上看:拟合结果差别并不大。

这里其实就涉及到一个问题:精度和速度之间的平衡。

未来还可以可视化的观察:

a. 不同优化器,如Adam,rmsprop,SGD的差别;

b. 异常值的加入对结果的影响;

……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是基于卷积神经网络实现手写数字图片识别,并用GUI进行可视化的Python代码,使用的是Keras库,不使用TensorFlow: ```python import numpy as np from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D from keras.utils import np_utils from tkinter import * from PIL import Image, ImageDraw # 加载MNIST数据集 (X_train, y_train), (X_test, y_test) = mnist.load_data() # 将数据转换为float类型并归一化到0-1之间 X_train = X_train.astype('float32') / 255 X_test = X_test.astype('float32') / 255 # 对标签进行one-hot编码 y_train = np_utils.to_categorical(y_train, 10) y_test = np_utils.to_categorical(y_test, 10) # 将数据转换为卷积神经网络所需的格式 X_train = X_train.reshape(X_train.shape[0], 28, 28, 1) X_test = X_test.reshape(X_test.shape[0], 28, 28, 1) # 构建卷积神经网络模型 model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(X_train, y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test, y_test)) # 创建GUI界面 root = Tk() root.title("手写数字识别") root.geometry("280x280") # 创建画布 canvas = Canvas(root, bg="white", width=280, height=280) canvas.pack() # 创建图像对象和画笔对象 image = Image.new("L", (280, 280), 0) draw = ImageDraw.Draw(image) # 定义画笔的宽度和颜色 width = 20 color = 255 # 定义画布上鼠标点击和拖拽的事件处理函数 def paint(event): x1, y1 = (event.x - width), (event.y - width) x2, y2 = (event.x + width), (event.y + width) canvas.create_oval(x1, y1, x2, y2, fill="black", outline="black") draw.ellipse([x1, y1, x2, y2], fill=color) def recognize(): # 将图像转换为28x28的灰度图像 image_small = image.resize((28, 28), Image.ANTIALIAS).convert("L") image_small = np.array(image_small).reshape((1, 28, 28, 1)) / 255.0 # 进行数字识别 result = model.predict(image_small) label = np.argmax(result) # 在GUI界面上显示识别结果 result_label.config(text="识别结果:{}".format(label)) # 创建按钮和标签 button_recognize = Button(root, text="识别", command=recognize) button_recognize.pack(side=BOTTOM) result_label = Label(root, text="识别结果:") result_label.pack(side=BOTTOM) # 绑定鼠标事件 canvas.bind("<B1-Motion>", paint) root.mainloop() ``` 这段代码中,我们首先加载MNIST数据集,并对数据进行预处理。然后,构建卷积神经网络模型并进行编译和训练。最后,创建GUI界面,包括一个画布用于用户手写数字的输入,一个按钮用于进行识别,以及一个标签用于显示识别结果。在GUI界面上,我们使用PIL库创建一个图像对象和画笔对象,并在画布上绑定鼠标事件。当用户在画布上绘制完数字之后,点击识别按钮即可进行数字识别,并将结果显示在标签上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值