Код: Выделить всё
trainDf = tf.keras.preprocessing.image_dataset_from_directory(
trainDir,
image_size=(64, 64),
batch_size=8,
shuffle=True,
labels="inferred"
)
valDf = tf.keras.preprocessing.image_dataset_from_directory(
valDir,
image_size=(64, 64),
batch_size=8,
shuffle=False,
labels="inferred"
)
< /code>
увеличение: < /p>
rescale_and_resize = tf.keras.Sequential([
layers.Resizing(64, 64),
layers.Rescaling(1./255)
])
data_augmentation = tf.keras.Sequential([
layers.RandomFlip("horizontal_and_vertical"),
layers.RandomRotation(0.1),
layers.RandomZoom(0.1),
layers.RandomTranslation(0.1, 0.1),
layers.RandomContrast(0.1),
])
< /code>
Модель: < /p>
#Model
model = models.Sequential([
rescale_and_resize,
data_augmentation,
layers.Conv2D(32, 3, activation='relu', padding='same'),
layers.BatchNormalization(),
layers.MaxPooling2D(),
layers.Conv2D(64, 3, activation='relu', padding='same'),
layers.BatchNormalization(),
layers.MaxPooling2D(),
layers.Conv2D(128, 3, activation='relu', padding='same'),
layers.BatchNormalization(),
layers.MaxPooling2D(),
layers.Conv2D(128, 3, activation='relu', padding='same'),
layers.BatchNormalization(),
layers.MaxPooling2D(),
layers.Conv2D(256, 3, activation='relu', padding='same'),
layers.BatchNormalization(),
layers.MaxPooling2D(),
layers.Flatten(),
layers.Dropout(0.5),
layers.Dense(38)
])
model.compile(
optimizer=tf.keras.optimizers.Adam(1e-4),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy']
)
model.summary()
stop_early = tf.keras.callbacks.EarlyStopping(
monitor='val_loss',
patience=5,
restore_best_weights=True
)
#Training the model
history = model.fit(
trainDf,
validation_data=valDf,
epochs=50,
callbacks=[stop_early]
)
model.save("model1.keras")
< /code>
Сводка модели после обучения: < /p>
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type) ┃ Output Shape ┃ Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ sequential (Sequential) │ (None, 64, 64, 3) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ sequential_1 (Sequential) │ (None, 64, 64, 3) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d (Conv2D) │ (None, 64, 64, 32) │ 896 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ batch_normalization │ (None, 64, 64, 32) │ 128 │
│ (BatchNormalization) │ │ │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d (MaxPooling2D) │ (None, 32, 32, 32) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_1 (Conv2D) │ (None, 32, 32, 64) │ 18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ batch_normalization_1 │ (None, 32, 32, 64) │ 256 │
│ (BatchNormalization) │ │ │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_1 (MaxPooling2D) │ (None, 16, 16, 64) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_2 (Conv2D) │ (None, 16, 16, 128) │ 73,856 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ batch_normalization_2 │ (None, 16, 16, 128) │ 512 │
│ (BatchNormalization) │ │ │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_2 (MaxPooling2D) │ (None, 8, 8, 128) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_3 (Conv2D) │ (None, 8, 8, 128) │ 147,584 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ batch_normalization_3 │ (None, 8, 8, 128) │ 512 │
│ (BatchNormalization) │ │ │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_3 (MaxPooling2D) │ (None, 4, 4, 128) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_4 (Conv2D) │ (None, 4, 4, 256) │ 295,168 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ batch_normalization_4 │ (None, 4, 4, 256) │ 1,024 │
│ (BatchNormalization) │ │ │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_4 (MaxPooling2D) │ (None, 2, 2, 256) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten (Flatten) │ (None, 1024) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout (Dropout) │ (None, 1024) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense (Dense) │ (None, 38) │ 38,950 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
Epoch 24/50
8787/8787 ━━━━━━━━━━━━━━━━━━━━ 630S 72 мс/Шаг - Точность: 0.9667 - Потеря: 0,0985 - IM -al_accuracy: 0.9380 - val_loss: 0.1975 hazcuracy. Данные: < /p>
Код: Выделить всё
model = keras.models.load_model("model1.keras")
imgs=[os.path.join(testDir,fpath) for fpath in os.listdir(testDir)]
images=[]
for path in imgs:
img = image.load_img(path,target_size=(64,64))
arr=image.img_to_array(img)
arr=arr/255.0
images.append(arr)
images=np.array(images)
pred=model.predict(images)
p=np.argmax(pred,axis=1)
print(p)
2/2 ━━━━━━━━━━━━━━━━━━━━ 0s 168ms/step
[8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8]>
Подробнее здесь: https://stackoverflow.com/questions/797 ... -everytime