2017-05-20 11 views
0

私がしようとしているのは、得られたケプラーデータを用いて、外来植物と非外来植物を分類することです。here。データ型は、次元が(、num_of_samples、3197)の時系列です。私はこれがKerasの1D畳み込みレイヤーを使って実行できることを理解しました。しかし、私は寸法をいじり続けると、次のエラーにモデル入力をチェックしませんKeras 1D CNN:ディメンションを正しく指定する方法は?

エラーを取得:(1、570、3197)

を(なし、3197、1)の形状を有することが期待conv1d_1_inputをしかし形状を持つ配列を得たが

質問:

1.データ(training_setとtest_set)を3Dテンソルに変換する必要がありますか?はいの場合、正しい次元は何ですか?

2.正しい入力形状は何ですか?私は1つの機能に対して3197のタイムステップを持っていることを知っていますが、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. はい、あなたのデータセットが3Dテンソルでなければなりません。

  2. (sample_number、sample_size、channel_number)が正しい入力形状です。エラーメッセージから、「予想される次元は(None、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

私が言ったのは、あなたがしたようにあなたのデータセットの形を変えなければならないということでした。 "parameter" input_shapeはすでに正しいです。 – maz

+0

私は分かりました、ありがとう!すべてあなたのために最高! –

関連する問題