前提
opencvで読み込んだ動画フレーム配列(10000,64,64,3) をnumpyでグレースケールの配列(10000,64,64)とし、それらを指定したフレームで抽出したもの、例えば(100,64,64)のデータを2セットを標準化(max-min normalization)等で処理したしたデータを扱っています。
#10000フレーム、64x64、rgbデータ
データ数は極端に少ないのですが,すべて同じ画角の映像で変動が小さいものを見ているため、水増しを行った方がいいのかがわからずそのままでやっております。
実現したいこと
・これらの2セットのデータをCNNで2クラス分類を行うこと。
・Dense=2で実行したい(そもそも2とするのが正しいのか不明)
・Dense=1だと実行できるが正答率が50パーセント程度で返ってくる。一方でscikit-learnのknn法では80%を超えるためスクリプトが間違っているのではないかを確認したい。
・この稚拙な質問からもし私が理解不足であると推察されるところがあれば遠慮なくご教示願いたい。
発生している問題・エラーメッセージ
様々な記事を参考にさせていただいたところ,出力層のDenseは2クラス分類のため2とするのが常のようですが,2で実行すると以下のエラー文が出力されます。
ValueError: `logits` and `labels` must have the same shape, received ((None, 2) vs (None, 1)).
該当のソースコード
from keras.models import Sequential from keras.layers import Dense from keras.layers.convolutional import MaxPooling2D from keras.layers import Activation, Conv2D, Flatten, Dense,Dropout from keras import optimizers #データ型 print(data1.shape) #(100, 64, 64) print(data1.shape) #(100, 64, 64) dataset = np.vstack([data1,data2]) #(200,64,64) #正解ラベルを生成 label = [] label += [0]*100 + [1]*100 #パラメータ width=64 height=64 #モデル model = Sequential() # 1層目 model.add(Conv2D(32,(3,3),padding="same", input_shape=(width,height))) model.add(Activation('relu')) # 2層目 model.add(Conv2D(32,(3,3))) model.add(Activation('relu')) # 3層目 (Max Pooling) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.3)) # 4層目 (畳み込み) model.add(Conv2D(64,(3,3),padding="same")) model.add(Activation('relu')) # 5層目 (畳み込み) model.add(Conv2D(64,(3,3))) model.add(Activation('relu')) # 6層目 (Max Pooling) model.add(MaxPooling2D(pool_size=(2,2))) # データを1次元化 model.add(Flatten()) # 7層目 (全結合層) model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.5)) # 出力層(softmaxで0〜1の確率を返す) model.add(Dense(2)) #問題の文 model.add(Activation('softmax')) Adam = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False) model.summary() X_train, X_test, y_train, y_test = train_test_split(pretone_dataset_cnn,label) optimizers ="Adam" history = {} epochs =問題の model.compile(loss='binary_crossentropy', optimizer=optimizers, metrics=['accuracy']) history= model.fit(X_train, y_train, epochs=epochs )
試したこと
X_train = np.array(X_train)
X_test = np.array(X_test)
y_train = np.array(y_train)
y_test = np.array(y_test)
とするとよいというような記事もあったため,この文を入れています。
また,グレースケールの情報を含めるために
dataset = np.array(dataset)
dataset = dataset.reshape(200,64,64,1)
input_shape=(width,height,1)
のようなこともしましたが変化はありませんでした。

回答1件
あなたの回答
tips
プレビュー