from tensorflow.keras.optimizers import Adam

optimizer = Adam(learning_rate=0.001)

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, Dropout


# CNN 모델 구축
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(64, 64, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))

# 모델 컴파일
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

# 모델 요약 출력
model.summary()

# 모델 학습
history = model.fit(train_images, train_labels, batch_size=32, epochs=10, validation_data=(val_images, val_labels))

# 학습된 모델을 테스트 데이터셋으로 평가
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Test accuracy: {test_acc:.4f}")


Epoch 990/1000 29/29 [==============================] - 1s 24ms/step - loss: 1.0985 - accuracy: 0.3356 - val_loss: 1.0986 - val_accuracy: 0.3333 Epoch 991/1000 29/29 [==============================] - 1s 24ms/step - loss: 1.0988 - accuracy: 0.3267 - val_loss: 1.0986 - val_accuracy: 0.3333 Epoch 992/1000 29/29 [==============================] - 1s 23ms/step - loss: 1.0988 - accuracy: 0.3444 - val_loss: 1.0986 - val_accuracy: 0.3333 Epoch 993/1000 29/29 [==============================] - 1s 24ms/step - loss: 1.0984 - accuracy: 0.3433 - val_loss: 1.0986 - val_accuracy: 0.3333 Epoch 994/1000 29/29 [==============================] - 1s 23ms/step - loss: 1.0983 - accuracy: 0.3578 - val_loss: 1.0986 - val_accuracy: 0.3333 Epoch 995/1000 29/29 [==============================] - 1s 23ms/step - loss: 1.0984 - accuracy: 0.3500 - val_loss: 1.0986 - val_accuracy: 0.3333 Epoch 996/1000 29/29 [==============================] - 1s 24ms/step - loss: 1.0986 - accuracy: 0.3233 - val_loss: 1.0986 - val_accuracy: 0.3333 Epoch 997/1000 29/29 [==============================] - 1s 24ms/step - loss: 1.0985 - accuracy: 0.3544 - val_loss: 1.0986 - val_accuracy: 0.3333 Epoch 998/1000 29/29 [==============================] - 1s 24ms/step - loss: 1.0988 - accuracy: 0.3067 - val_loss: 1.0986 - val_accuracy: 0.3333 Epoch 999/1000 29/29 [==============================] - 1s 24ms/step - loss: 1.0985 - accuracy: 0.3411 - val_loss: 1.0986 - val_accuracy: 0.3333 Epoch 1000/1000 29/29 [==============================] - 1s 24ms/step - loss: 1.0985 - accuracy: 0.3578 - val_loss: 1.0986 - val_accuracy: 0.3333 10/10 [==============================] - 0s 10ms/step - loss: 1.0986 - accuracy: 0.3333 Test accuracy: 0.3333



간단하게 3개 클래스(나무a, 나무b, 나무c)를 분류하려고 하는데, 데이터셋 구축 및 기타 전처리는 문제없이 잘 된거 같아요. 이미지 사이즈는 64, 64입니다.

총 1500개 데이터셋에서 나무별 500개씩 -> train 6: val 2: test 2로 데이터셋을 나누었고 이제 학습을 하려고 하는데 에포크를 어떻게 하던 처음 시작부터 끝까지 val_loss와 val_acc가 고정입니다. 아마 학습이 안된다는 거 같은데 도저히 해결방안을 못찾겠습니다.