2022.7.12 농산물 품질분류 프로젝트 6일차

정성우·2022년 7월 12일
0

학습한 내용

import json
import os
import glob
import csv
# 가져올 파일들 경로
path='./tl/*.json'
# 경로를 리스트 형태로
filelist=glob.glob(path)
# 빈 딕셔너리
keydata={}
# csv 파일 생성 쓰기모드
with open('./json.csv','w',encoding='utf-8-sig') as f:
    w = csv.writer(f)
    # 맨 처음 라벨 쓰기
    w.writerow(['group_no','cate1','cate2','cate3','width','height','weight'])
    # 파일경로를 하나씩 불러옴
    for filename in filelist:
    	#파일 하나씩 열기
        with open(filename, 'r',encoding='utf-8-sig') as f:
            json_data = json.load(f)
            #json data를 열어서 필요한 변수 추출
            group_no=json_data['group_no']
            cate1=json_data['cate1']
            cate2=json_data['cate2']
            cate3=json_data['cate3']
            width=json_data['width']
            height=json_data['height']
            weight=json_data['weight']
            #dictionary 형태로 변경
            keydata.update({'group_no':group_no})
            keydata.update({'cate1':cate1})
            keydata.update({'cate2':cate2})
            keydata.update({'cate3':cate3})
            keydata.update({'width':width})
            keydata.update({'height':height})
            keydata.update({'weight':weight})
            # csv에 한줄 작성 for문 반복
            w.writerow(keydata.values())

import pandas as pd
import numpy as np
import re
import matplotlib.pyplot as plt

df=pd.read_csv("./json.csv",encoding='utf-8-sig')
print(df.head())
#group_no를 기준으로 중복제거하여 하나의 물체는 하나의 값만 남도록
df=df.drop_duplicates('group_no')
print(df.head())
print(df.shape)
print(type(df))
df.to_csv('./nodupjson.csv',encoding='utf-8-sig',index=False)

실행결과

# 도구 임포트 및 랜덤 시드 고정
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

torch.manual_seed(1)

# 벡터와 행렬 연산으로 바꾸기
# 행렬 곱셈 연산을 사용

import pandas as pd
import numpy as np
df=pd.read_csv("./nodupjson.csv",encoding='utf-8-sig')
#품목,품종,등급을 합쳐 하나의 변수 생성
df['strlabel']=df['cate1'].str.cat(df['cate2']).str.cat(df['cate3'])
#one-hot encoding 
data=pd.get_dummies(df['strlabel'])
#[0,0,0,0,0.....1] 같은 형태의 값이 들어감 특정한 한 라벨이 들어가는것
x_train=torch.Tensor(data.values)

#필요한 값만 추출
df_val=df.loc[:,['width','height','weight']]
# 데이터에 이상하게 ` 문자가 들어가있어서 바로 astype이 안됌
# 반복문을 이용 `를 제거
for i in range(0,3523):
        df_val['width'][i]=str(df_val['width'][i]).replace('`','')
        df_val['height'][i]=str(df_val['height'][i]).replace('`','')
        df_val['weight'][i]=str(df_val['weight'][i]).replace('`','')
# df_val이 숫자값이 아닌 문자로 되어있어서 숫자로 변경
df_val=df_val.astype(float)
#[width,height,weight]형식의 데이터가 들어감
y_train=torch.Tensor(df_val.values)

#총 54개의 라벨이 있고 출력값은 width, height, weight이므로 54,3
model = nn.Linear(54,3)

# 모델 초기화
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 전체 훈련 데이터에 대해 경사 하강법을 100,000회 반복
nb_epochs = 100000
for epoch in range(nb_epochs+1):

    # H(x) 계산
    prediction = model(x_train)

    # cost 계산
    cost = F.mse_loss(prediction, y_train)  # <== 파이토치에서 제공하는 평균 제곱 오차 함수

    # cost로 H(x) 개선하는 부분
    # gradient를 0으로 초기화
    optimizer.zero_grad()
    # 비용 함수를 미분하여 gradient 계산
    cost.backward()  # backward 연산
    # W와 b를 업데이트
    optimizer.step()

    if epoch % 100 == 0:
        # 100번마다 로그 출력
        print('Epoch {:4d}/{} Cost: {:.6f}'.format(
            epoch, nb_epochs, cost.item()
        ))

# 임의의 입력 
new_var = x_train[1]
pred_y = model(new_var)  # forward 연산
print("훈련 후 입력이 0일 때의 예측값 :", pred_y)
print(y_train[1])

실행결과

예측값과 실제값

학습한 내용 중 어려웠던 점 또는 해결못한 것들
학습코드를 좀더 개선할점이 있는지 찾아보려고 한다.
모델학습의 예측값이 각 라벨별 데이터의 평균과 비슷한지 히스토그램을 뽑아봐야겠다.

해결방법 작성

학습 소감
아직 원하는 데이터의 형태를 빠르게 만드는게 어렵다.

0개의 댓글