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

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

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

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

Python

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

解決済

val_accが1か0にはりつきます。

ib-k
ib-k

総合スコア92

Keras

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

Python

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

1回答

0評価

0クリップ

210閲覧

投稿2022/04/26 12:46

前提

val_accが1か0にはりつきます。
mnistでは正しく動きました(28x28)

実現したいこと

val_accが正しく反映されるようにする。

Epoch 1/10 2022-04-26 09:52:59.932390: I tensorflow/stream_executor/cuda/cuda_dnn.cc:384] Loaded cuDNN version 8204 80/80 [==============================] - 41s 450ms/step - loss: 0.8747 - accuracy: 0.8060 - val_loss: 3.2281 - val_accuracy: 0.2467 Epoch 2/10 80/80 [==============================] - 36s 445ms/step - loss: 0.1656 - accuracy: 0.9689 - val_loss: 2.5954 - val_accuracy: 0.2627 ... Epoch 9/10 80/80 [==============================] - 36s 447ms/step - loss: 0.0239 - accuracy: 0.9942 - val_loss: 0.0484 - val_accuracy: 0.9827 Epoch 10/10 80/80 [==============================] - 36s 447ms/step - loss: 0.0207 - accuracy: 0.9955 - val_loss: 0.0915 - val_accuracy: 0.9733

発生している問題・エラーメッセージ

Epoch 1/20 432/432 [==============================] - 88s 190ms/step - loss: 1.0852 - acc: 0.4661 - val_loss: 0.3748 - val_acc: 1.0000 Epoch 2/20 432/432 [==============================] - 81s 187ms/step - loss: 0.9448 - acc: 0.5353 - val_loss: 9.5968 - val_acc: 0.0000e+00 Epoch 3/20 432/432 [==============================] - 80s 186ms/step - loss: 0.8164 - acc: 0.6229 - val_loss: 0.7380 - val_acc: 0.2000 Epoch 4/20 432/432 [==============================] - 81s 187ms/step - loss: 0.7515 - acc: 0.6568 - val_loss: 1.6861 - val_acc: 0.0000e+00 ... Epoch 17/20 432/432 [==============================] - 82s 189ms/step - loss: 0.2668 - acc: 0.8966 - val_loss: 0.0048 - val_acc: 1.0000 Epoch 18/20 432/432 [==============================] - 82s 190ms/step - loss: 0.2838 - acc: 0.8910 - val_loss: 0.0201 - val_acc: 1.0000 Epoch 19/20 432/432 [==============================] - 82s 189ms/step - loss: 0.2151 - acc: 0.9147 - val_loss: 2.7468 - val_acc: 0.0000e+00 Epoch 20/20 432/432 [==============================] - 82s 189ms/step - loss: 0.2349 - acc: 0.9212 - val_loss: 0.0049 - val_acc: 1.0000

該当のソースコード

python

... def conv2d_bn(x, filters: int, num_row: int, num_col: int, padding: str = 'same', strides: tuple = (1, 1), name: str): bn_name = name + '_bn' conv_name = name + '_conv' x = Conv2D( filters, (num_row, num_col), strides=strides, padding=padding, use_bias=False, name=conv_name)(x) x = BatchNormalization(name=bn_name)(x) x = Activation('relu', name=name)(x) return x def inception_block(x, name: str): name = name + '_inception_block1 branch1x1 = conv2d_bn(x, 64, 1, 1, name=name+'.branch1x1') branch5x5 = conv2d_bn(x, 48, 1, 1, name=name+'.branch5x5_1') branch5x5 = Dropout(0.35, name=name+'.branch5x5_dropout')(branch5x5) branch5x5 = conv2d_bn( branch5x5, 64, 5, 5, name=name+'.branch5x5_2') branch3x3dbl = conv2d_bn(x, 64, 1, 1, name=name+'.branch3x3dbl_1') branch3x3dbl = conv2d_bn( branch3x3dbl, 96, 3, 3, name=name+'.branch3x3dbl_2') branch3x3dbl = Dropout( 0.35, name=name+'branch3x3dbl_dropout')(branch3x3dbl) branch3x3dbl = conv2d_bn( branch3x3dbl, 96, 3, 3, name=name+'.branch3x3dbl_3') branch_pool = MaxPooling2D( (3, 3), strides=(1, 1), padding='same', name=name+'.branch_pool')(x) branch_pool = conv2d_bn( branch_pool, 32, 1, 1, name=name+'.branch_pool_1') return Concatenate(name=name+'_concat')( [branch1x1, branch5x5, branch3x3dbl, branch_pool]) def base_inception_block(x, first_filters: int, second_filters: int, num_rows: int, num_cols: int, name: str): large_filter = max(first_filters, second_filters) small_filter = min(first_filters, second_filters) large_row_col = max(num_rows, num_cols) small_row_col = min(num_rows, num_cols) branchsxs = conv2d_bn( x, large_filter, small_row_col, small_row_col, name=name+f'.branch{small_row_col}x{small_row_col}') branchlxl = conv2d_bn( x, small_filter, small_row_col, small_row_col, name=name+f'.branch{large_row_col}x{large_row_col}_1') branchlxl = conv2d_bn( branchlxl, small_filter, small_row_col, large_row_col, name=name+f'.branch{large_row_col}x{large_row_col}_2') branchlxl = Dropout( 0.35, name=name+f'.branch{large_row_col}x{large_row_col}_pool')(branchlxl) branchlxl = conv2d_bn( branchlxl, large_filter, large_row_col, small_row_col, name=name+f'.branch{large_row_col}x{large_row_col}_3') branchlxldbl = conv2d_bn( x, small_filter, small_row_col, small_row_col, name=name+f'.branch{large_row_col}x{large_row_col}dbl_1') branchlxldbl = conv2d_bn( branchlxldbl, small_filter, large_row_col, small_row_col, name=name+f'.branch{large_row_col}x{large_row_col}dbl_2') branchlxldbl = conv2d_bn( branchlxldbl, small_filter, small_row_col, large_row_col, name=name+f'.branch{large_row_col}x{large_row_col}dbl_3') branchlxldbl = conv2d_bn( branchlxldbl, small_filter, large_row_col, small_row_col, name=name+f'.branch{large_row_col}x{large_row_col}dbl_4') branchlxldbl = Dropout( 0.35, name=name+f'.branch{large_row_col}x{large_row_col}dbl_dropout')(branchlxldbl) branchlxldbl = conv2d_bn( branchlxldbl, large_filter, small_row_col, large_row_col, name=name+f'.branch{large_row_col}x{large_row_col}dbl_5') branch_pool = AveragePooling2D( (3, 3), strides=(1, 1), padding='same', name=name+'.branch_pool')(x) branch_pool = Dropout( 0.35, name=name+'.branch_pool_dropout')(branch_pool) branch_pool = conv2d_bn( branch_pool, large_filter, small_row_col, small_row_col, name=name+'branch_pool_1') return Concatenate(name=name+'_concat')( [branchsxs, branchlxl, branchlxldbl, branch_pool]) def inception_block3(x, name: str = None): return base_inception_block(x, 192, 128, 1, 7, name=name+'_inception_block3') def train_data(input_shape, batch_size, data_folder): idg_train = ImageDataGenerator( rescale=1.0/255.0, rotation_range=30, zoom_range=0.2, ) idg_validation = ImageDataGenerator( rescale=1.0/255.0 ) gen_train = idg_train.flow_from_directory( directory=data_folder+"train", target_size=input_shape[:2], batch_size=batch_size, class_mode='categorical', ) gen_validation = idg_validation.flow_from_directory( directory=data_folder+"test", target_size=input_shape[:2], batch_size=batch_size, class_mode='categorical', shuffle=False ) return gen_train, gen_validation def main(model_name, model_dir_num, epochs, batch_size, num_classes, input_shape, create_model, learn_late, data_folder=None): gen_train, gen_valid = train_data(input_shape, batch_size, data_folder) tensorboard = callbacks.TensorBoard(model_dir_num+'logs/', histogram_freq=1) modelcheckpoint = callbacks.ModelCheckpoint(model_dir_num+'checkpoint_{epoch}.h5') callBackList = [tensorboard, modelcheckpoint] model = create_model(num_classes, input_shape) optimizer = tf.keras.optimizers.Adam(learn_late) model.compile(loss='categorical_crossentropy',optimizer=optimizer, metrics=['acc']) model.summary() with open(model_dir_num+model_name+"_model_summary.txt", "w") as fp: model.summary(print_fn=lambda x: fp.write(x + "\n")) model.fit(gen_train, callbacks=callBackList, steps_per_epoch=gen_train.n//batch_size, epochs=epochs, validation_data=gen_valid, validation_steps=1, batch_size=batch_size) save_name = model_dir_num+'model_'+model_name+f'_{batch_size}_{epochs}.h5' model.save(save_name) return model def MyNet2(classes, input_shape): inputs = Input(shape=input_shape) x = conv2d_bn(inputs, 32, 3, 3, name='conv1') x = conv2d_bn(x, 32, 3, 3, name='conv2') x = MaxPooling2D(3, 3, name='pool1')(x) shortcut = x x = inception_block(x, name='block1.') x = Concatenate(name='concat1')([x, shortcut]) x = inception_block3(x, name='block3.') x = MaxPooling2D((3, 3), name='pool3')(x) x = inception_block3(x, name='block3-1.') x = MaxPooling2D((3, 3), name='pool3-1')(x) x = GlobalAvgPool2D(name='avg_pool')(x) x = Dense(classes, activation='softmax', name='predictions')(x) return Model(inputs=inputs, outputs=x) if __name__ == '__main__': model_name = os.path.splitext(os.path.basename(__file__))[0] model_dir = model_name+'/' model_num = input('Input the model number: ') model_dir_num = model_dir+model_num+'/' os.makedirs(model_dir_num, exist_ok=True) input_shape = (200, 200, 3) num_classes = 3 batch_size = 5 data_folder = "./janken/" epochs = 20 learn_rate = 1e-3 main(model_name, model_dir_num, epochs, batch_size, num_classes, input_shape, MyNet2, learn_late=learn_rate, data_folder=data_folder)

試したこと

学習率を上げたり下げたりしましたが変わりませんでした。

補足情報(FW/ツールのバージョンなど)

python 3.8 tensorflow 2.7.1 tensorflow-gpu 2.7.1 CUDA 11.4 cudnn 8.2.4 for cuda 11.4

ただ、おそらく学習は正しく行っているようです。(epochが少ないのであまり精度はよくないですが、)

python predict.py test_Mynet2/2/model_test_Mynet2_5_20.h5 [混合行列] 0_gu 1_tyoki 2_pa 0_gu 165 0 0 1_tyoki 65 121 0 2_pa 29 31 129 再現率(平均): 0.77769 適合率(平均): 0.81103 F値(平均) : 0.768532

学習に使っている画像は次のようなものです。
イメージ説明

ちなみに1epoch目はこうなります。

[混合行列] 0_gu 1_tyoki 2_pa 0_gu 165 0 0 1_tyoki 186 0 0 2_pa 165 0 24

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Keras

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

Python

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