2017-05-20 7 views
0

그래서, 나는 외계 행성과 외계 행성 사이를 here의 케플러 데이터를 사용하여 분류하려고합니다. 데이터 유형은 (num_of_samples, 3197)의 차원을 갖는 시계열입니다. Keras에서 1D Convolutional Layer를 사용하여이 작업을 수행 할 수 있다고 생각했습니다. 하지만 크기를 엉망으로 유지하고 확인 모델 입력 할 때 다음과 같은 오류를Keras 1D CNN : 치수를 ​​올바르게 지정하는 방법은 무엇입니까?

오류를 얻을 : 예상 conv1d_1_input 모양 가지고 (없음, 3197, 1) 그러나 모양과 배열 (1, 570, 3197)

있어

질문은 다음과 같습니다.

1. 데이터 (training_set 및 test_set)를 3D 텐서로 변환해야합니까? 그렇다면 정확한 치수는 무엇입니까?

올바른 입력 모양은 무엇입니까? 나는 1 특징을위한 3197 timesteps가다는 것을 그러나 the documentation는 나가 두통을 얻고있다 그래야 그들이 TF 또는 theano 백엔드를 사용한다 ㄴ다는 것을 지정하지 않는다.

그런데 TF 백엔드를 사용하고 있습니다. 모든 종류의 도움을 크게 주시면 감사하겠습니다! 감사!

""" 
Created on Wed May 17 18:23:31 2017 

@author: Amajid Sinar 
""" 

import matplotlib.pyplot as plt 
import pandas as pd 
plt.style.use("ggplot") 
import numpy as np 

#Importing training set 
training_set = pd.read_csv("exoTrain.csv") 
X_train = training_set.iloc[:,1:].values 
y_train = training_set.iloc[:,0:1].values 

#Importing test set 
test_set = pd.read_csv("exoTest.csv") 
X_test = test_set.iloc[:,1:].values 
y_test = test_set.iloc[:,0:1].values 

#Scale the data 
from sklearn.preprocessing import StandardScaler 
sc = StandardScaler() 
X_train = sc.fit_transform(X_train) 
X_test = sc.fit_transform(X_test) 

#Convert data into 3d tensor 
X_train = np.reshape(X_train,(1,X_train.shape[0],X_train.shape[1])) 
X_test = np.reshape(X_test,(1,X_test.shape[0],X_test.shape[1])) 


#Importing convolutional layers 
from keras.models import Sequential 
from keras.layers import Convolution1D 
from keras.layers import MaxPooling1D 
from keras.layers import Flatten 
from keras.layers import Dense 
from keras.layers import Dropout 
from keras.layers.normalization import BatchNormalization 

#Convolution steps 
#1.Convolution 
#2.Max Pooling 
#3.Flattening 
#4.Full Connection 

#Initialising the CNN 
classifier = Sequential() 

#Input shape must be explicitly defined, DO NOT USE (None,shape)!!! 
#1.Multiple convolution and max pooling 
classifier.add(Convolution1D(filters=8, kernel_size=11, activation="relu", input_shape=(3197,1))) 
classifier.add(MaxPooling1D(strides=4)) 
classifier.add(BatchNormalization()) 
classifier.add(Convolution1D(filters=16, kernel_size=11, activation='relu')) 
classifier.add(MaxPooling1D(strides=4)) 
classifier.add(BatchNormalization()) 
classifier.add(Convolution1D(filters=32, kernel_size=11, activation='relu')) 
classifier.add(MaxPooling1D(strides=4)) 
classifier.add(BatchNormalization()) 
#classifier.add(Convolution1D(filters=64, kernel_size=11, activation='relu')) 
#classifier.add(MaxPooling1D(strides=4)) 


#2.Flattening 
classifier.add(Flatten()) 


#3.Full Connection 
classifier.add(Dropout(0.5)) 
classifier.add(Dense(64, activation='relu')) 
classifier.add(Dropout(0.25)) 
classifier.add(Dense(64, activation='relu')) 
classifier.add(Dense(1, activation='sigmoid')) 

#Configure the learning process 
classifier.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"]) 

#Train! 
classifier.fit_generator(X_train, steps_per_epoch=X_train.shape[0], epochs=1, validation_data=(X_test,y_test)) 

score = classifier.evaluate(X_test, y_test) 

답변

1
  1. 예 , 당신의 데이터 세트는 3 차원 텐서해야한다.

  2. 올바른 입력 모양 (tensorflow 백엔드)은 (sample_number, sample_size, channel_number)입니다. 오류 메시지에서 "예상 치수가 (없음, 3197, 1)"인지 확인할 수 있습니다.

'없음'은 교육에 사용되는 샘플의 수를 예상하므로 임의의 크기 치수를 나타냅니다.

올바른 모양은 (570, 3197, 1)입니다. 당신이 theano 백엔드를 사용하는 일이 있다면

먼저 채널 차원을 넣어해야합니다 (sample_number, CHANNEL_NUMBER, SAMPLE_SIZE) 또는 paricular 경우

(570,1, 3197)

+0

에서 당신의 응답을 주셔서 감사합니다. 시도해 본 후에 올바른 매개 변수가 있습니다. dataset = np.reshape (X_train, ** (570,3197,1) **) 입력 모양이 ** (없음, 3197)에서 작동하지 않습니다. , 1) ** ** ** (3197,1) **. 그럼에도 불구하고 고맙습니다! –

+0

내가 말한 것은 당신이했던 것처럼 데이터 집합의 형태를 변경해야한다는 것이 었습니다. "매개 변수"input_shape가 이미 정확합니다. – maz

+0

설명해 주셔서 감사합니다. 모든 당신을 위해 최고! –