bjpublic / deepwalk

4 stars 5 forks source link

Data cardinality is ambiguous error가 발생됩니다. #3

Open KevinRyu opened 4 years ago

KevinRyu commented 4 years ago

안녕하세요,

책의 예제에서 다:1 회귀 케이스에 대해 질문 드립니다. model.fit( x_train, y_train, ...) 에서 x_train, y_train의 dimension이 달라도 실행이 가능한가요? 숫자 Data를 아래와 같이 만들어 실행시키면, 아래와 같은 에러가 발생됩니다. 에러는 x_train, y_train의 차원 차이에서 발생되는것 같습니다.

어떻게 해결할 수 있을까요?

Data: x_train y_train x_test y_test x_predict Data shape: (8, 381) (381,) (3, 381) (381,) (2, 381) Data type: <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'>

에러: ValueError: Data cardinality is ambiguous: x sizes: 8 y sizes: 381 Please provide data which shares the same first dimension.

모델: w_init = 'he_normal' model = keras.Sequential() model.add(keras.layers.Dense(units = 1, activation = 'linear', input_shape=(8, ), kernel_initializer=w_init)) model.add(keras.layers.Dense(units = 64, activation = 'relu', kernel_initializer=w_init)) model.add(keras.layers.Dense(units = 1, activation = 'linear', kernel_initializer=w_init)) model.compile(loss='mse', optimizer="adam", metrics=['mse'])

bjpublic commented 4 years ago

안녕하세요, 비제이퍼블릭입니다. 문의하신 내용에 대한 저자 답변 공유해드립니다. 감사합니다.

===================================================================================

  1. 우선 x와 y의 데이터의 shape가 맞지 않군요. x는 381개의 특성(컬럼, 열)을 가진 8개의 데이터인데, y는 381개의 데이터입니다. 독자님이 제시한 x_train이 (8, 381)이 맞는 데이터 구조 라면 y_train은 (8, ) 가 되어야 합니다.

               x           y

train (8, 381) (8, )

test (3, 381) (3, )

predict (2, 381) (2, )

  1. 하지만 만일 y_train이 맞는 데이터 구조라면, 독자님이 x_train이 (381, 8)의 shape를 가진 구조를 의도한 것이 아닐까 생각되는 군요. 하지만 이 역시도 test와 predict에서 shape 오류가 발생합니다.

               x             y

train (381, 8) (381, )

test (381, 3) train과 열의 갯수가 달라서 모델 구성 안됨

predict (381, 2) train과 열의 갯수가 달라서 모델 구성 안됨

  1. 결과적으로 현재 1번의 경우만이 모델을 구성할 수 있는 상황입니다. 이 경우에도 독자님의 소스의 input_shape 부분을 input_shape=(381, ) 로 바꾸셔야 합니다.

===================================================================================

KevinRyu commented 4 years ago

안녕하세요,

우선 감사합니다. 그런데 예제와 같은 dataset 구조인데 에러가 나서 문의 드렸던 겁니다.

책의 예제는 아래와 같습니다.

x_train = np.array([[1,2,3,4,5,6,7,], [11,12,13,14,15,16,17]]) y_train = np.array([1,2,3,4,5,6,7,]) x_test = np.array([[8,9,10], [18,19,20]]) y_test = np.array([8,9,10]) x_prediction = np.array([[21,22,23], [31,32,33]])

(2, 7) (7,) (2, 3) (3,) (2, 3) <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'>

문의한 코드 Data: x_train y_train x_test y_test x_predict Data shape: (8, 381) (381,) (3, 381) (381,) (2, 381) Data type: <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'>

독자님이 x_train이 (381, 8)의 shape를 가진 구조를 의도한 것 --> 의도는 위와 같이 8개 row에 381개의 데이터를 가진 구조입니다. 따라서 8개가 컬럼이 아닌 381개가 컬럼데이터 이면서 학습해야할 데이터 입니다.

답 주신바를 제가 이해하자면

  1. fit 함수에서 x, y의 dimension이 무조건 같아야 한다.
  2. x, y가 2D일때, 예를들어 x = [x1, x2, x3], x1=[a,b,c, d] ... --> (3, 4) 구조를 x = x.T로 사용해야 함

이와 같이 이해하는게 맞는건가요?

fit함수의 x, y document에도 dimension에 대한 구체적인 내용이 없어서 어렵습니다. 2D일때 1D로 flatten해서 넣어줘야 하는지 아니면 Transpose 하거나 해야하는지요.

bjpublic commented 4 years ago

예제가 106쪽 예제인듯하네요. 명시해주신 예제는 x의 shape 부분이 맞지 않아 모델이 구성되지 않습니다. 책에서는 이 예제의 모델을 구성하기 위해 x데이터를 transpose 해서 107쪽 예제로 구성했습니다.

106쪽 : (2, 7) (7,) (2, 3) (3,) (2, 3) 107쪽 : (7, 2) (7,) (3, 2) (3,) (3, 2)

실질적으로 컬럼이 중요한 피처이기때문에 Dense 모델을 구성할 때 input_shape에 행은 명시하지 않습니다.

x의 행의 갯수 만큼 y의 결과값이 있어야하는것은 당연 한것입니다. x의 행이 1만개인데, y가 50개일 수는 없고, y도 당연히 1만개여야 데이터가 구성됩니다.

결국 독자님의 x의 데이터 구조가 8행 381열이라면, y는 행의 갯수만큼 스칼라가 존재해야합니다. 결국 y는 8개겠죠?

(8, 381) (8, ), (3, 381 ) (3, ), (2, 381)

모델: w_init = 'he_normal' model = keras.Sequential() model.add(keras.layers.Dense(units = 1, activation = 'linear', input_shape=(381, ), kernel_initializer=w_init)) model.add(keras.layers.Dense(units = 64, activation = 'relu', kernel_initializer=w_init)) model.add(keras.layers.Dense(units = 1, activation = 'linear', kernel_initializer=w_init)) model.compile(loss='mse', optimizer="adam", metrics=['mse'])

KevinRyu commented 4 years ago

감사합니다. 이해했습니다. 수고하세요!

2020년 7월 22일 (수) 오후 12:18, BJPUBLIC notifications@github.com님이 작성:

예제가 106쪽 예제인듯하네요. 명시해주신 예제는 x의 shape 부분이 맞지 않아 모델이 구성되지 않습니다. 책에서는 이 예제의 모델을 구성하기 위해 x데이터를 transpose 해서 107쪽 예제로 구성했습니다.

106쪽 : (2, 7) (7,) (2, 3) (3,) (2, 3) 107쪽 : (7, 2) (7,) (3, 2) (3,) (3, 2)

실질적으로 컬럼이 중요한 피처이기때문에 Dense 모델을 구성할 때 input_shape에 행은 명시하지 않습니다.

x의 행의 갯수 만큼 y의 결과값이 있어야하는것은 당연 한것입니다. x의 행이 1만개인데, y가 50개일 수는 없고, y도 당연히 1만개여야 데이터가 구성됩니다.

결국 독자님의 x의 데이터 구조가 8행 381열이라면, y는 행의 갯수만큼 스칼라가 존재해야합니다. 결국 y는 8개겠죠?

(8, 381) (8, ), (3, 381 ) (3, ), (2, 381)

모델: w_init = 'he_normal' model = keras.Sequential() model.add(keras.layers.Dense(units = 1, activation = 'linear', input_shape=(381, ), kernel_initializer=w_init)) model.add(keras.layers.Dense(units = 64, activation = 'relu', kernel_initializer=w_init)) model.add(keras.layers.Dense(units = 1, activation = 'linear', kernel_initializer=w_init)) model.compile(loss='mse', optimizer="adam", metrics=['mse'])

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/bjpublic/deepwalk/issues/3#issuecomment-662217968, or unsubscribe https://github.com/notifications/unsubscribe-auth/AG43MBLWJHT3X3GADEFHJWTR4ZK63ANCNFSM4OY74PGA .