【问题标题】:Why does Keras crash when I feed a 1D list as input?当我输入一维列表作为输入时,为什么 Keras 会崩溃?
【发布时间】:2019-05-31 21:06:18
【问题描述】:

我刚刚开始使用 Keras,所以我想尝试制作我能想到的最简单的回归问题,作为一种 Hello World。

我正在尝试训练一个输出双倍输入的模型。我想一个没有激活函数的具有两个节点(1 个输入 1 个输出)的网络应该可以解决问题。权重应该简单地收敛到 2。

这是我的代码:

layers = keras.layers

# Feed forward structure
model = keras.Sequential()

model.add(layers.Dense(1))

model.add(layers.Dense(1))

model.compile(optimizer=tf.train.AdamOptimizer(0.01),
              loss='mae',
              metrics=['mae'])


train_data = np.asarray([x for x in range(100)])
train_labels = np.asarray([x * 2 for x in train_data])


model.fit(train_data, train_labels, epochs=50, batch_size=32)

但是,当我向它提供一维 numpy 数组时,它会崩溃并出现以下错误:

ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.

如果我在train_data 中添加多余的括号,它会编译(不收敛):

train_data = np.asarray([[x for x in range(100)]])

Epoch 50/50

1/1 [==============================] - 0s 705us/step - loss: 50.0463 - mean_absolute_error: 50.0463

【问题讨论】:

    标签: python tensorflow machine-learning keras linear-regression


    【解决方案1】:

    如果您给模型一个数字,每个输入样本的形状必须为(1,)。因此,所有 100 个输入样本都将具有 (100,1) 的形状。因此,您需要使输入数据的形状和标签与预期一致:

    train_data = train_data.reshape(100,1)  # 100 samples of shape 1
    
    # you may not need to do the following necessarily
    train_labels = train_labels.reshape(100,1)  # 100 labels of shape 1
    
    # alternative way using np.expand_dims
    train_data = np.expand_dims(train_data, axis=-1)
    

    旁注:

    1. 您的模型有两个 Dense 层。根据您提供的描述,我认为您只需要一个具有一个 Dense 层的模型,该模型具有一个单元(即删除其中一个 Dense 层)。

    2. 当您将数据放在另一个列表中时,如下所示:

      train_data = np.asarray([[x for x in range(100)]])
      

      它将变成形状为 (1,100) 的二维数组,这意味着 一个 形状为 (100,) 的样本,这不是您想要的。

    【讨论】:

    • 谢谢,现在明白了!我会尽快测试一下。顺便说一句,你的名字真棒,让我一时糊涂。
    • 我不知道为什么我应该删除一个层,这不会给我留下一个节点并且没有连接/权重吗?还是默认情况下已经有一个输入大小的额外层?
    • @AlexP。当你写Dense(1) 时,这意味着有一个神经元连接到其他一些神经元,因此有一些与之相关的权重。在 Keras 中总是有一个输入层,要么由您使用Functional API 显式创建,要么由 Keras 在使用 Sequential API 时隐式创建。顺便说一句,感谢您对我的用户名的客气话!
    猜你喜欢
    • 2012-01-01
    • 2012-10-28
    • 2014-01-04
    • 2023-02-01
    • 2012-08-07
    • 1970-01-01
    • 2020-06-07
    • 2012-05-25
    • 1970-01-01
    相关资源
    最近更新 更多