gpt4 book ai didi

tensorflow - 如何使用 keras/tensorflow 发现方程变量的值?

转载 作者:行者123 更新时间:2023-11-30 08:48:19 25 4
gpt4 key购买 nike

我有一个描述二维曲线的方程。该方程有 5 个变量。如何使用 keras/tensorflow 发现一组数据的值?是否可以?有人知道类似的教程吗?

我生成了一些数据来训练具有以下格式的网络:样本 => [150, 66, 2] 150 组 66*2 数据类似于“时间”x“加速度”目标 => [150, 5] 150 组,5 个变量。

Obs:我知道变量的范围。我也知道,150组数据样本太少了,但是我需要在代码工作之后用实验数据训练一个新的网络,这也是有限的。从视觉上看,曲线很简单,它在开始处有一个下降的线性部分,在结束时它“像指数一样”下降。

我的代码如下:

def build_model():
model = models.Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(66*2,)))
model.add(layers.Dense(5, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['mae'])
return model

def smooth_curve(points, factor=0.9):
[...]
return smoothed_points

#load the generated data
train_data = np.load('samples00.npy')
test_data = np.load('samples00.npy')
train_targets = np.load('labels00.npy')
test_targets = np.load('labels00.npy')

#normalizing the data
mean = train_data.mean()
train_data -= mean
std = train_data.std()
train_data /= std
test_data -= mean
test_data /= std

#k-fold validation:
k = 3
num_val_samples = len(train_data)//k
num_epochs = 100
all_mae_histories = []

for i in range(k):
val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples]
val_targets = train_targets[i * num_val_samples: (i + 1) * num_val_samples]

partial_train_data = np.concatenate(
[train_data[:i * num_val_samples],
train_data[(i + 1) * num_val_samples:]],
axis=0)

partial_train_targets = np.concatenate(
[train_targets[:i * num_val_samples],
train_targets[(i + 1) * num_val_samples:]],
axis=0)

model = build_model()

#reshape the data to get the format (100, 66*2)
partial_train_data = partial_train_data.reshape(100, 66 * 2)
val_data = val_data.reshape(50, 66 * 2)

history = model.fit(partial_train_data,
partial_train_targets,
validation_data = (val_data, val_targets),
epochs = num_epochs,
batch_size = 1,
verbose = 1)

mae_history = history.history['val_mean_absolute_error']
all_mae_histories.append(mae_history)

average_mae_history = [
np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)]

smooth_mae_history = smooth_curve(average_mae_history[10:])

plt.plot(range(1, len(smooth_mae_history) + 1), smooth_mae_history)
plt.xlabel('Epochs')
plt.ylabel('Validation MAE')
plt.show()

显然,我需要获得尽可能高的准确度,但我得到的“中值绝对误差 (MAE)”约为 96%,这是 Not Acceptable 。

最佳答案

我发现这种方法存在一些基本错误。网络的最后一层有一个 softmax 层。这意味着它将输出 5 个值,总和为 1,并且表现为概率分布。您真正想要预测的是真实数字,或者更确切地说是浮点值(在某些固定精度算术下)。

如果您有一个范围,那么可能使用 sigmoid 并重新缩放最后一层来匹配该范围(只需乘以最大值)会对您有所帮助。默认情况下,sigmoid 将确保您获得 0 到 1 之间的 5 个数字。

另一件事应该是消除交叉熵损失并使用像 RMS 这样的损失,以便你可以很好地预测你的数字。您还可以使用一维卷积而不是使用全连接层。

这里已经做了一些工作:https://julialang.org/blog/2017/10/gsoc-NeuralNetDiffEq它试图解决 DE,并且可能与您的工作相关。

关于tensorflow - 如何使用 keras/tensorflow 发现方程变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55861078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com