设置密集层以从一维数组中学习

Posted

技术标签:

【中文标题】设置密集层以从一维数组中学习【英文标题】:Setup dense layers to learn from 1D arrays 【发布时间】:2020-02-25 16:54:55 【问题描述】:

我有大约 100k 个大小为 256 的数组,我想将它们输入到由几个密集层组成的神经网络中,并输出 100k 个大小为 256 的数组。(我希望我的网络将输入数组转换为输出数组)。我无法正确设置它。

我的X_trainy_train 的形状为(98304, 256),我的X_testy_test (16384, 256)

我现在的网络是

model = Sequential()
model.add(Dense(1, input_shape=(256,), activation='relu'))
model.add(Dense(1024, activation='relu'))
model.add(Dense(512, activation='relu'))
model.add(Dense(1024, activation='relu'))
model.add(Dense(256, activation='linear'))

optimizer = Adam()
model.compile(optimizer=optimizer,loss='mean_squared_error',metrics=['accuracy', 'mae'])

网络实际运行,但没有给出任何有意义的结果。它在 20 个 epoch 后停止,因为我给它提早停止。

Epoch 00019: val_loss did not improve from -inf
Epoch 20/200
6400/6400 [==============================] - 1s 232us/step - loss: nan - acc: 0.2511 - mean_absolute_error: nan - val_loss: nan - val_acc: 0.2000 - val_mean_absolute_error: nan

如果我尝试用它来预测,我只会得到 nan 值(我的训练集中没有任何 nan)。

希望有人可以帮助我。提前致谢。

编辑 为了检查输入或算法是否有问题,我尝试使用以下代码创建输入和目标

X_train=[]
y_train=[]

for it in range(1000):
    beginning=random.uniform(0,1)
    end=random.uniform(0,1)
    X_train.append([beginning+(end-beginning)*jt/256 for jt in range(256)])
    y_train.append([end+(beginning-end)*jt/256 for jt in range(256)])
X_train=np.array(X_train)
y_train=np.array(y_train)

我还是得到了

Epoch 27/200
1000/1000 [==============================] - 0s 236us/step - loss: nan - acc: 0.4970 - mean_absolute_error: nan

Edit2:如果我增加网络的复杂性,我会设法获得与使用上述函数创建的 10k 训练数组的 nan 不同的损失。但是,结果仍然很糟糕,这让我怀疑我没有正确设置网络。

新网络:

model = Sequential()
model.add(Dense(1, input_shape=(256,), activation='relu'))
model.add(Dense(2048, activation='relu'))
model.add(Dense(2048, activation='relu'))
model.add(Dense(2048, activation='relu'))
model.add(Dense(256, activation='linear'))

optimizer = Adam()
model.compile(optimizer=optimizer,loss='mean_squared_error',metrics=['mae'])

model.summary()

以及它们收敛时的结果

Epoch 33/200
10000/10000 [==============================] - 23s 2ms/step - loss: 0.0561 - mean_absolute_error: 0.2001 - val_loss: 0.0561 - val_mean_absolute_error: 0.2001

如果我检查网络的输出,无论输入如何,我总是会得到一个所有点都在 0.5 左右的向量。

另外,如果我尝试使用 y_pred=model.predict(Xval[3]) 预测单个向量,我会得到错误

ValueError: Error when checking : expected dense_27_input to have shape (256,) but got array with shape (1,)

【问题讨论】:

您是否标准化了您的训练数据? 嗨@BlackBear,是的,训练和测试数据都归一化为0到1。 输入和输出都应该标准化。您确定数据中没有nan 吗? @BlackBear 是的,输入和输出都已标准化,数据中没有 nan。为了检查数据或设置是否有问题,我尝试使用 Xtmp=[beginning+(end-beginning)*jt/256 for jt in range(256)]ytmp=[end+(beginning-end)*jt/256 for jt in range(256)] 类型的输入和输出,其中开始和结束在 0 和 1 之间随机选择,但我仍然得到 nan 值来自网络 【参考方案1】:

您的第一层只有1 输出神经元,这似乎是错误的。它可能会弄乱你的损失函数。尝试将model.add(Dense(1, input_shape=(256,), activation='relu')) 替换为model.add(InputLayer(input_shape=(256,)))

【讨论】:

您好 Frederik,感谢您的评论。如果我尝试这样做,我会收到以下错误消息The added layer must be an instance of class Layer. Found: Tensor("input_4:0", shape=(None, 256), dtype=float32),使用 Keras 版本 2.3.1 tf.keras.layers.InputLayer 而不是 tf.keras.layers.Input,我的错误:D 我更新了我的答案。 嗨 Frederik,非常感谢,这解决了我上面显示的简单示例的问题。我只需要使用 input_shape 而不是 shape,我已经修改了您的答案,以防将来有人需要它。然而,使用我的真实数据集,我仍然得到nan 值作为网络的输出。我想在这一点上可能是因为这是一个更难学习的问题?您有任何可以提供帮助的 cmets 吗?再次感谢:) 不,可能是您的数据,但可能很多。检查数据集中是否有 nan 值。 print(np.min(X_train), np.min(y_train), np.max(X_train), np.max(y_train), X_train.dtype, y_train.dtype, X_train.shape, y_train.shape) 给你什么?这可能会导致一些线索。 这确实是我的数据,我有一些 nan 在处理数据集的过程中我没有设法删除。现在可以了。非常感谢您的帮助,这是金子

以上是关于设置密集层以从一维数组中学习的主要内容,如果未能解决你的问题,请参考以下文章

如何重塑我的输入以将其输入一维卷积层以进行序列分类?

如何在C中将数组的一维设置为零

c++学到一维数组了怎么在cout里保留两位小数?

怎么样给一个一维数组全赋成false

你可以从两个 np.float 一维数组创建一个 np.complex128 一维数组而不复制吗?

第五章学习小结