from PIL import Image
#Python Image Library를 통해 Image를 열어볼 수 있는 기회를 갖자! 이미지 크기도 보고, 어떻게 생겼나도 확인
Image.open('')
import glob #glob() 함수는 경로에 대응되는 모든 파일 및 디렉터리의 리스트를 반환합니다
train=pd.DataFrame({'path':glob.glob('')})
#glob에서 파일을 어떻게 반환할건지=> /*로 파일명으로 라벨이 구분되어있는지 /*/*로 폴더명으로 라벨이 구분되어있는지 확인
pd.options.display.max_coldwidth=999 #너무 작으면 늘려줘
train
train['target']=train['path'].apply(lambda x:x.split...)
#target 프레임도 만들어준다. target이 라벨임
from sklearn.model_selection import train_test_split
x_train,x_valid=train_test_split(train,test_size=0.2,random_state=42,stratify=train['target'])
#random_state 는 항상 그 이미지가 그 라벨로 나오게 고정해주는것, stratify는 원본데이터의 클래스 비율유지하는것
from keras.preprocessing.image import ImageDataGenerator
idg=ImageDataGenerator(horizontal_fliip=True)
#좌우반전, 한번 에폭 돌 때 마다 10,000개의 데이터가 들어온다고 하면, 50퍼센트의 확률로 이미지가 좌우반전이 된다.
#그 중 5000개 그냥 바뀌는거, 그래서 에폭을 한번만 하면 안되고 최대한 늘려줘야한다. 이미지가 추가되는게아님
train_gen=idg.flow_from_dataframe(x_train,x_col='path',y_col='target',target_size=(100,100),batch_size=256)
#batch_size 한번 가중치를 업데이트할 때 마다 256개씩 한 뭉텅이로 함.
valid_gen=idg.flow_from_dataframe(x_valid,x_col='path',y_col='target',target_size=(100,100),batch_size=256)
#test
test=pd.DataFrame({'path':glob.glob('../input/state-farm-distracted-driver-detection/imgs/test/*')})
test
test_gen=idg.flow_from_dataframe(test,x_col='path',y_col=None,target_size=(100,100),class_mode=None,shuffle=False,batch_size=256)
#원래 class_mode가 categorical이 되어있음, 그걸 None으로 변환 - if class_mode is "categorical" (default value) it must include
the y_col column with the class/es of each image 즉 categorical로 되어있으면 y값이 있어야되는데 우린 없어서 안됨
#shuffle=None은 shuffle을 true로 하면 데이터가 제출을 할 때 섞이게 된다. 그럼 그 번호에 해당하는 이미지와 그 번호에 해당하는 라벨값이 섞여서 안맞게 됨.
from tensorflow.keras import Sequential
from tensorflow.keras.layers import *
from tensorflow.keras.applications.efficientnet import EfficientNetB0
# 숫자가 올라갈수록 복잡해지고, 잘 나올 가능성이 높아짐
eb0=EfficientNetB0(include_top=False,pooling='avg')
#include_top은 출력층임, 출력층을 없애줘야됨. 이게 그대로 있으면 (True면) 밑에 softmax부분이 반복됨. avg는 얘가 flatten도 시켜줌
model.add(eb0)
model.add(Dense(10,activation='softmax'))
#마지막 출력층도 없고, softmax부분도 없어서 Dense로 만들어주고 (fully-connected) 출력층이 클래스의 개수만큼 나올 수 있게 해준다.
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['acc'])
#loss='binary_crossentropy'가 들어갈 수 도있다.Sigmoid activation으로 대신 바꿔줘야겠지?
result=model.predict(test_gen,verbose=1)
#verbose = 학습 중 출력되는 문구를 설정합니다.
#- 0 : 아무 것도 출력하지 않습니다.
#- 1 : 훈련의 진행도를 보여주는 진행 막대를 보여줍니다.
#- 2 : 미니 배치마다 손실 정보를 출력합니다.
result=pd.DataFrame(result,coulmns=train['target'].unique())
#result로 dataframe을 만든다. 열은 target 값임 클래스별로 열을 만들고, unique()는 특정칼럼에 접근해서, 거기 종류별로 만듬
#알파벳 순이기 때문에 cat이 왼쪽이고 dog가 오른쪽 순임.
sub=pd.read_csv('')
sub['id']=test['path']
sub['id']=sub['id'].apply(lambda x:x.split(''[])
#데이터 프레임 생성
sub['label']=result[:,0]
sub
#모든 데이터의 0번째, 즉 첫번째 값이 'label'에 들어감. 즉 cat일 확률이 들어가는거임
sub.to_csv('sub.csv',index=0)
#sub을 csv파일 파일명이 sub인걸로 만듬 index는 머냐..
display(sub,test)
#sub과 test가 나오겠지 이건 실행해봐야알듯
'머신러닝-딥러닝 > Kaggle' 카테고리의 다른 글
1주차 머신러닝 (0) | 2021.01.22 |
---|---|
9주차 review (0) | 2021.01.14 |
7주차 review (0) | 2020.12.28 |
CNN 성능 향상시키기 (6시차-review) (0) | 2020.12.22 |
5주차 과제_정리 #axis, #state_farm(kaggle) (0) | 2020.12.22 |