Ожидаемая форма вывода слоя Keras Dense с 300 единицами: (1,) - PullRequest
0 голосов
/ 03 сентября 2018

Я хочу иметь простой однослойный NN, который преобразует вектор из 300 чисел в другой вектор из 300 чисел.

Итак, имея:

print(np.array(train_in).shape)
print(np.array(train_t).shape)

возврат:

(943, 300)
(943, 300)

Я пробую следующее:

model = keras.Sequential()
model.add(Dense(300, input_shape=(300,)))
model.compile(optimizer=tf.train.AdamOptimizer(), 
          loss='sparse_categorical_crossentropy',
          metrics=['accuracy'])
model.fit(np.array(train_in), np.array(train_t), epochs=5)

Я получаю:

ValueError: Error when checking target: expected dense_37 to have shape (1,) but got array with shape (300,)

Почему цель должна иметь форму (1,)? Слой с 300 единицами должен давать вектор 300 чисел на выходе, верно?

Edit:

В соответствии с просьбой, мои данные выглядят так:

print(np.array(train_in))
print(np.array(train_t))

дает:

[[-0.13841234  0.22157902  0.12244826 ... -0.10154381 -0.01824803
  -0.08607237]
 [ 0.02228635  0.3353927   0.05389142 ... -0.23218463 -0.06550601
   0.03365546]
 [ 0.22719774  0.25478157 -0.02882686 ... -0.36675575 -0.14722016
  -0.22856475]
 ...
 [ 0.07122967  0.07579704  0.2376182  ... -0.5245226  -0.38911286
  -0.5513026 ]
 [-0.05494669 -0.3587228   0.13438214 ... -0.6134821  -0.06194036
  -0.46365416]
 [-0.16560836 -0.15729778  0.00067104 ... -0.01925305 -0.3984945
   0.12297624]]
[[-0.20293862  0.27669927  0.19337481 ... -0.14366734  0.06025359
  -0.1156549 ]
 [-0.02273261  0.20943424  0.26937988 ... -0.20701817 -0.03191033
   0.03741883]
 [ 0.16326293  0.19438037  0.12544776 ... -0.37406632 -0.1527986
  -0.29249507]
 ...
 [ 0.05573128  0.26873755  0.40287578 ... -0.65253705 -0.30244952
  -0.68772614]
 [-0.02555208 -0.0485841   0.19109009 ... -0.2797842  -0.01007691
  -0.53623134]
 [-0.30828896  0.04836991 -0.108813   ... -0.20583114 -0.40019956
   0.11540392]]

1 Ответ

0 голосов
/ 03 сентября 2018

Проблема заключается в вашей потере, разреженная категориальная кросс-энтропия в этом случае не имеет смысла, так как она используется для классификации, а у вас, похоже, нет проблемы классификации. Чтобы выполнить регрессию 300-мерного вектора, тогда имеет смысл использовать среднеквадратическую ошибку.

Проблема с использованием разреженной категориальной кросс-энтропии состоит в том, что эта потеря делает предположение, что модель выдает скаляр (вектор с одним элементом), и это проверяется во время выполнения, и эта проверка завершается неудачно, и поэтому вы получаете ошибку .

Кроме того, точность не имеет смысла в настройке регрессии.

model.compile(optimizer=tf.train.AdamOptimizer(), 
          loss='mean_squared_error')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...