我想用神经网络拟合一个阿基米德螺旋线,我用chatgpt 生成了一段,但是我运行不起来,这是它如下的生成内容,请问我怎么科学的放到pycharm里让它运行起来?貌似有主程序,和训练数据集辅助程序,训练数据集里面又分的好几个环节,它们都个写在一个文件里吗,谁前谁后?我是初学者,谢谢!
好的,以下是使用Python编写一个简单的神经网络算法代码来拟合出一段曲线参数方程:
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值
x_, y_ = target_curve(t_value)
noise_x, noise_y = (np.random.randn() / 50), (np.random.randn() / 50) # 添加少量噪声
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)}")
解释:
tf.estimator.LinearRegressor
是TF提供的一个用于构建线性回归模型的API。将我们训练数据中得到的所有输入(一组t-values
)作为特征传入和每个相应输出值(即点(x,y)
坐标)进行训练。
首先定义目标曲线 target_curve()
,由两部分构成: x方程: $y = 9.4 \cdot t \cdot sin(t)$ 和 y 方程:$y= 9.4 \cdot t\cdot cos(t)$
然后使用 'generate_data' 函数产生随机采样出来了100个样本,对这些随机采样结果加上少量噪声以避免过度学习或缺失泛化表现。
设置迭代次数 num_epochs 批量大小 batch_size ,导入数据集中的所有输入和输出值。最后,利用TF构建神经网络模型并开始训练;
当模型完成训练之后,在新范围内创建一个均匀分布上的t向量,并使用在阿基米德螺线目标曲形学习过程中所拟合出来的方程从头到尾计算这个函数,在此期间不会调整任何其余权重。
输出结果将包含该点关于theta
t 的表达式项($p(x)=下面是一个用Python编写的基于神经网络算法拟合阿基米德螺旋线方程的参数:
首先,我们需要加载所需的库和数据集。这里我们使用matplotlib生成螺旋线数据进行训练和测试。可以通过以下代码安装与引入matplotlib库:
!pip install matplotlib
import matplotlib.pyplot as plt
同时还需要导入一些其他必要的工具包来辅助模型搭建及训练:
import numpy as np # 引用数值计算相关工具库
from tensorflow import keras # 引用高级API Keras实现深度学习框架TensorFlow核心组件
from sklearn.model_selection import train_test_split # 划分独立/因变量样本为训练集、验证集
接下来定义我们将要输入到神经网络中训练并预测曲线时使用的一系列参数。
# 定义常量 设置超参 优化目标等设置
params = {
"batch_size": 64, # 批次大小
"epochs": 1000, # 让神经网络根据给定数据源反复迭代调整权值以提升精确度(epoch)
"validation_split" : .2 ##该比例将被保留,不会被验证或修改,并且在每个周期之前动态随机更改
}
optimizers = {
1: "SGD", # sgd优化器 梯度下降法
2 : 'Adam', # Adam-自适应矩估计方法
}
parameters= {
"function" : {"step":0.25, ## 离散值步长
},
}
在定义好后,载入数据集并设置训练样本。
# 对原始螺线进行预处理以引进ML模型为输入和输出
theta_max = 8 * np.pi ## 常量 设定θ的偏移量
resolution = int(15 * theta_max / (2*np.pi))
radii=np.linspace(0.5 ,6,resolution)
xs=[] # 构建基于离散精度的螺旋坐标系 维度X:longitudinal angle θ
ys=[] # 维度Y : radial distance r
for radius in radii:
for i_step in range(int(radius*100)):
xs.append((radius/10)*np.cos(i_step/resolution))
ys.append((radius/10)*np.sin(i_step/resolution))
## 执行切分测试、验证集
xs=np.array(xs)
ys=np.array(ys)
x_train,x_test,y_train,y_test=train_test_split([xs],[ys],test_size=params['validation_split'],random_state=None)
print(x_train.shape)
input_shape=x_train[0].shape
plots=range(resolution//4,len(radii),int(resolution/(4+3)))
之后开始构建我们将要使用的神经网络。这里实现的是一个简单的两层神经网络,其中第一层使用ReLU激活函数,输出尺寸为128;第二个隐藏层则连接全链接,并通过线性回归。
## 构建model以完成数据拟合任务:
def create_model():
model = keras.Sequential([
keras.layers.Dense(128, input_shape=input_shape), # 第1隐含层: 以下是一个简单的 Python 代码,使用 TensorFlow 库来实现神经网络算法拟合阿基米德螺旋线方程:
```python
import numpy as np
import tensorflow as tf
# 设置训练数据集
theta = np.linspace(0,10*np.pi,10000)
r = theta + 5 * np.random.randn(len(theta))
x_train = r * np.cos(theta)
y_train = r * np.sin(theta)
# 定义模型结构(这里设置两层全连接层)
model=tf.keras.Sequential([
tf.keras.layers.Dense(units=32,input_shape=(1,),activation='relu'),
tf.keras.layers.Dense(units=64, activation='relu'),
tf.keras.layers.Dense(units=2) # 最后一层不需激活函数,输出曲线参数 x 和 y 坐标
])
# 模型编译设置:优化器为adam、损失函数为mse(mean_squared_error),评估指标使用mae(mean_absolute_error)
model.compile(optimizer='adam', loss='mse', metrics=['mae'])
# 训练模型并记录指标信息(epochs表示迭代次数)
history=model.fit(x_train,y_train,batch_size=50, epochs=1000)
# 使用训练好的模型预测新曲线上每个点坐标值,并画图展示出来。
theta_new=np.linspace(0,np.pi*20,num=int(np.pi*20/np.min(abs(np.diff(theta))))+1)
r_new=model.predict(r_new.reshape((-1,1)))
x_predict=r_pred[:,0]*np.cos(theta_new)+r_pred[:,1]*np.sin(theta_new)
y_predict=r_pred[:,1]*np.cos(theta_new)+r_pred[:,0]*np.sin(theta_new)
plt.plot(x_train,y_train,'b')
plt.plot(x_predict,y_predict,'r--',linewidth=2.5,label='predict curve')
在该代码中,使用 np.linspace 函数生成 range(0, 10*np.pi)之间的10000个点数据(x值),然后通过阿基米德螺旋线方程 r = θ + noise 来计算每个 x 对应的 y 值。接着定义了一个具有两层全连接层结构的神经网络模型,并进行训练以拟合出曲线参数 x 和 y 的函数关系。最后,更新theta为新的取值范围,在训练好的神经网络上预测新曲线上每一个点坐标,并将结果展示。
Note: 在此 Markdown 内容中无法运行 Python 代码,请到自己电脑打开 IDE 进行测试或者使用在线 notebook 工具如 Colab (需要 GTP-3 API)。
用chatgpt 生成了一段代码,请问我怎么科学的放到pycharm里让它运行起来?谢谢!
你不知道chatgpt可以继续追问的么?既然是他提供的代码,你可以继续问啊
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!