用神经网络预测三角形的面积

devtools/2024/9/22 10:59:57/

周末遛狗时,我想起一个老问题:神经网络能预测三角形的面积吗?

神经网络非常擅长分类,例如根据花瓣长度和宽度以及萼片长度和宽度预测鸢尾花的种类(setosa、versicolor 或 virginica)。神经网络还擅长一些回归问题,例如根据城镇房屋的平均面积、城镇的税率、与最近大城市的距离等预测城镇的房价中位数。

神经网络并不适用于普通的数学计算,例如根据底边和高计算三角形的面积。如果你的小学数学有点生疏,我会提醒你,三角形的面积是底边乘以高的 1/2。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

我在一家大型科技公司工作,PyTorch 是官方首选的神经网络代码库,也是我个人首选的库。周末遛狗时,我决定使用 PyTorch 1.6 版(当前版本)预测三角形面积。

我编写了一个程序,以编程方式生成 10,000 个训练样本,其中底边和高边的值是 0.1 到 0.9 之间的随机值(因此面积在 0.005 到 0.405 之间)。我创建了一个 2-(100-100-100-100)-1 神经网络 — 2 个输入节点、4 个隐藏层(每个隐藏层有 100 个节点)和一个输出节点。我在隐藏节点上使用了 tanh 激活,在输出节点上没有使用激活。

我使用 10 个样本作为批次对网络进行了 1,000 个周期的训练。

训练后,网络正确地预测了 100% 的训练项目在正确区域的 10% 以内,100% 的训练项目在正确区域的 5% 以内,82% 的训练项目在正确区域的 1% 以内。这是否是一个好结果取决于你的观点。

很有趣。深度学习引起了很多关注,并且有大量关于该主题的研究活动。但这不是魔术。

在我思考三角形的那个周末,我看了一部 1967 年的老间谍电影《比男杀手更致命》,里面的女杀手都留着蜂窝发型。左图:女演员 Elke Sommer 扮演主要杀手。我不知道这种发型是怎么回事。中图和右图:互联网图片搜索返回了不少这样的图片,所以我猜蜂窝发型现在有时仍然在使用。

我的代码如下:

# triangle_area_nn.py
# predict area of triangle using PyTorch NNimport numpy as np
import torch as T
device = T.device("cpu")class TriangleDataset(T.utils.data.Dataset):# 0.40000, 0.80000, 0.16000 #   [0]      [1]      [2]def __init__(self, src_file, num_rows=None):all_data = np.loadtxt(src_file, max_rows=num_rows,usecols=range(0,3), delimiter=",", skiprows=0,dtype=np.float32)self.x_data = T.tensor(all_data[:,0:2],dtype=T.float32).to(device)self.y_data = T.tensor(all_data[:,2],dtype=T.float32).to(device)self.y_data = self.y_data.reshape(-1,1)def __len__(self):return len(self.x_data)def __getitem__(self, idx):if T.is_tensor(idx):idx = idx.tolist()base_ht = self.x_data[idx,:]  # idx rows, all 4 colsarea = self.y_data[idx,:]    # idx rows, the 1 colsample = { 'base_ht' : base_ht, 'area' : area }return sample# ---------------------------------------------------------def accuracy(model, ds):# ds is a iterable Dataset of Tensorsn_correct10 = 0; n_wrong10 = 0n_correct05 = 0; n_wrong05 = 0n_correct01 = 0; n_wrong01 = 0# alt: create DataLoader and then enumerate itfor i in range(len(ds)):inpts = ds[i]['base_ht']tri_area = ds[i]['area']    # float32  [0.0] or [1.0]with T.no_grad():oupt = model(inpts)delta = tri_area.item() - oupt.item()if delta < 0.10 * tri_area.item():n_correct10 += 1else:n_wrong10 += 1if delta < 0.05 * tri_area.item():n_correct05 += 1else:n_wrong05 += 1if delta < 0.01 * tri_area.item():n_correct01 += 1else:n_wrong01 += 1acc10 = (n_correct10 * 1.0) / (n_correct10 + n_wrong10)acc05 = (n_correct05 * 1.0) / (n_correct05 + n_wrong05)acc01 = (n_correct01 * 1.0) / (n_correct01 + n_wrong01)return (acc10, acc05, acc01)# ----------------------------------------------------------class Net(T.nn.Module):def __init__(self):super(Net, self).__init__()self.hid1 = T.nn.Linear(2, 100)  # 2-(100-100-100-100)-1self.hid2 = T.nn.Linear(100, 100)self.hid3 = T.nn.Linear(100, 100)self.hid4 = T.nn.Linear(100, 100)self.oupt = T.nn.Linear(100, 1)T.nn.init.xavier_uniform_(self.hid1.weight)  # glorotT.nn.init.zeros_(self.hid1.bias)T.nn.init.xavier_uniform_(self.hid2.weight)  # glorotT.nn.init.zeros_(self.hid2.bias)T.nn.init.xavier_uniform_(self.hid3.weight)  # glorotT.nn.init.zeros_(self.hid3.bias)T.nn.init.xavier_uniform_(self.hid4.weight)  # glorotT.nn.init.zeros_(self.hid4.bias)T.nn.init.xavier_uniform_(self.oupt.weight)  # glorotT.nn.init.zeros_(self.oupt.bias)def forward(self, x):z = T.tanh(self.hid1(x))  # or T.nn.Tanh()z = T.tanh(self.hid2(z))z = T.tanh(self.hid3(z))z = T.tanh(self.hid4(z))z = self.oupt(z)          # no activationreturn z# ----------------------------------------------------------def main():# 0. make training data filenp.random.seed(1)T.manual_seed(1)hi = 0.9; lo = 0.1train_f = open("area_train.txt", "w")for i in range(10000):base = (hi - lo) * np.random.random() + loheight = (hi - lo) * np.random.random() + loarea = 0.5 * base * heights = "%0.5f, %0.5f, %0.5f \n" % (base, height, area)train_f.write(s)train_f.close()# 1. create Dataset and DataLoader objectsprint("Creating Triangle Area train DataLoader ")train_file = ".\\area_train.txt"train_ds = TriangleDataset(train_file)  # all rowsbat_size = 10train_ldr = T.utils.data.DataLoader(train_ds,batch_size=bat_size, shuffle=True)# 2. create neural networkprint("Creating 2-(100-100-100-100)-1 regression NN ")net = Net()# 3. train networkprint("\nPreparing training")net = net.train()  # set training modelrn_rate = 0.01loss_func = T.nn.MSELoss()optimizer = T.optim.SGD(net.parameters(),lr=lrn_rate)max_epochs = 1000ep_log_interval = 100print("Loss function: " + str(loss_func))print("Optimizer: SGD")print("Learn rate: 0.01")print("Batch size: 10")print("Max epochs: " + str(max_epochs))print("\nStarting training")for epoch in range(0, max_epochs):epoch_loss = 0.0            # for one full epochepoch_loss_custom = 0.0num_lines_read = 0for (batch_idx, batch) in enumerate(train_ldr):X = batch['base_ht']  # [10,4]  base, height inputsY = batch['area']     # [10,1]  correct area to predictoptimizer.zero_grad()oupt = net(X)            # [10,1]  computed loss_obj = loss_func(oupt, Y)  # a tensorepoch_loss += loss_obj.item()  # accumulateloss_obj.backward()optimizer.step()if epoch % ep_log_interval == 0:print("epoch = %4d   loss = %0.4f" % \(epoch, epoch_loss))print("Done ")# 4. evaluate modelnet = net.eval()(acc10, acc05, acc01) = accuracy(net, train_ds)print("\nAccuracy (.10) on train data = %0.2f%%" % \(acc10 * 100))print("\nAccuracy (.05) on train data = %0.2f%%" % \(acc05 * 100))print("\nAccuracy (.01) on train data = %0.2f%%" % \(acc01 * 100))if __name__ == "__main__":main()

原文链接:用神经网络预测三角形面积 - BimAnt


http://www.ppmy.cn/devtools/42547.html

相关文章

贴片 RS8752XK 封装SOP-8 250MHz,2通道高速运放

传感器信号放大&#xff1a;在传感器应用中&#xff0c;RS8752XK可以用于放大微弱的传感信号&#xff0c;如压力、温度、光强等传感器的信号。 数据采集系统&#xff1a;在数据采集设备中&#xff0c;RS8752XK可以用于放大和调理模拟信号&#xff0c;以供模数转换器&#xff0…

云WAF:企业网络安全的新标杆

随着互联网技术的飞速发展&#xff0c;Web应用已成为企业与用户交互的重要平台。然而&#xff0c;随之而来的网络安全威胁也日益复杂&#xff0c;如何有效地保护Web应用免受各种攻击&#xff0c;已成为企业面临的重大挑战。云WAF&#xff08;Web应用防火墙&#xff09;作为一种…

C++三剑客之std::any(二) : 源码剖析

目录 1.引言 2.std::any的存储分析 3._Any_big_RTTI与_Any_small_RTTI 4.std::any的构造函数 4.1.从std::any构造 4.2.可变参数模板构造函数 4.3.赋值构造与emplace函数 5.reset函数 6._Cast函数 7.make_any模版函数 8.std::any_cast函数 9.总结 1.引言 C三剑客之s…

基于百度千帆的大模型应用:英文助教Alex

基于百度千帆的大模型应用&#xff1a;英文助教Alex 立项说明&#xff1a;英文助教Alex -ver1:1 Alex基本信息1.1 提示词编写1.2 应用发布 2 功能测试&#xff1a;2.1 英文对话&#xff1a;英文输出2.2英文对话&#xff1a;英文输入&#xff1a;2.3 英文作文智能批改&#xff1…

【GDAL】GDAL库学习(C#版本)

1.GDAL 2.VS2022配置GDAL环境&#xff08;C#&#xff09; VS2022工具–NuGet包管理器–管理解决方案的NuGet程序包&#xff0c;直接安装GDAL包。 并且直接用应用到当前的控制台程序中。 找一张tiff格式的图片&#xff0c;或者用格式转换网站&#xff1a;https://www.zamzar.c…

UniApp中,在页面显示时触发子组件的重新渲染

在UniApp中&#xff0c;要在页面显示时触发子组件的重新渲染&#xff0c;可以利用生命周期钩子函数来实现。具体来说&#xff0c;可以在页面的onShow生命周期钩子中调用子组件的方法或者改变子组件的props&#xff0c;从而触发子组件的重新渲染。 首先&#xff0c;确保子组件有…

我用通义千问做了个银从初级法规考试答题AI助手

我用通义千问做了个银从初级法规考试答题AI助手 起因方法&#xff1a;创建方法&#xff1a;微调成果展示 起因 多选考试实在太难了&#xff0c;惨不忍睹的正确率&#xff0c;博主我就想有一个专门刷多选的工具&#xff0c;但找了半天没找到。然后就想到用通义试试&#xff0c;…

Java如果系统要使用超大整数(超过long长度范围)请设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)

要设计一个数据结构来存储超过long长度范围的超大整数&#xff08;也称为大数或高精度数&#xff09;&#xff0c;我们可以使用数组来模拟多位数的表示。通常&#xff0c;我们会选择一个固定大小的整数类型&#xff08;如int或short&#xff09;来作为数组的每个元素&#xff0…