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

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

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

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

Python

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

Q&A

解決済

1回答

1442閲覧

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

ib-k

総合スコア111

Keras

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

Python

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

0グッド

0クリップ

投稿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

1... 2 3def conv2d_bn(x, filters: int, 4 num_row: int, num_col: int, 5 padding: str = 'same', 6 strides: tuple = (1, 1), 7 name: str): 8 bn_name = name + '_bn' 9 conv_name = name + '_conv' 10 x = Conv2D( 11 filters, (num_row, num_col), 12 strides=strides, 13 padding=padding, 14 use_bias=False, 15 name=conv_name)(x) 16 x = BatchNormalization(name=bn_name)(x) 17 x = Activation('relu', name=name)(x) 18 return x 19 20 21def inception_block(x, name: str): 22 name = name + '_inception_block1 23 branch1x1 = conv2d_bn(x, 64, 1, 1, name=name+'.branch1x1') 24 branch5x5 = conv2d_bn(x, 48, 1, 1, name=name+'.branch5x5_1') 25 branch5x5 = Dropout(0.35, name=name+'.branch5x5_dropout')(branch5x5) 26 branch5x5 = conv2d_bn( 27 branch5x5, 64, 5, 5, name=name+'.branch5x5_2') 28 branch3x3dbl = conv2d_bn(x, 64, 1, 1, name=name+'.branch3x3dbl_1') 29 branch3x3dbl = conv2d_bn( 30 branch3x3dbl, 96, 3, 3, name=name+'.branch3x3dbl_2') 31 branch3x3dbl = Dropout( 32 0.35, name=name+'branch3x3dbl_dropout')(branch3x3dbl) 33 branch3x3dbl = conv2d_bn( 34 branch3x3dbl, 96, 3, 3, name=name+'.branch3x3dbl_3') 35 branch_pool = MaxPooling2D( 36 (3, 3), strides=(1, 1), padding='same', name=name+'.branch_pool')(x) 37 branch_pool = conv2d_bn( 38 branch_pool, 32, 1, 1, name=name+'.branch_pool_1') 39 return Concatenate(name=name+'_concat')( 40 [branch1x1, branch5x5, branch3x3dbl, branch_pool]) 41 42 43def base_inception_block(x, first_filters: int, second_filters: int, num_rows: int, num_cols: int, name: str): 44 large_filter = max(first_filters, second_filters) 45 small_filter = min(first_filters, second_filters) 46 large_row_col = max(num_rows, num_cols) 47 small_row_col = min(num_rows, num_cols) 48 branchsxs = conv2d_bn( 49 x, large_filter, small_row_col, small_row_col, name=name+f'.branch{small_row_col}x{small_row_col}') 50 51 branchlxl = conv2d_bn( 52 x, small_filter, small_row_col, small_row_col, name=name+f'.branch{large_row_col}x{large_row_col}_1') 53 branchlxl = conv2d_bn( 54 branchlxl, small_filter, small_row_col, large_row_col, name=name+f'.branch{large_row_col}x{large_row_col}_2') 55 branchlxl = Dropout( 56 0.35, name=name+f'.branch{large_row_col}x{large_row_col}_pool')(branchlxl) 57 branchlxl = conv2d_bn( 58 branchlxl, large_filter, large_row_col, small_row_col, name=name+f'.branch{large_row_col}x{large_row_col}_3') 59 60 branchlxldbl = conv2d_bn( 61 x, small_filter, small_row_col, small_row_col, name=name+f'.branch{large_row_col}x{large_row_col}dbl_1') 62 branchlxldbl = conv2d_bn( 63 branchlxldbl, small_filter, large_row_col, small_row_col, name=name+f'.branch{large_row_col}x{large_row_col}dbl_2') 64 branchlxldbl = conv2d_bn( 65 branchlxldbl, small_filter, small_row_col, large_row_col, name=name+f'.branch{large_row_col}x{large_row_col}dbl_3') 66 branchlxldbl = conv2d_bn( 67 branchlxldbl, small_filter, large_row_col, small_row_col, name=name+f'.branch{large_row_col}x{large_row_col}dbl_4') 68 branchlxldbl = Dropout( 69 0.35, name=name+f'.branch{large_row_col}x{large_row_col}dbl_dropout')(branchlxldbl) 70 branchlxldbl = conv2d_bn( 71 branchlxldbl, large_filter, small_row_col, large_row_col, name=name+f'.branch{large_row_col}x{large_row_col}dbl_5') 72 73 branch_pool = AveragePooling2D( 74 (3, 3), strides=(1, 1), padding='same', name=name+'.branch_pool')(x) 75 branch_pool = Dropout( 76 0.35, name=name+'.branch_pool_dropout')(branch_pool) 77 branch_pool = conv2d_bn( 78 branch_pool, large_filter, small_row_col, small_row_col, name=name+'branch_pool_1') 79 return Concatenate(name=name+'_concat')( 80 [branchsxs, branchlxl, branchlxldbl, branch_pool]) 81 82 83def inception_block3(x, name: str = None): 84 return base_inception_block(x, 192, 128, 1, 7, name=name+'_inception_block3') 85 86 87def train_data(input_shape, batch_size, data_folder): 88 idg_train = ImageDataGenerator( 89 rescale=1.0/255.0, 90 rotation_range=30, 91 zoom_range=0.2, 92 ) 93 idg_validation = ImageDataGenerator( 94 rescale=1.0/255.0 95 ) 96 gen_train = idg_train.flow_from_directory( 97 directory=data_folder+"train", 98 target_size=input_shape[:2], 99 batch_size=batch_size, 100 class_mode='categorical', 101 ) 102 gen_validation = idg_validation.flow_from_directory( 103 directory=data_folder+"test", 104 target_size=input_shape[:2], 105 batch_size=batch_size, 106 class_mode='categorical', 107 shuffle=False 108 ) 109 return gen_train, gen_validation 110 111 112def main(model_name, model_dir_num, epochs, batch_size, num_classes, input_shape, create_model, learn_late, data_folder=None): 113 gen_train, gen_valid = train_data(input_shape, batch_size, data_folder) 114 tensorboard = callbacks.TensorBoard(model_dir_num+'logs/', histogram_freq=1) 115 modelcheckpoint = callbacks.ModelCheckpoint(model_dir_num+'checkpoint_{epoch}.h5') 116 callBackList = [tensorboard, modelcheckpoint] 117 model = create_model(num_classes, input_shape) 118 optimizer = tf.keras.optimizers.Adam(learn_late) 119 120 model.compile(loss='categorical_crossentropy',optimizer=optimizer, metrics=['acc']) 121 122 model.summary() 123 with open(model_dir_num+model_name+"_model_summary.txt", "w") as fp: 124 model.summary(print_fn=lambda x: fp.write(x + "\n")) 125 126 model.fit(gen_train, callbacks=callBackList, steps_per_epoch=gen_train.n//batch_size, 127 epochs=epochs, validation_data=gen_valid, validation_steps=1, batch_size=batch_size) 128 129 save_name = model_dir_num+'model_'+model_name+f'_{batch_size}_{epochs}.h5' 130 model.save(save_name) 131 return model 132 133 134def MyNet2(classes, input_shape): 135 inputs = Input(shape=input_shape) 136 x = conv2d_bn(inputs, 32, 3, 3, name='conv1') 137 x = conv2d_bn(x, 32, 3, 3, name='conv2') 138 x = MaxPooling2D(3, 3, name='pool1')(x) 139 shortcut = x 140 x = inception_block(x, name='block1.') 141 x = Concatenate(name='concat1')([x, shortcut]) 142 x = inception_block3(x, name='block3.') 143 x = MaxPooling2D((3, 3), name='pool3')(x) 144 x = inception_block3(x, name='block3-1.') 145 x = MaxPooling2D((3, 3), name='pool3-1')(x) 146 x = GlobalAvgPool2D(name='avg_pool')(x) 147 x = Dense(classes, activation='softmax', name='predictions')(x) 148 return Model(inputs=inputs, outputs=x) 149 150 151if __name__ == '__main__': 152 model_name = os.path.splitext(os.path.basename(__file__))[0] 153 model_dir = model_name+'/' 154 model_num = input('Input the model number: ') 155 model_dir_num = model_dir+model_num+'/' 156 os.makedirs(model_dir_num, exist_ok=True) 157 input_shape = (200, 200, 3) 158 num_classes = 3 159 batch_size = 5 160 data_folder = "./janken/" 161 epochs = 20 162 learn_rate = 1e-3 163 main(model_name, model_dir_num, epochs, batch_size, num_classes, 164 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

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

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

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

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

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

guest

回答1

0

自己解決

model.fitの引数validation_steps=1validation_steps=gen_valid.n//batch_sizeにしたら正しく動きました。
https://teratail.com/questions/175306

投稿2022/04/29 12:49

ib-k

総合スコア111

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問