import keras
from keras import layers
vggnet = keras.Sequential()# 입력 형태 정의: 224x224 크기의 RGB(3채널) 이미지
vggnet.add(layers.Input(shape=(224,224,3)))for n_filters in[64,128]:# 각 블록 내 Conv2D 레이어 2개 추가for _ inrange(2):# filters: 현재 블록의 필터 수 (이미지에서 특징을 추출하는 필터)# kernel_size: 3x3 크기 필터(커널) 사용# padding: 입력 이미지 크기 유지를 위한 패딩 추가# activation: ReLU 활성화 함수 사용
vggnet.add(layers.Conv2D(filters=n_filters, kernel_size=3,
padding='same', activation='relu'))# 2개의 Conv2D 레이어 후 Max Pooling 레이어 추가# pool_size: 2x2 영역에서 가장 큰 값을 선택해 이미지 크기를 절반으로 줄임
vggnet.add(layers.MaxPooling2D(pool_size=2))for n_filters in[256,512,512]:# 각 블록 내 Conv2D 레이어 3개 추가for _ inrange(3):
vggnet.add(layers.Conv2D(filters=n_filters, kernel_size=3,
padding='same', activation='relu'))
vggnet.add(layers.MaxPooling2D(pool_size=2))# 컨볼루션 블록을 거쳐 추출된 2D 특징 맵을 1차원 벡터로 평탄화
vggnet.add(layers.Flatten())# 완전 연결 레이어 1# units: 뉴런 4096개
vggnet.add(layers.Dense(units=4096, activation='relu'))# 완전 연결 레이어 2
vggnet.add(layers.Dense(units=4096, activation='relu'))# 최종 출력 레이어# units: 뉴런 1000개 (=ImageNet 데이터셋 클래스 1000개 분류 목적)# activation: Softmax 활성화 함수를 사용해 각 클래스에 대한 예측 확률 출력
vggnet.add(layers.Dense(units=1000, activation='softmax'))