1つの層でCNNを構築しようとしましたが、いくつかの問題があります。確かに、コンピレーターは私にそれを言います
ValueError:モデル入力のチェック中にエラーが発生しました:conv1d_1_inputは3次元であると予想されますが、形状(569、30)の配列を取得しました
これはコードです
import numpy
from keras.models import Sequential
from keras.layers.convolutional import Conv1D
numpy.random.seed(7)
datasetTraining = numpy.loadtxt("CancerAdapter.csv",delimiter=",")
X = datasetTraining[:,1:31]
Y = datasetTraining[:,0]
datasetTesting = numpy.loadtxt("CancereEvaluation.csv",delimiter=",")
X_test = datasetTraining[:,1:31]
Y_test = datasetTraining[:,0]
model = Sequential()
model.add(Conv1D(2,2,activation='relu',input_shape=X.shape))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=150, batch_size=5)
scores = model.evaluate(X_test, Y_test)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
td; lrConv1d
のspatialディメンションが意味を持つようにデータを変更する必要があります。
X = np.expand_dims(X, axis=2) # reshape (569, 30) to (569, 30, 1)
# now input can be set as
model.add(Conv1D(2,2,activation='relu',input_shape=(30, 1))
基本的に次のようなデータセットを再形成します。
features
.8, .1, .3
.2, .4, .6
.7, .2, .1
に:
[[.8
.1
.3],
[.2,
.4,
.6
],
[.3,
.6
.1]]
説明と例
通常、畳み込みは空間次元にわたって機能します。カーネルは、次元にわたって「畳み込まれ」、テンソルを生成します。 Conv1Dの場合、カーネルはすべての例の「ステップ」次元に渡されます。
NLPで使用されるConv1Dが表示されます。steps
は、文中の単語数です(一定の最大長まで埋め込まれます)。単語は長さ4のベクトルとしてエンコードされます。
これが例文です:
jack .1 .3 -.52 |
is .05 .8, -.7 |<--- kernel is `convolving` along this dimension.
a .5 .31 -.2 |
boy .5 .8 -.4 \|/
そして、この場合の入力をconvに設定する方法:
maxlen = 4
input_dim = 3
model.add(Conv1D(2,2,activation='relu',input_shape=(maxlen, input_dim))
あなたの場合、フィーチャを空間次元として扱い、各フィーチャの長さは1です(以下を参照)。
これはデータセットの例です
att1 .04 |
att2 .05 | < -- kernel convolving along this dimension
att3 .1 | notice the features have length 1. each
att4 .5 \|/ example have these 4 featues.
そして、Conv1Dの例を次のように設定します。
maxlen = num_features = 4 # this would be 30 in your case
input_dim = 1 # since this is the length of _each_ feature (as shown above)
model.add(Conv1D(2,2,activation='relu',input_shape=(maxlen, input_dim))
ご覧のとおり、データセットを(569、30、1)に変更する必要があります。
X = np.expand_dims(X, axis=2) # reshape (569, 30, 1)
# now input can be set as
model.add(Conv1D(2,2,activation='relu',input_shape=(30, 1))
実行できる本格的な例を次に示します( Functional API を使用します)
from keras.models import Model
from keras.layers import Conv1D, Dense, MaxPool1D, Flatten, Input
import numpy as np
inp = Input(shape=(5, 1))
conv = Conv1D(filters=2, kernel_size=2)(inp)
pool = MaxPool1D(pool_size=2)(conv)
flat = Flatten()(pool)
dense = Dense(1)(flat)
model = Model(inp, dense)
model.compile(loss='mse', optimizer='adam')
print(model.summary())
# get some data
X = np.expand_dims(np.random.randn(10, 5), axis=2)
y = np.random.randn(10, 1)
# fit model
model.fit(X, y)
私は他の投稿でもこれについて言及しています:
シェイプ(nrows, ncols)
の通常のフィーチャテーブルデータをConv1d of Kerasに入力するには、次の2つの手順が必要です。
xtrain.reshape(nrows, ncols, 1)
# For conv1d statement:
input_shape = (ncols, 1)
たとえば、虹彩データセットの最初の4つの特徴を取得します。
通常の形式とその形状を確認するには:
iris_array = np.array(irisdf.iloc[:,:4].values)
print(iris_array[:5])
print(iris_array.shape)
出力は、通常の形式とその形状を示しています。
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]]
(150, 4)
次のコードは形式を変更します。
nrows, ncols = iris_array.shape
iris_array = iris_array.reshape(nrows, ncols, 1)
print(iris_array[:5])
print(iris_array.shape)
上記のコードデータ形式とその形状の出力:
[[[5.1]
[3.5]
[1.4]
[0.2]]
[[4.9]
[3. ]
[1.4]
[0.2]]
[[4.7]
[3.2]
[1.3]
[0.2]]
[[4.6]
[3.1]
[1.5]
[0.2]]
[[5. ]
[3.6]
[1.4]
[0.2]]]
(150, 4, 1)
これは、ケラスのConv1dに適しています。 input_shape (4,1)
が必要です。
詳細を見ることができなければ、データは前処理後に正しい形になりません。
Xを3次元に変形します。
np.reshape(X, (1, X.shape[0], X.shape[1]))
入力としてスパース行列があったので、通常の配列にキャストせずに再形成できませんでした
解決策は、keras Reshapeレイヤーを使用することでした。
from keras.layers.core import Reshape
...
model = Sequential()
model.add(Reshape((X.shape[1], 1), input_shape=(X.shape[1], )))
model.add(Conv1D(2,2,activation='relu'))
...