2017-11-16 3 views
1

KERAS에서 내 NN 모델을 교육하는 것으로 끝났습니다. 여기 내 상황이 있습니다.Keras ValueError : 모델 타겟을 점검 할 때 오류가 발생했습니다. 예상 dense_18

  1. 나는 폴더가 있는데, 거기에 30 개의 CSV 파일이 있습니다. 모두 다른 이름입니다.

  2. 이제 분류를하고 있습니다.

  3. 각 CSV 파일 (아래에 표시된 어레이 dfs에서 읽은 후 5000,3은 단일 교육 인스턴스 자체이므로 30 개의 CSV에 대해 30 개의 교육 인스턴스가 있음).
  4. 파일 이름은 분류하려는 레이블입니다. 논문은 고유 한 3 가지 레이블로 하나의 핫 인코딩을 사용합니다.
  5. 나는 입력 모양과 훈련 데이터 dfs를 올바른 모양으로 재구성하는 방법에 혼란 스럽다.

참고 : 30 개의 관측치는 5000, 3 dim 및 filename의 CSV 파일 자체입니다.

여기 내 코드와 오류가 있습니다.

import os 
import glob 
import pandas as pd 
import numpy as np 
from keras.preprocessing.text import one_hot 
from keras.models import Sequential 
from keras.layers import Dense 

path = os.getcwd() 
file_list = glob.glob(path + '/*.csv') 
dfs=np.array([pd.read_csv(fp).values for fp in file_list]) 

dfs.shape 
# (30, 5000, 3) 

from sklearn.preprocessing import OneHotEncoder 
# define class labels 

labels = np.array([1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3]) 

onehot_encoder = OneHotEncoder(sparse=False) 
integer_encoded = labels.reshape(len(labels), 1) 
onehot_encoded = onehot_encoder.fit_transform(integer_encoded) 

len(onehot_encoded) 
print(onehot_encoded) 
# 30 
array([[ 1., 0., 0.], 
     [ 1., 0., 0.], 
     [ 1., 0., 0.], 
     [ 1., 0., 0.], 
     [ 1., 0., 0.], 
     [ 1., 0., 0.], 
     [ 1., 0., 0.], 
     [ 1., 0., 0.], 
     [ 1., 0., 0.], 
     [ 1., 0., 0.], 
     [ 0., 1., 0.], 
     [ 0., 1., 0.], 
     [ 0., 1., 0.], 
     [ 0., 1., 0.], 
     [ 0., 1., 0.], 
     [ 0., 1., 0.], 
     [ 0., 1., 0.], 
     [ 0., 1., 0.], 
     [ 0., 1., 0.], 
     [ 0., 1., 0.], 
     [ 0., 0., 1.], 
     [ 0., 0., 1.], 
     [ 0., 0., 1.], 
     [ 0., 0., 1.], 
     [ 0., 0., 1.], 
     [ 0., 0., 1.], 
     [ 0., 0., 1.], 
     [ 0., 0., 1.], 
     [ 0., 0., 1.], 
     [ 0., 0., 1.]]) 




model = Sequential() 
model.add(Dense(24, input_shape=(5000,3), activation='relu')) 
model.add(Dense(8)) 
model.add(Dense(3, activation='sigmoid')) 
# compile the model 
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc']) 

# summarize the model 
print(model.summary()) 



# fit the model 
model.fit(dfs, onehot_encoded, epochs=50, verbose=2) 

ERROR : 에 ValueError : 체크 모델 대상 오류 : 예상 dense_10 3 개 차원을 가지고 있지만 모양으로 배열을 가지고 할 (30, 3)

답변

2

레이블 배열 모양 (30,3)입니다 반면, 귀하의 모델은 (None, 5000, 3)이 될 것으로 기대하고 있습니다. - model.summary()을 항상 확인하여 도형의 상태를 이해하십시오.

조밀도 레이어는 마지막 치수에서만 작동하며 다른 모든 치수는 그대로 유지합니다. 입력이 (None, 5000, 3)이기 때문에 모든 Dense 레이어가 마지막 치수 만 변환하고 5000은 그대로 둡니다.

모델의 어느 시점에서 여분의 크기를 제거해야 레이블 ((None, 3))과 일치시킬 수 있습니다.

다양한 옵션이 있지만 가장 적합한 옵션은 모델에서 데이터를 해석하는 방법에 따라 다릅니다.

옵션 1 :

모든 5000 선이 완전히 독립적으로 서로 다른 성격 (그리고이 라인 사이의 일반적인 behavioer를 배울해야 모델)의 경우, 당신은 시작 부분에 Flatten() 레이어를 추가 할 수 있습니다 따라서 모델은 즉시 (None, 15000)이됩니다.

model.add(Flatten(input_shape=(5000,3))) #first layer in the model 

옵션 2 : 5000 개 라인 공통점을 공유하고, 그들이 동일한 성격의 다른 샘플 인 것처럼 모델이 그들을 치료하는 경우는 이제

, 마지막에 Flatten() 레이어를 넣어 마지막으로 Dense 앞에 있습니다.

예 :

model = Sequential() 
model.add(Dense(24, input_shape=(5000,3), activation='relu')) 
model.add(Dense(8)) 

#the flatten layer comes here: 
model.add(Flatten()) 
model.add(Dense(3, activation='sigmoid')) 

옵션 3 :

이 라인 시퀀스 (시계열)을 형성하고,이 순서가 진화 방법을 배우고 어떻게 든하려는 경우, 당신은 아마거야 너의 Dense 층을 LSTM 층으로 바꾼 더 좋은 결과를 얻으려면. 마지막 것만 제외하고 모두 return_sequences = True을 사용해야합니다.

예 : LSTM 보통 'TANH'는 기본 활성화와 더 잘 작동 있기 때문에

model = Sequential() 
model.add(LSTM(24, return_sequences=True,input_shape=(5000,3))) 
model.add(LSTM(8,return_sequences=True)) 

#here there are many possibilities as well, one of them being just another LSTM layer without return sequences: 
model.add(LSTM(3,return_sequences=False)) 
model.add(Activation('sigmoid')) 

내가 별도의 레이어에 활성화를 사용했다.

+0

나는 아주 좋은 정보를 주었다고 생각한다. 나는 똑같이 기대하고 있었다. 나는 옵션 1을했고 괜찮아 보인다. 확실하지 않은데, 입력 매개 변수로 두 번째 및 세 번째 부분을 수행하는 방법입니다. LSTM 아이디어에 많은 관심이 있습니다. 그렇습니다. 제 데이터는 시간에 따라 다릅니다. 제발 설명해주기 위해 그 덩어리를 써 주실 수 있습니까? 나는이 행성에서 가장 행복한 사람이 될 것입니다. 감사합니다 –

+0

다니엘 대단히 감사합니다. 이거 정말 좋다. 네, 확실히 이것을 정확하게 표시 할 것입니다. 하나의 CSV 파일을 하나의 교육 세트 (5000,3) 차원으로 사용하고 있기 때문에 문제가됩니다. 이 모델은이 부분을 이해하고 있습니까? 훈련을위한 인스턴스는 30 개 뿐이고 CSV 파일은 30 개뿐입니다. 의견에 "예"라고 적혀 있으면 한 번 내 질문을 검토하십시오. 나는 그저 기다리고있다. 훈련에는 몇 시간이 걸릴 수 있기 때문입니다. 지금 당장 올바른 것으로 표시하고 싶습니다. 또 다른 옵션이 있습니까, 이러한 모든 가중치를 저장하고 저장된 파일에서 테스트하기 위해 다시 모델을로드 할 수 있습니다. –

+0

예. 당신의 입력이'(30,5000,3)'과 같은 형태라면'input_shape = (5000,3)'을 사용하는 것이 옳다. 이 모델은 '30 개의 독립적 인 시퀀스', '각 시퀀스의 5000 개의 시간 단계', '각 시간 단계에 대한 3 개의 입력 변수/특징'을 보게 될 것입니다. –

관련 문제