设置密集层以从一维数组中学习
Posted
技术标签:
【中文标题】设置密集层以从一维数组中学习【英文标题】:Setup dense layers to learn from 1D arrays 【发布时间】:2020-02-25 16:54:55 【问题描述】:我有大约 100k 个大小为 256 的数组,我想将它们输入到由几个密集层组成的神经网络中,并输出 100k 个大小为 256 的数组。(我希望我的网络将输入数组转换为输出数组)。我无法正确设置它。
我的X_train
和y_train
的形状为(98304, 256)
,我的X_test
和y_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
在处理数据集的过程中我没有设法删除。现在可以了。非常感谢您的帮助,这是金子以上是关于设置密集层以从一维数组中学习的主要内容,如果未能解决你的问题,请参考以下文章