У меня есть около 100k массивов размером 256, которые я хотел бы ввести в нейронную сеть, состоящую из нескольких плотных слоев, и вывести 100k массивов снова размером 256. (Мне бы хотелось, чтобы мой net преобразовал входной массив в выходной массив). Мне не удается настроить его правильно.
Мои 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 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
И если я попытаюсь использовать его для прогнозирования, я получу только значения нанов (у меня нет нанов в моем тренировочном наборе).
Надеюсь, кто-то может мне помочь с этим , Заранее спасибо.
Редактировать Чтобы проверить, есть ли проблема со входами или алгоритмом, я попытался создать свои входы и цели, используя следующий код
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 : если я увеличу сложность своей сети, мне удастся получить потери, отличные от nan, используя обучающие массивы 10k, созданные с использованием приведенной выше функции. Тем не менее, результаты все еще довольно плохие, что заставляет меня задуматься, что я неправильно настраиваю сеть.
Новая сеть:
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,)