質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

536閲覧

2クラス分類の出力層Denseの値が2で実行できないことを改善したい

hiro_autumn

総合スコア1

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/11/09 03:55

前提

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)
のようなこともしましたが変化はありませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PondVillege

2022/11/09 05:16

出力データはOneHot Encodingしましたか? そうでないにしても損失関数に誤りがあります. もしOneHot Encodingしてないなら損失関数はsparse_categorical_crossentropyですし, OneHot Encodingしたならcategorical_crossentropyにしなくてはなりません, ちなみに2値出力を2出力にしたところで精度は変化しません.50件のラベル0データと50件のラベル1データがあって精度が50%ということは,ネットワークは答えをランダムに吐き出していることと同義です. また,trainデータとtestデータにtrain_test_splitで切り分けたにも関わらず,testの方を利用できていません.Validationデータとしてmodel.fitに渡して利用ください
hiro_autumn

2022/11/09 07:47

ご回答ありがとうございます。 one hot encodingはしていなかったため,sparse_categorical_crossentropyにしました。 testデータをfitに渡し,ほかの回答者様のアドバイスも加味して実行したところ,うまくいきました!ありがとうございます。
guest

回答1

0

ベストアンサー

最初にInputレイヤーを入れてください。
また、グレースケール画像を使用する場合はshapeを(batch_size, hsize, wsize, csize)の形状にして下さい。

python

1from keras.models import Sequential 2from keras.layers import Dense 3from keras.layers import MaxPooling2D 4from keras.layers import Activation, Conv2D, Flatten, Dense,Dropout, Input 5from keras import optimizers 6 7#パラメータ 8width=64 9height=64 10 11#モデル 12model = Sequential() 13 14# 1層目 15model.add(Input((64, 64, 1))) # 追加レイヤー 16model.add(Conv2D(32,(3,3),padding="same", input_shape=(width,height))) 17model.add(Activation('relu')) 18# 2層目 19model.add(Conv2D(32,(3,3))) 20model.add(Activation('relu')) 21# 3層目 (Max Pooling) 22model.add(MaxPooling2D(pool_size=(2,2))) 23model.add(Dropout(0.3)) 24# 4層目 (畳み込み) 25model.add(Conv2D(64,(3,3),padding="same")) 26model.add(Activation('relu')) 27# 5層目 (畳み込み) 28model.add(Conv2D(64,(3,3))) 29model.add(Activation('relu')) 30# 6層目 (Max Pooling) 31model.add(MaxPooling2D(pool_size=(2,2))) 32# データを1次元化 33model.add(Flatten()) 34# 7層目 (全結合層) 35model.add(Dense(512)) 36model.add(Activation('relu')) 37model.add(Dropout(0.5)) 38# 出力層(softmaxで0〜1の確率を返す) 39model.add(Dense(2)) #問題の文 40model.add(Activation('softmax')) 41 42Adam = optimizers.adam_v2.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False) 43 44model.summary() 45model.compile(loss='sparse_categorical_crossentropy', optimizer=[Adam], metrics=['accuracy'])

投稿2022/11/09 05:18

編集2022/11/09 06:58
kenhara

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PondVillege

2022/11/09 06:53

space_categorical_crossentropyじゃなくてsparse_categorical_crossentropyではないでしょうか?
hiro_autumn

2022/11/09 07:48

ご回答ありがとうございました。なんとかうまく動かすことができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問