Настройка плотных слоев для изучения из 1D массивов - PullRequest
1 голос
/ 25 февраля 2020

У меня есть около 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 независимо от ввода.

Prediction Example

Кроме того, если я пытаюсь предсказать один вектор, используя 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 Ответ

1 голос
/ 26 февраля 2020

Ваш первый слой имеет только 1 выходной нейрон, это кажется неправильным. Это может испортить вашу функцию потери. Попробуйте заменить model.add(Dense(1, input_shape=(256,), activation='relu')) на model.add(InputLayer(input_shape=(256,))).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...