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

Setup dense layers to learn from 1D arrays

我有大约 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 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,)

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