问题
I am trying to make an AutoEncoder and am stuck at the above error. Looking at other posts with this on Stack Exchange didn't help.
Here is the error in full:
InvalidArgumentError: Can not squeeze dim[1], expected a dimension of 1, got 499
[[{{node metrics_12/acc/Squeeze}}]]
[[{{node ConstantFoldingCtrl/loss_12/time_distributed_6_loss/broadcast_weights/assert_broadcastable/AssertGuard/Switch_0}}]]
I can compile my model. Here it is:
Layer (type) Output Shape Param #
================================================================= lambda_7 (Lambda) (None, 499, 22) 0
_________________________________________________________________ cu_dnnlstm_14 (CuDNNLSTM) (None, 300) 388800
_________________________________________________________________ repeat_vector_12 (RepeatVect (None, 499, 300) 0
_________________________________________________________________ cu_dnnlstm_15 (CuDNNLSTM) (None, 499, 50) 70400
_________________________________________________________________ time_distributed_6 (TimeDist (None, 499, 22) 1122
================================================================= Total params: 460,322 Trainable params: 460,322 Non-trainable params: 0
The lambda layer takes a padded sequence of shape (1,499) and converts it to a onehot with 22 possible values. I then pass this through an encoding CuDNNLSTM, a repeat vector, another CuDNNLSTM and then a time distributed dense layer with a softmax activation.
I use:
model.compile('rmsprop', 'sparse_categorical_crossentropy', metrics=['acc'])
And:
model.fit(s_min_one, s_min_one,
batch_size=batchS,
epochs=epochS,
verbose = 1,
shuffle=True)
Which gives me my error.
I use the sparse categorical so that my data can be in integer format taking on values between 0 and 21 (for the 22 features). And I don't understand why the error expects a dimension of 1 for anything. It is almost as if it wants me to flip my columns and rows?
回答1:
Your issue is related to the shape of the output. sparse_categorical_crossentropy
expects integer targets (see the documentation: "When using the sparse_categorical_crossentropy loss, your targets should be integer targets.")
You are passing data which is of shape (batch_size, 1, 499)
both as the input as well as the labels:
model.fit(s_min_one, s_min_one, ...)
That's not going to work, the labels need to be of shape (batch_size, 1)
or simply (batch_size,)
.
I'm not entirely sure I understand what you are trying to accomplish, but it looks like you need to adapt the loss function accordingly.
来源:https://stackoverflow.com/questions/55203072/can-not-squeeze-dim1-expected-a-dimension-of-1-got-499