神经网络拟合一个阿基米德螺旋线

请问 我想用神经网络拟合一个阿基米德螺旋线,下面是原代码,但是出现错误了 ,请问怎么改?谢谢!
原代码:

import numpy as np
import tensorflow as tf

# 设定阿基米德螺旋线(9.4*t*cos(t), 9.4*t*sin(t))为目标曲线
def target_curve(t):
    return [9.4 * t * np.cos(t), 9.4 * t * np.sin(t)] # 返回一个元组


# 训练数据生成函数:随机产生1000个点并分别计算其坐标值以及对应的t值(作为输入)
def generate_data(num_samples=1000):
    xs = []
    ys = []
    ts = []

    for _ in range(num_samples):
        t_value = (np.random.rand() - 0.5) * 20  # 随机选择[-10,10]之间的t值. numpy.random.rand(d0, d1, …, dn)的随机样本位于[0, 1)中:本函数可以返回一个或一组服从**“0~1”均匀分布**的随机样本值。
        x_, y_ = target_curve(t_value) # 给元组赋值一一对应
        noise_x, noise_y = (np.random.randn() / 50), (np.random.randn() / 50)  # 添加少量噪声 numpy.random.randn(d0, d1, …, dn)是从标准正态分布中返回一个或多个样本值。

        xs.append(x_ + noise_x)
        ys.append(y_ + noise_y)

        ts.append([t_value])

    return {'inputs': ts, 'outputs': [xs, ys]}


training_data_set_size = 50000
num_epochs = 200
batch_size = 128

train_input_fn = tf.estimator.inputs.numpy_input_fn(generate_data(training_data_set_size)['inputs'], y=None,
                                                    batch_size=batch_size, num_epochs=num_epochs, shuffle=True)

feature_columns = [tf.feature_column.numeric_column('x')] # 参数给出了神经网络输入层需要用到的数据

model_dir = './trained_models/model/'
estimator = tf.estimator.LinearRegressor(feature_columns=feature_columns, model_dir=model_dir)

estimator.train(train_input_fn, steps=None)

t = np.linspace(0, np.pi * 10, 100) # 给了个数列
predict_input_fn = tf.estimator.inputs.numpy_input_fn({'x': np.expand_dims(t, -1)}, shuffle=False)
result = [pred['predictions'] for pred in estimator.predict(predict_input_fn)]

print("阿基米德曲线公式:r=a·θ")
print(f"其中a={9.4}")
# 输出生成的拟合参数
print(f"p(x)={round(estimator.get_variable_value('linear/linear_model/x/weights')[0][0], 2)}t",
      f"+{round(estimator.get_variable_value('linear/linear_model/bias_weights')[0], 2)}")

显示的错误位置和原因:

Traceback (most recent call last):
  File "D:\copy-teaching\Software Application\pythonProject2\main.py", line 32, in <module>
    train_input_fn = tf.estimator.inputs.numpy_input_fn(generate_data(training_data_set_size)['inputs'], y=None,
  File "C:\Users\LENOVO\AppData\Local\Programs\Python\Python39\lib\site-packages\tensorflow\python\util\lazy_loader.py", line 59, in __getattr__
    return getattr(module, item)
AttributeError: module 'tensorflow_estimator.python.estimator.api._v2.estimator' has no attribute 'inputs'

请问怎么改?谢谢!

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/210232
  • 这篇博客你也可以参考下:【论文分享】通过图神经网络明确捕捉实体提及的关系,用于特定领域的命名实体识别
  • 除此之外, 这篇博客: 神经网络面试题-1中的 7. 下图显示,当开始训练时,误差一直很高,这是因为神经网络在往全局最小值前进之前一直被卡在局部最小值里。为了避免这种情况,我们可以采取下面哪种策略? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在这里插入图片描述
    A 改变学习速率,比如一开始的几个训练周期不断更改学习速率
    B 一开始将学习速率减小10倍,然后用动量项(momentum)
    C 增加参数数目,这样神经网络就不会卡在局部最优处
    D 其他都不对

    正确答案是:A, 您的选择是:A
    解析:选项A可以将陷于局部最小值的神经网络提取出来。

  • 您还可以看一下 朱丽静老师的前端开发宝典课程中的 8分钟掌握代码输入神器小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    作为一名资深的IT专家,我认为用神经网络拟合阿基米德螺旋线需要以下步骤:

    1.准备数据集。制作一批数据集,包括阿基米德螺旋线的坐标和参数值。可以使用Python中的numpy库生成数据。

    2.设计模型。选择适当的神经网络模型,并根据数据集的特点进行相应的调整。可以采用tensorflow或pytorch等框架。

    3.训练模型。使用准备好的数据集对模型进行训练,以使模型能够精确地拟合给定的数据。在这个过程中可以调整模型的参数,以提高模型的训练效果。

    4.测试模型。使用测试数据集检验模型的准确性和稳定性。可以采用交叉验证的方法来进行测试。

    关于出现的错误,需要看到具体错误信息才能给出具体的修复方法。但通常可能的问题涉及到模型的参数设置、数据准备和输入数据格式等。在排除了这些问题后,可以使用逐步调试的方法来解决问题。此之外,还需要注意模型训练的过程,如常见的过拟合问题。可以在模型训练时使用正则化和dropout等技巧来避免过拟合。

    以下是一个简单的Python代码示例,用于实现简单的阿基米德螺旋线拟合:

    import numpy as np
    import matplotlib.pyplot as plt
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense
    
    # 准备数据集
    theta = np.linspace(0, 10*np.pi, 1000)
    x = theta*np.cos(theta)
    y = theta*np.sin(theta)
    dataset = np.array([x,y]).T
    
    # 创建模型
    model = Sequential([
        Dense(64, input_dim=2, activation='relu'),
        Dense(64, activation='relu'),
        Dense(2)
    ])
    
    # 训练模型
    model.compile(loss='mean_squared_error', optimizer='adam')
    model.fit(dataset, dataset, epochs=100, verbose=1)
    
    # 测试模型
    test_x = np.linspace(0, 20*np.pi, 1000)
    test_y = model.predict(np.array([test_x*np.cos(test_x), test_x*np.sin(test_x)]).T)
    
    # 绘制拟合结果
    plt.plot(x, y, label='original')
    plt.plot(test_y[:,0], test_y[:,1], label='fitting')
    plt.legend()
    plt.show()
    

    这段代码使用两个隐藏层的感知机模型来拟合阿基米德螺旋线,并使用MSE损失函数来训练模型。通过100轮的训练后,模型可以较好地拟合输入数据,并在测试数据上获得良好的准确性。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632