• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Python, SQL 게시판 DenseFeatures로 fit 한 모델, 다른파일에 test.csv 예측하려는데요.

DenseFeatures로 fit 한 모델, 다른파일에 test.csv 예측하려는데요.

6 글 보임 - 1 에서 6 까지 (총 6 중에서)
  • 글쓴이
  • #90526

    조승엽
    참가자
    질문이 몇개 있어요.
    모델 전체 저장했다가 다른 파일에 test.csv를 예측하려고 보니 안되는듯 하고, feature_columns에 넣는 과정이 필요할것 같은데요.
    
    Q1, DenseFeatures는 모델 전체 저장해서 쓰기 힘들고, 가중치 저장으로 밖에 못쓰나요? 
    
    가중치만 저장해서 불려오는데 에러가 뜨더라고요.
    입력은 
    train_ds = tf.data.Dataset.from_tensor_slices((dict(train_data), train_정답)) 
    ~~ 생략~~
    model = tf.keras.Sequential([    
        tf.keras.layers.DenseFeatures(feature_columns),
        tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dense(64, activation='relu'),
        tf.keras.layers.Dropout(0.2),
        tf.keras.layers.Dense(1, activation='sigmoid'),
    ])
    train_ds_batch = train_ds.batch(32)
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
    model.load_weights('./체크포인트들/checkpoint')
    model.evaluate(train_ds_batch)
    를 입력했을때 
    
    Q2. ValueError: Shapes (681, 9) and (558, 9) are incompatible 이런 에러가 뜨는데 어떻게 하나요?
    
    
    다른 파일에 불려와서 하는게 안되길래 fit 한곳 밑에다가 
    예측을 하려고 보니 자료를 어떻게 써야하는지 복잡하더라고요.
    Bing 검색 해서 아래처럼 썻는데요.
    
    input_data = {'PassengerId': [test_data['PassengerId'][0]], 'Pclass': [test_data['Pclass'][0]], 'Name': [test_data['Name'][0]], 'Sex': [test_data['Sex'][0]], 'Age': [test_data['Age'][0]], 'SibSp': [test_data['SibSp'][0]], 'Parch': [test_data['Parch'][0]], 'Ticket': [test_data['Ticket'][0]], 'Fare': [test_data['Fare'][0]], 'Embarked': [test_data['Embarked'][0]]}
    input_data_np = {}
    for key in input_data.keys():
        input_data_np[key] = np.array(input_data[key])
    예측값 = model.predict(input_data_np)
    print(예측값)
    
    Q3. 저렇게 하는게 맞나요? 아니면 더 쉽게 하는 방법이 있나요?
    
    
    #90558

    codingapple
    키 마스터
    모델저장잘했으면 train_ds_batch 부분이 전처리가 학습용데이터랑 똑같이 안되어서 그럴수도요 
    
    predict용 데이터도 학습 때와 똑같이 전처리해서 넣는게 좋습니다
    #90566

    조승엽
    참가자
    train_ds_batch = train_ds.batch(32)에서  train_ds 가 모델 저장할때 쓴거 복붙해온거 넣은거에요.
    test 바로 쓰기보다 일단 저게 되는지 안되는지 몰라서, 모델 fit했던 파일에 있는 거 가져왔어요.
    
    
    import pandas as pd
    import tensorflow as tf
    import numpy as np
    # data = pd.read_csv('test.csv')
    # 평균 = data['Age'].mean()
    # data['Age'].fillna(value=30, inplace= True) 
    # data = data.dropna()
    
    
    train_data = pd.read_csv('train.csv')
    train_data['Age'].fillna(value=30, inplace= True) 
    train_data['Embarked'].fillna(value='S', inplace=True)
    train_정답 = train_data.pop('Survived') 
    train_ds = tf.data.Dataset.from_tensor_slices((dict(train_data), train_정답))
    feature_columns =[]
    def 노말라이저함수(x):
      # return 0 과 1 사이로 압축한 x
      최소값 = train_data['Fare'].min()
      최대값 = train_data['Fare'].max()
      return (x - 최소값) / (최대값 - 최소값)
    ### Fare - numeric_column, normalizer
    feature_columns.append( tf.feature_column.numeric_column('Fare', normalizer_fn=노말라이저함수) )
    ### SibSp - numeric_column
    feature_columns.append( tf.feature_column.numeric_column('SibSp') )
    ### Parch - numeric_column
    feature_columns.append( tf.feature_column.numeric_column('Parch') )
    ### Age - bucketized_column
    Age = tf.feature_column.numeric_column('Age')
    Age_bucket = tf.feature_column.bucketized_column(Age, boundaries=[10,20,30,40,50,60])
    feature_columns.append( Age_bucket )
    ### Sex - indicator_column
    vocab = train_data['Sex'].unique()
    cat = tf.feature_column.categorical_column_with_vocabulary_list('Sex', vocab)
    one_hot_cat = tf.feature_column.indicator_column(cat)
    feature_columns.append( one_hot_cat )
    ### Embarked - indicator_column
    vocab = train_data['Embarked'].unique()
    cat = tf.feature_column.categorical_column_with_vocabulary_list('Embarked', vocab) 
    one_hot_cat = tf.feature_column.indicator_column(cat) 
    feature_columns.append( one_hot_cat )
    ### Pclass - indicator_column
    vocab = train_data['Pclass'].unique()
    cat = tf.feature_column.categorical_column_with_vocabulary_list('Pclass', vocab) 
    one_hot_cat = tf.feature_column.indicator_column(cat) 
    feature_columns.append( one_hot_cat )
    ### Ticket - embedding_column
    vocab = train_data['Ticket'].unique()
    cat = tf.feature_column.categorical_column_with_vocabulary_list('Ticket', vocab) 
    embad_cat = tf.feature_column.embedding_column(cat, dimension=9)
    feature_columns.append( embad_cat )
    print(len(vocab))
    
    model = tf.keras.Sequential([
        # tf.keras.layers.DenseFeatures(feature_columns, input_shape=()),
        tf.keras.layers.DenseFeatures(feature_columns),
        tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dense(64, activation='relu'),
        tf.keras.layers.Dropout(0.2),
        tf.keras.layers.Dense(1, activation='sigmoid'),
    ])
    # model.summary()
    train_ds_batch = train_ds.batch(32)
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
    model.load_weights('./체크포인트들/checkpoint')
    model.evaluate(train_ds_batch)
    
    이렇게 입력을 했고요. 
    
    에러에서 뜨는 
     ValueError: Shapes (681, 9) and (558, 9) are incompatible
    의 숫자는 model = tf.keras.Sequential([ 하기전에 
    
    vocab = train_data['Ticket'].unique()
    cat = tf.feature_column.categorical_column_with_vocabulary_list('Ticket', vocab) 
    embad_cat = tf.feature_column.embedding_column(cat, dimension=9)
    feature_columns.append( embad_cat )
    
    print(len(vocab)) ----- 이 숫자가 681네요.
    558는 잘 모르겠고요.  fit은 되지만 불러오는게 안되는것도 모르겠네요.
    
    
    
    
    #90577

    codingapple
    키 마스터
    load_weights 안에 경로입력시 .ckpt 파일경로 찾아서 입력해봅시다
    아니면 model.fit(test_data, batch_size=1, epochs=1) 1회하고 불러와봅시다
    #90640

    조승엽
    참가자
    아 제가 실수했었네요. 모델 저장한 곳에서 val도 나눴는데, 
    거기 파일에서 복사해서 붙인게 아니라 
    val 안나눈곳에서 복사해서 붙여넣었네요. 
    
    그런데 체크포인트 저장말고도, 모델 전체 저장도 가능하나요? 
    먼저 시도해 봤는데 안되서 저렇게 했어요.
    #90643

    codingapple
    키 마스터
    일부 모델은 load model 안되는 경우가 가끔있어서 그럴땐 체크포인트로 저장해두고 씁시다
6 글 보임 - 1 에서 6 까지 (총 6 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠