【问题标题】:tensorflow keras model for solving simple equation用于求解简单方程的张量流 keras 模型
【发布时间】:2020-07-20 07:59:03
【问题描述】:

我正在尝试了解如何创建一个可以预测简单函数值的简单 tensorflow 2.2 keras 模型:

f(a, b, c, d) = a < b : max(a/2, c/3) : max (b/2, d/3)

我知道这个确切的问题可以简化为一个分类,但我的目的是找到一种建立模型的好方法,该模型可以估计值并在以后越来越复杂的条件下基于该模型构建越来越多的函数在。 首先,我偶然发现了为什么一个简单的函数能这么难。

为了在我创建的模型上使用 tensorflow:

def generate_input(multiplier):
    return np.random.rand(1024 * multiplier, 4) * 1000


def generate_output(input):
    def compute_func(row):
        return max(row[0]/2, row[2]/3) if row[0] < row[1] else max(row[1]/2, row[3]/3)

    return np.apply_along_axis(compute_func, 1, input)


for epochs in range(0, 512):
    # print('Generating data...')
    train_input = generate_input(1000)
    train_output = generate_output(train_input)

    # print('Training...')
    fit_history = model.fit(
        train_input, train_output,
        epochs=1,
        batch_size=1024
    )

我尝试了不同的模型,这些模型更简单或更复杂,但我仍然没有得到很好的转换。 例如一个简单的线性:

input = Input(shape=(4,))
layer = Dense(8, activation=tanh)(input)
layer = Dense(16, activation=tanh)(layer)
layer = Dense(32, activation=tanh)(layer)
layer = Dense(64, activation=tanh)(layer)
layer = Dense(128, activation=tanh)(layer)
layer = Dense(32, activation=tanh)(layer)
layer = Dense(8, activation=tanh)(layer)
output = Dense(1)(layer)

model = Model(inputs=input, outputs=output)
model.compile(optimizer=Adam(), loss=mean_squared_error)

您能否指出解决此类条件函数应遵循的方向?

还是我错过了一些预处理?

【问题讨论】:

  • AFAIK,现在没有人使用 activation=tanh 作为中间层 - relu 及其变体占主导地位。
  • 您的输入似乎在 [0, 1000) 的范围内。尝试对它们进行预处理,或在generate_input 中删除乘以 1000。我在 [0, 1) 中的输入得到了更好的结果。

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


【解决方案1】:
  1. 老实说,你有一个非常深的模型,因此你没有足够的数据来训练。我认为你不需要那么深的架构。

  2. 你的问题定义不是我会做的。您实际上不希望在输出处生成最大值,但您希望选择最大值,对吗?如果是这种情况,我会在我的设计中使用多类分类而不是回归问题。也就是说,我会使用output = Dense(4)(layer,activation=softmax) 作为最后一层,在我的优化器中,我会使用分类交叉熵。当然,在输出生成中,您需要设法返回一个包含 3 个 0 和 1 个 1 的数组,如下所示:

定义计算函数(行):

ret_value=[0,0,0,0]
if row[0] < row[1]:
    if row[0] < row[2]:
        ret_value[2]=1
    else:
        ret_value[0]=1
else:
    if row[1]< row[3]:
        ret_value[3]=1
    else:
        ret_value[1]=1
    
return ret_value

【讨论】:

  • 感谢您的回答! 1. 当然,你可以有一个更简单的模型模型。转换不会更好:) 你可以生成你想要的数据。我在循环中使用它来始终拥有新数据以避免出现 Dropout 层。 2. 我假设我以前不知道这个函数,它的计算方式可能会有很大的不同。我会稍微改变一下问题,以便清楚地表明我没有进行分类。
  • 我完全理解你是否想坚持回归。问题是,为什么你有这么多层次。你真的需要这么深的网络吗?这似乎不是一个很复杂的问题,你在这里处理了将近 12K 的参数。这实际上不仅仅是有足够的数据来训练,而是只有在需要时才从小到大。毕竟这是我的观点,我很想知道你是如何解决这个问题的。祝你好运
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 2018-10-11
  • 2021-01-29
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
相关资源
最近更新 更多