CNN не обучает TF 2.0 с использованием функционального API - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь обучить CNN на этом наборе данных.

Я проанализировал изображение, используя следующую функцию:

def parse_image(img, lbl):
image = tf.io.read_file(img)
image = tf.image.decode_jpeg(image)
image = tf.image.convert_image_dtype(image, tf.float32)
image = tf.image.resize(image, [50, 50])
image = tf.reshape(image, [-1, 50, 50, 3])
return image, tf.reshape(lbl, [-1, 1])

Моя модель как следует:

_input = tf.keras.Input(shape=(50, 50, 3), name='img')
x = tf.keras.layers.Conv2D(32, 3, activation='relu')(_input)
x = tf.keras.layers.Conv2D(64, 3, activation='relu')(x)
x = tf.keras.layers.MaxPooling2D(2)(x)
x = tf.keras.layers.Conv2D(64, 3, activation='relu')(x)
x = tf.keras.layers.Conv2D(64, 3, activation='relu')(x)
x = tf.keras.layers.Conv2D(128, 3, activation='relu')(x)
x = tf.keras.layers.Conv2D(128, 3, activation='relu')(x)
x = tf.keras.layers.Conv2D(128, 3, activation='relu')(x)
x = tf.keras.layers.Conv2D(128, 3, activation='relu')(x)
x = tf.keras.layers.Conv2D(256, 3, activation='relu')(x)
x = tf.keras.layers.Conv2D(256, 3, activation='relu')(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(100, activation='relu', use_bias= True, bias_initializer='he_normal')(x)
_output = tf.keras.layers.Dense(1, activation='softmax',  use_bias= True, bias_initializer='he_normal')(x)
model = keras.Model(_input, _output, name='cnn')
model.summary()
Model: "cnn"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
img (InputLayer)             [(None, 50, 50, 3)]       0         
_________________________________________________________________
conv2d_32 (Conv2D)           (None, 48, 48, 32)        896       
_________________________________________________________________
conv2d_33 (Conv2D)           (None, 46, 46, 64)        18496     
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 23, 23, 64)        0         
_________________________________________________________________
conv2d_34 (Conv2D)           (None, 21, 21, 64)        36928     
_________________________________________________________________
conv2d_35 (Conv2D)           (None, 19, 19, 64)        36928     
_________________________________________________________________
conv2d_36 (Conv2D)           (None, 17, 17, 128)       73856     
_________________________________________________________________
conv2d_37 (Conv2D)           (None, 15, 15, 128)       147584    
_________________________________________________________________
conv2d_38 (Conv2D)           (None, 13, 13, 128)       147584    
_________________________________________________________________
conv2d_39 (Conv2D)           (None, 11, 11, 128)       147584    
_________________________________________________________________
conv2d_40 (Conv2D)           (None, 9, 9, 256)         295168    
_________________________________________________________________
conv2d_41 (Conv2D)           (None, 7, 7, 256)         590080    
_________________________________________________________________
flatten_4 (Flatten)          (None, 12544)             0         
_________________________________________________________________
dense_7 (Dense)              (None, 100)               1254500   
_________________________________________________________________
dense_8 (Dense)              (None, 1)                 101       
=================================================================
Total params: 2,749,705
Trainable params: 2,749,705

При попытке обучить модель потери остаются постоянными, а точность равна нулю.

model.compile(tf.keras.optimizers.Adam(lr=0.001), loss='binary_crossentropy', 
              metrics=['accuracy'])
model.fit(train_data,
          epochs=2)
Epoch 1/2
1/1 [==============================] - 1s 727ms/step - loss: 15.3332 - accuracy: 0.0000e+00
Epoch 2/2
1/1 [==============================] - 0s 43ms/step - loss: 15.3332 - accuracy: 0.0000e+00

Я не уверен, что я сделал неправильно, поскольку я использовал ту же функцию parse_image с той же настройкой CNN и API подклассов, но я смог обучить модель.

Спасибо.

1 Ответ

0 голосов
/ 14 февраля 2020

Не используйте активацию Softmax, если у вас есть только один выход для двоичной классификации, вместо этого используйте Sigmoid:

_output = tf.keras.layers.Dense(1, activation='sigmoid',  use_bias= True, bias_initializer='he_normal')(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...