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

标签 tensorflow machine-learning keras neural-network deep-learning

我有一个描述二维曲线的方程。该方程有 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/

相关文章:

tensorflow - cudnn 在 TensorFlow 中编译配置

machine-learning - 加快 sklearn 中的网格搜索速度

python - ValueError : Error when checking input: expected gru_5_input to have shape (None, None, 10) 但得到形状为 (1, 4, 1) 的数组

python-3.x - Keras.fit_generator 需要更多时间用于纪元

TensorFlow:我的(广义)骰子损失实现有什么问题?

python - Tensorflow 多维零插入上采样

machine-learning - 使用 Sklearn 进行多标签分类

python - 有没有办法在 Keras Conv2D() 函数中设置音频数据输入矩阵的总文件数?

python - 从张量中随机移除

machine-learning - 具有非整数特征值的逻辑回归