我正在尝试构建一种用于预测具有3个不同类/标签的对象的体系结构。在学习数据之前,我尝试过一种热编码。 这是数据的形状:
X train X test Y train Y test
(585, 24) (195, 24) (585, 3) (195, 3)
但是它总是给我这个错误:
ValueError: Shapes (None, 3) and (None, 16) are incompatible
这是完整的追溯:
Model: "sequential_14"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_84 (Dense) (None, 32) 800
_________________________________________________________________
dense_85 (Dense) (None, 1024) 33792
_________________________________________________________________
dense_86 (Dense) (None, 512) 524800
_________________________________________________________________
dense_87 (Dense) (None, 256) 131328
_________________________________________________________________
dense_88 (Dense) (None, 128) 32896
_________________________________________________________________
dense_89 (Dense) (None, 16) 2064
_________________________________________________________________
activation_14 (Activation) (None, 16) 0
=================================================================
Total params: 725,680
Trainable params: 725,680
Non-trainable params: 0
_________________________________________________________________
Epoch 1/1000
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-46-7c4cfcd2abc7> in <module>
6
7 model = nn_model(max_len)
----> 8 history=check_model(model, X_train,y_train,X_test,y_test, EPOCHS, BATCH_SIZE)
<ipython-input-45-ca2dcbc233ca> in check_model(model_, x, y, x_val, y_val, epochs_, batch_size_)
50 epochs=epochs_,
51 batch_size=batch_size_,
---> 52 validation_data=(x_val,y_val))
53 return hist
~\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py in _method_wrapper(self, *args, **kwargs)
106 def _method_wrapper(self, *args, **kwargs):
107 if not self._in_multi_worker_mode(): # pylint: disable=protected-access
--> 108 return method(self, *args, **kwargs)
109
110 # Running inside `run_distribute_coordinator` already.
~\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
1096 batch_size=batch_size):
1097 callbacks.on_train_batch_begin(step)
-> 1098 tmp_logs = train_function(iterator)
1099 if data_handler.should_sync:
1100 context.async_wait()
~\Anaconda3\lib\site-packages\tensorflow\python\eager\def_function.py in __call__(self, *args, **kwds)
778 else:
779 compiler = "nonXla"
--> 780 result = self._call(*args, **kwds)
781
782 new_tracing_count = self._get_tracing_count()
~\Anaconda3\lib\site-packages\tensorflow\python\eager\def_function.py in _call(self, *args, **kwds)
821 # This is the first call of __call__, so we have to initialize.
822 initializers = []
--> 823 self._initialize(args, kwds, add_initializers_to=initializers)
824 finally:
825 # At this point we know that the initialization is complete (or less
~\Anaconda3\lib\site-packages\tensorflow\python\eager\def_function.py in _initialize(self, args, kwds, add_initializers_to)
695 self._concrete_stateful_fn = (
696 self._stateful_fn._get_concrete_function_internal_garbage_collected( # pylint: disable=protected-access
--> 697 *args, **kwds))
698
699 def invalid_creator_scope(*unused_args, **unused_kwds):
~\Anaconda3\lib\site-packages\tensorflow\python\eager\function.py in _get_concrete_function_internal_garbage_collected(self, *args, **kwargs)
2853 args, kwargs = None, None
2854 with self._lock:
-> 2855 graph_function, _, _ = self._maybe_define_function(args, kwargs)
2856 return graph_function
2857
~\Anaconda3\lib\site-packages\tensorflow\python\eager\function.py in _maybe_define_function(self, args, kwargs)
3211
3212 self._function_cache.missed.add(call_context_key)
-> 3213 graph_function = self._create_graph_function(args, kwargs)
3214 self._function_cache.primary[cache_key] = graph_function
3215 return graph_function, args, kwargs
~\Anaconda3\lib\site-packages\tensorflow\python\eager\function.py in _create_graph_function(self, args, kwargs, override_flat_arg_shapes)
3073 arg_names=arg_names,
3074 override_flat_arg_shapes=override_flat_arg_shapes,
-> 3075 capture_by_value=self._capture_by_value),
3076 self._function_attributes,
3077 function_spec=self.function_spec,
~\Anaconda3\lib\site-packages\tensorflow\python\framework\func_graph.py in func_graph_from_py_func(name, python_func, args, kwargs, signature, func_graph, autograph, autograph_options, add_control_dependencies, arg_names, op_return_value, collections, capture_by_value, override_flat_arg_shapes)
984 _, original_func = tf_decorator.unwrap(python_func)
985
--> 986 func_outputs = python_func(*func_args, **func_kwargs)
987
988 # invariant: `func_outputs` contains only Tensors, CompositeTensors,
~\Anaconda3\lib\site-packages\tensorflow\python\eager\def_function.py in wrapped_fn(*args, **kwds)
598 # __wrapped__ allows AutoGraph to swap in a converted function. We give
599 # the function a weak reference to itself to avoid a reference cycle.
--> 600 return weak_wrapped_fn().__wrapped__(*args, **kwds)
601 weak_wrapped_fn = weakref.ref(wrapped_fn)
602
~\Anaconda3\lib\site-packages\tensorflow\python\framework\func_graph.py in wrapper(*args, **kwargs)
971 except Exception as e: # pylint:disable=broad-except
972 if hasattr(e, "ag_error_metadata"):
--> 973 raise e.ag_error_metadata.to_exception(e)
974 else:
975 raise
ValueError: in user code:
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py:806 train_function *
return step_function(self, iterator)
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py:796 step_function **
outputs = model.distribute_strategy.run(run_step, args=(data,))
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:1211 run
return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2585 call_for_each_replica
return self._call_for_each_replica(fn, args, kwargs)
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2945 _call_for_each_replica
return fn(*args, **kwargs)
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py:789 run_step **
outputs = model.train_step(data)
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py:749 train_step
y, y_pred, sample_weight, regularization_losses=self.losses)
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\compile_utils.py:204 __call__
loss_value = loss_obj(y_t, y_p, sample_weight=sw)
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\keras\losses.py:149 __call__
losses = ag_call(y_true, y_pred)
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\keras\losses.py:253 call **
return ag_fn(y_true, y_pred, **self._fn_kwargs)
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\util\dispatch.py:201 wrapper
return target(*args, **kwargs)
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\keras\losses.py:1535 categorical_crossentropy
return K.categorical_crossentropy(y_true, y_pred, from_logits=from_logits)
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\util\dispatch.py:201 wrapper
return target(*args, **kwargs)
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\keras\backend.py:4687 categorical_crossentropy
target.shape.assert_is_compatible_with(output.shape)
C:\Users\Anaconda3\lib\site-packages\tensorflow\python\framework\tensor_shape.py:1134 assert_is_compatible_with
raise ValueError("Shapes %s and %s are incompatible" % (self, other))
ValueError: Shapes (None, 3) and (None, 16) are incompatible
这是相关代码:
# Encode label
le = LabelEncoder()
le.fit(glcm_df["label"].values)
print("categorical label : \n", le.classes_)
Y = le.transform(glcm_df['label'].values)
Y = to_categorical(Y)
# Split dataset
X_train, X_test, y_train, y_test = \
train_test_split(X,
Y,
test_size=0.25,
random_state=42)
def nn_model(max_len):
model = Sequential()
model.add(Dense(32,
activation="elu",
input_shape=(max_len,)))
model.add(Dense(1024, activation="elu"))
model.add(Dense(512, activation="elu"))
model.add(Dense(256, activation="elu"))
model.add(Dense(128, activation="elu"))
model.add(Dense(16))
model.add(Activation("sigmoid"))
model.summary()
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics = ['accuracy', precision, recall])
return model
def check_model(model_, x, y, x_val, y_val, epochs_, batch_size_):
hist = model_.fit(x,
y,
epochs=epochs_,
batch_size=batch_size_,
validation_data=(x_val,y_val))
return hist
# Train data
max_len = X_train.shape[1]
EPOCHS = 1000
BATCH_SIZE = 32
model = nn_model(max_len)
history=check_model(model, X_train,y_train,X_test,y_test, EPOCHS, BATCH_SIZE)
我也尝试同时为to_categorical
和y_train
做y_test
,但这总是给我一个类似的错误(只是形状不同),如:
ValueError: Shapes (None, 3, 3) and (None, 16) are incompatible
EDIT 1.0:
X的形状是(780,24),Y的形状是(780,3):
答案 0 :(得分:1)
在多类分类问题中具有S形激活函数的神经网络的最后一层必须反映所预测的类数。这里使用了3个类,因此只需将其从16更改为3。
findViewById()