我使用CNN创建了一个多类图像分类器。我专门使用keras
模块,并使用生成器来拟合然后预测4个不同类别的图像。我的test_generator
有394个例子(所有四个类加在一起(,但我的model.prpredict产生了(6304,4(个预测。
以下是模型摘要:
Model: "sequential_2"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
IP (Conv2D) (None, 64, 64, 32) 320
Convolution0 (Conv2D) (None, 64, 64, 64) 18496
PL0 (MaxPooling2D) (None, 32, 32, 64) 0
Convolution1 (Conv2D) (None, 32, 32, 128) 73856
PL1 (MaxPooling2D) (None, 16, 16, 128) 0
Convolution2 (Conv2D) (None, 16, 16, 256) 295168
PL2 (MaxPooling2D) (None, 8, 8, 256) 0
FL (Flatten) (None, 16384) 0
FC (Dense) (None, 128) 2097280
OP (Dense) (None, 4) 516
=================================================================
Total params: 2,485,636
Trainable params: 2,485,636
Non-trainable params: 0
_________________________________________________________________
以下是我创建test_generator的方式:CCD_ 3和CCD_ 4为394。
以下是我的预测:predictions = model.predict(test_generator)
,并且predictions.shape
的结果是[6304,4]而不是[394,4]。这可能是什么原因?我做错什么了吗?我在这里有什么选择,因为我的下一步是创建一个包含各种指标的分类报告。
这是输入和层数,我看到你使用的是平坦层,后面是密集矩阵,这表示层的输出矩阵。
存在卷积层和致密层,320->18496(32*578(->返回相同大小的MaxPool。
你可以创建一个类似于所附图片的引擎,输出是敏感的,你的问题是相似性和比率。(6304,4(,(394,4(。
它们在统计方法中很重要,只是意味着你不需要我们为你做的密集层
[样本]:
import tensorflow as tf
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Functions
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
def predict_action ( dataset ) :
predictions = model.predict( dataset )
return predictions
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
DataSet
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
input = tf.constant( tf.random.uniform(shape=[5, 2], minval=5, maxval=10, dtype=tf.int64), shape=( 1, 1, 5, 2 ) )
label = tf.constant( [0], shape=( 1, 1, 1 ) )
dataset = tf.data.Dataset.from_tensor_slices(( input, label ))
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
: Model Initialize
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
model = tf.keras.models.Sequential([
tf.keras.layers.InputLayer(input_shape=( 5, 2 )),
tf.keras.layers.Dense( 4 ),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense( 128 ),
tf.keras.layers.Dense( 4 ),
])
model.summary()
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
: Optimizer
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
optimizer = tf.keras.optimizers.Nadam(
learning_rate=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-07,
name='Nadam'
)
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
: Loss Fn
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
lossfn = tf.keras.losses.MeanSquaredLogarithmicError(reduction=tf.keras.losses.Reduction.AUTO, name='mean_squared_logarithmic_error')
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
: Model Summary
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
model.compile(optimizer=optimizer, loss=lossfn, metrics=['accuracy'])
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
: Training
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
history = model.fit(dataset, epochs=1 ,validation_data=(dataset))
print( predict_action( dataset ) )
[输出]:
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 5, 4) 12
flatten (Flatten) (None, 20) 0
dense_1 (Dense) (None, 16) 336
dense_2 (Dense) (None, 4) 68
=================================================================
Total params: 416
Trainable params: 416
Non-trainable params: 0
_________________________________________________________________
1/1 [==============================] - 1s 1s/step - loss: 0.2335 - accuracy: 0.0000e+00 - val_loss: 0.2291 - val_accuracy: 0.0000e+00
[[ 0.07219216 -2.9527428 1.5981569 -5.590222 ]]