我想对X射线扫描的6个不同类别进行分类,代码有什么问题?
model = Sequential()model.add(Conv2D(256, (3, 3), input_shape=X.shape[1:]))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(256, (3, 3)))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Flatten()) model.add(Dense(64))model.add(Dense(6))model.add(Activation('softmax'))model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])model.fit(X, y, batch_size=32, epochs=3, validation_split=0.1)
输入的形状是:(50, 50, 1)
我应该删除其中一个MaxPooling层吗?
我看到在这里发布错误跟踪也是很好的做法,所以这里是错误跟踪:
Epoch 1/3---------------------------------------------------------------------------ValueError Traceback (most recent call last)(...)ValueError: in user code: C:\Python38\lib\site-packages\tensorflow\python\keras\engine\training.py:571 train_function * outputs = self.distribute_strategy.run( C:\Python38\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:951 run ** return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs) C:\Python38\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2290 call_for_each_replica return self._call_for_each_replica(fn, args, kwargs) C:\Python38\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2649 _call_for_each_replica return fn(*args, **kwargs) C:\Python38\lib\site-packages\tensorflow\python\keras\engine\training.py:532 train_step ** loss = self.compiled_loss( C:\Python38\lib\site-packages\tensorflow\python\keras\engine\compile_utils.py:205 __call__ loss_value = loss_obj(y_t, y_p, sample_weight=sw) C:\Python38\lib\site-packages\tensorflow\python\keras\losses.py:143 __call__ losses = self.call(y_true, y_pred) C:\Python38\lib\site-packages\tensorflow\python\keras\losses.py:246 call return self.fn(y_true, y_pred, **self._fn_kwargs) C:\Python38\lib\site-packages\tensorflow\python\keras\losses.py:1527 categorical_crossentropy return K.categorical_crossentropy(y_true, y_pred, from_logits=from_logits) C:\Python38\lib\site-packages\tensorflow\python\keras\backend.py:4561 categorical_crossentropy target.shape.assert_is_compatible_with(output.shape) C:\Python38\lib\site-packages\tensorflow\python\framework\tensor_shape.py:1117 assert_is_compatible_with raise ValueError("Shapes %s and %s are incompatible" % (self, other)) ValueError: Shapes (None, 1) and (None, 6) are incompatible
回答:
为了避免误解和可能的错误,我建议你将目标从(586,1)重塑为(586,),你可以简单地执行y = y.ravel()
你需要正确管理损失函数
如果你有一维整数编码的目标,你可以使用sparse_categorical_crossentropy作为损失函数
X = np.random.randint(0,10, (1000,100))y = np.random.randint(0,3, 1000)model = Sequential([ Dense(128, input_dim = 100), Dense(3, activation='softmax'),])model.summary()model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])history = model.fit(X, y, epochs=3)
否则,如果你对目标进行了独热编码以获得二维形状(n_samples, n_class),你可以使用categorical_crossentropy
X = np.random.randint(0,10, (1000,100))y = pd.get_dummies(np.random.randint(0,3, 1000)).valuesmodel = Sequential([ Dense(128, input_dim = 100), Dense(3, activation='softmax'),])model.summary()model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])history = model.fit(X, y, epochs=3)