我的机器学习代码出现了问题
这是我的模型:
model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(32, 3, activation='relu', input_shape=input_shape),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(64, 3, activation='relu'),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(128, 3, activation='relu'),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(512, 3, activation='relu'),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dense(1, activation='softmax')])model.summary()
这是我的模型摘要结果:
Model: "sequential_32"_________________________________________________________________Layer (type) Output Shape Param # =================================================================conv2d_128 (Conv2D) (None, 148, 148, 32) 896 _________________________________________________________________max_pooling2d_128 (MaxPoolin (None, 74, 74, 32) 0 _________________________________________________________________conv2d_129 (Conv2D) (None, 72, 72, 64) 18496 _________________________________________________________________max_pooling2d_129 (MaxPoolin (None, 36, 36, 64) 0 _________________________________________________________________conv2d_130 (Conv2D) (None, 34, 34, 128) 73856 _________________________________________________________________max_pooling2d_130 (MaxPoolin (None, 17, 17, 128) 0 _________________________________________________________________conv2d_131 (Conv2D) (None, 15, 15, 512) 590336 _________________________________________________________________max_pooling2d_131 (MaxPoolin (None, 7, 7, 512) 0 _________________________________________________________________flatten_32 (Flatten) (None, 25088) 0 _________________________________________________________________dense_79 (Dense) (None, 128) 3211392 _________________________________________________________________dense_80 (Dense) (None, 1) 129 =================================================================Total params: 3,895,105Trainable params: 3,895,105Non-trainable params: 0
这是我使用的编译设置:
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
这是训练模型的代码:
EPOCH = 100history = model.fit(train_data, steps_per_epoch=len(train_generator), epochs=EPOCH, validation_data=val_data, validation_steps=len(val_generator), shuffle=True, verbose = 1)
对于train_data,我使用tensorflow的tf.data来创建,因为我认为它与tf.keras更兼容。这是tf.data生成器函数的代码:
def tf_data_generator(generator, input_shape):num_class = generator.num_classestf_generator = tf.data.Dataset.from_generator( lambda: generator, output_types=(tf.float32, tf.float32), output_shapes=([None , input_shape[0] , input_shape[1] , input_shape[2]] ,[None, num_class]))return tf_generatortrain_data = tf_data_generator(train_generator, input_shape)val_data = tf_data_generator(val_generator, input_shape)
实际上,我是从medium.com上找到这个函数的。但是当我尝试训练我的机器学习代码时出现了错误,有人能帮我解决这个错误吗?这是错误消息:
---------------------------------------------------------------------------ValueError Traceback (most recent call last)<ipython-input-16-448faadd058c> in <module>() 6 validation_steps=len(val_generator), 7 shuffle=True,----> 8 verbose = 1)9 frames/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, **kwargs) 984 except Exception as e: # pylint:disable=broad-except 985 if hasattr(e, "ag_error_metadata"):--> 986 raise e.ag_error_metadata.to_exception(e) 987 else: 988 raiseValueError: in user code:/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:855 train_function * return step_function(self, iterator)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:845 step_function ** outputs = model.distribute_strategy.run(run_step, args=(data,))/usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:1285 run return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)/usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:2833 call_for_each_replica return self._call_for_each_replica(fn, args, kwargs)/usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:3608 _call_for_each_replica return fn(*args, **kwargs)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:838 run_step ** outputs = model.train_step(data)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:797 train_step y, y_pred, sample_weight, regularization_losses=self.losses)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/compile_utils.py:204 __call__ loss_value = loss_obj(y_t, y_p, sample_weight=sw)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/losses.py:155 __call__ losses = call_fn(y_true, y_pred)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/losses.py:259 call ** return ag_fn(y_true, y_pred, **self._fn_kwargs)/usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py:206 wrapper return target(*args, **kwargs)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/losses.py:1644 categorical_crossentropy y_true, y_pred, from_logits=from_logits)/usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py:206 wrapper return target(*args, **kwargs)/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/backend.py:4862 categorical_crossentropy target.shape.assert_is_compatible_with(output.shape)/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/tensor_shape.py:1161 assert_is_compatible_with raise ValueError("Shapes %s and %s are incompatible" % (self, other))ValueError: Shapes (None, 3) and (None, 1) are incompatible
抱歉如果我的问题让人困惑,我在机器学习领域还是新手。谢谢你的帮助
回答:
我猜你想得到一个多类分类器,用于3个类别。如果是这样的话,你错误地将最后一层设置为大小为1的DENSE层。你可以通过替换这一行来解决问题:
tf.keras.layers.Dense(1, activation='softmax')])
为这一行:
tf.keras.layers.Dense(3, activation='softmax')])