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

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

新規登録して質問してみよう
ただいま回答率
85.35%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

機械学習

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

Python

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

Q&A

解決済

1回答

5830閲覧

Val_accuracyの値が変化しない。

Luiahu

総合スコア2

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/12/25 13:28

編集2021/12/25 14:05

現在、製品の不良品を検知するプログラムをGoogle Colaboratoryで作成しようとしています。
VGG16を転移学習して、識別しようとしているのですが現在、損失関数と識別率が以下の通りになっておりまったく学習できていない状態です。
このような現状を解決するアドバイスをいただきたいです。
![イメージ説明イメージ説明

また、val_accuracyの値が変化しないです。

Epoch 1/100 5/5 [==============================] - 5s 1s/step - loss: 0.8709 - accuracy: 0.4800 - val_loss: 0.7470 - val_accuracy: 0.2240 Epoch 2/100 5/5 [==============================] - 4s 982ms/step - loss: 0.6408 - accuracy: 0.6160 - val_loss: 0.9470 - val_accuracy: 0.2000 Epoch 3/100 5/5 [==============================] - 4s 981ms/step - loss: 0.4567 - accuracy: 0.7680 - val_loss: 1.2471 - val_accuracy: 0.2000 Epoch 4/100 5/5 [==============================] - 5s 1s/step - loss: 0.3266 - accuracy: 0.9040 - val_loss: 1.5914 - val_accuracy: 0.2000 Epoch 5/100 5/5 [==============================] - 4s 982ms/step - loss: 0.1663 - accuracy: 0.9920 - val_loss: 1.9080 - val_accuracy: 0.2000

以下コード全文です。

python

1from google.colab import drive 2drive.mount('/content/drive') 3 4import pandas as pd 5import os 6import numpy as np 7from keras.applications.vgg16 import VGG16 8from keras.preprocessing.image import load_img, img_to_array 9from keras.models import Sequential, Model 10from keras import models 11from keras import layers 12from keras import regularizers 13from tensorflow.keras.optimizers import SGD 14from keras.layers import Input, Dense, GlobalAveragePooling2D, Dropout, Activation, Flatten 15from tensorflow.keras.utils import to_categorical 16 17numOfTrainImage = 250 18mini_batch = (int)(numOfTrainImage / 2 / 5) 19max_epoch = 100 20numOfTestImage = 100 21 22#学習用画像とラベルの対応表 23df = pd.read_csv('drive/MyDrive/train.csv', delimiter=',') 24df.head(5) 25 26#学習用画像の読み込み 27dir_name = os.path.join('drive/MyDrive/train_data') 28 29imgarray = [] 30category = [] 31 32for filename in sorted(os.listdir(dir_name)[0:numOfTrainImage]): 33 img = load_img(os.path.join(dir_name, filename), color_mode='rgb', target_size=(300,300)) 34 imgdata = img_to_array(img) 35 imgdata = imgdata / 255.0 36 imgarray.append(imgdata) 37 temp = df[df['id']==filename].target 38 label = df[df['id']==filename].target.values[0] 39 category.append(label) 40 41x_train = np.array(imgarray) 42t_train = to_categorical(np.array(category)) 43p = np.random.permutation(len(x_train)) 44x_train, y_train = x_train[p], t_train[p] 45print("x_train.shape = ", x_train.shape, "t_train.shape = ", t_train.shape) 46 47#モデルの構築 48input_tensor = Input(shape=(300, 300, 3)) 49vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor) 50 51top_model = vgg16.output 52top_model=GlobalAveragePooling2D()(top_model) 53top_model = Flatten(input_shape=vgg16.output_shape[1:])(top_model) 54top_model = Dense(256, activation='relu')(top_model) 55top_model = Dropout(0.5)(top_model) 56top_model = Dense(2, activation='softmax')(top_model) 57network=Model(inputs=vgg16.input, outputs=top_model) 58 59for layer in network.layers[:19]: 60 layer.trainable=False 61 62network.summary() 63 64network.compile(loss='categorical_crossentropy', optimizer=SGD(lr=1e-4, momentum=0.9), metrics=['accuracy']) 65 66history = network.fit(x_train, t_train, epochs=max_epoch, batch_size=mini_batch, validation_split=0.5, shuffle=True) 67 68acc_train = np.array(history.history['accuracy']) 69acc_valid = history.history['val_accuracy'] 70loss_train = history.history['loss'] 71loss_valid = history.history['val_loss'] 72 73f = open('temp_epoch_loss.dat', 'w') 74for n in range(0,len(acc_train)): 75 f.write(str(n) + ' ' + str(acc_train[n]) + ' ' + str(loss_train[n]) + ' ' + str(acc_valid[n]) + ' ' + str(loss_valid[n]) + '\n') 76f.close() 77 78import matplotlib.pyplot as plt 79 80epochs = range(1, len(loss_train) + 1) 81plt.plot(epochs, loss_train, 'bo', label='Training loss') 82plt.plot(epochs, loss_valid, 'b', label='Validatoin loss') 83plt.title('Training and Validation Loss') 84plt.xlabel('Epochs') 85plt.ylabel('Loss') 86plt.legend() 87plt.show() 88 89plt.plot(epochs, acc_train, 'bo', label='Training acc') 90plt.plot(epochs, acc_valid, 'b', label='Validation acc') 91plt.title('Training and Validation Accuracy') 92plt.xlabel('Epochs') 93plt.ylabel('Accuracy') 94plt.legend() 95plt.show() 96 97#テスト画像の読み込み 98dir_name = os.path.join('drive/MyDrive/test_data') 99imgarray = [] 100filenamearray = [] 101for filename in sorted(os.listdir(dir_name)[0:100]): 102 img = load_img(os.path.join(dir_name, filename), color_mode='rgb', target_size=(300,300)) 103 104 imgdata = img_to_array(img) 105 imgdata = imgdata / 255.0 106 imgarray.append(imgdata) 107 filenamearray.append(filename) 108 109x_test = np.array(imgarray) 110 111y_test = network.predict(x_test) 112numOfImages, dummy = y_test.shape 113 114for n in range(0, numOfTestImage): 115 print(filenamearray[n], end='') 116 for k in range(0,2): 117 print('%6.3f' % y_test[n][k], end='') 118 print() 119predict_x=network.predict(x_test) 120y_test = np.argmax(predict_x,axis=1) 121 122f = open('submit.csv', 'w') 123for n in range(0, numOfImages): 124 print(filenamearray[n], y_test[n], sep='\t', file=f) 125f.close()

追記事項

以下のような特徴量の少ない製品の料品や不良品の検知をしようとしています。
![イメージ説明
イメージ説明

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

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

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

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

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

meg_

2021/12/25 13:32

> 製品の不良品を検知する データはどのようなものでしょうか?前処理はどのようにされましたか?
Luiahu

2021/12/25 14:06

追記事項に識別したい製品の画像を追加させていただきました。
meg_

2021/12/25 15:57

(データにおける)良品と不良品の比率は半々ですか?
Luiahu

2021/12/26 02:41

そうですね、テスト画像も学習用画像も良品と不良品の数は同じです。
meg_

2021/12/26 02:56

そうですか。 学習は何度トライしても画像のようになるのでしょうか?(訓練データのlossは減少するがバリデーションデータのlossは減少しない)
Luiahu

2021/12/26 06:41

そうですね。 何度トライしてもval_lossの値が減少しない状態ですね。
meg_

2021/12/26 14:01

訓練データでは訓練できたいるようなので、一度訓練データとバリデーションデータに差がないか目視で確認してみてはどうでしょうか?
guest

回答1

0

ベストアンサー

正常/異常のデータ数は同数であり2択問題で validation では 20% しか出ていないということは、まったく学習ができていない(=50%前後)とは違い、学習方法に異常があると思います。

drive/MyDrive/train.csvのデータの並び順はどうなっていますか?
正常/異常データがシャッフルされて並んでいるのではなく、正常→異常データの順に並んでいませんか?

network.fit()vlidation_split=0.5はシャッフル前のx_train, t_trainの末尾から50%をvalidationデータとするため、x_trainの前半に正常、後半に異常と並んでしまっていたら、正常データのみで学習し、異常データのみで検証していることになってます。

その場合は、
network.fit()する前にx_train, t_trainを自発的にシャッフルするか、
validation_data=(x_val, t_val)としてデータを自分で定義するかをしてあげましょう。

投稿2021/12/27 05:48

編集2021/12/27 05:54
HRCo4

総合スコア140

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

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

Luiahu

2021/12/27 12:21

回答いただきありがとうございます。 確かに、train.csvの並びは正常→異常の順に並んでいます。 そのために、以下のコードでx_trainとt_trainをランダムに変更しているつもりだったのですができていないということでしょうか? ///コード p = np.random.permutation(len(x_train)) x_train, y_train = x_train[p], t_train[p]
HRCo4

2021/12/27 13:13

すみません、x_train = np.array(imgarray) まで読んでて、p = np.random.permutation(len(x_train)) の部分を見落としてました。 それでしたら、入力データに異常はなさそうな気はします。 ただ、それでも、2epoch目から val_acc が 0.2 に張り付いてピクリともしないのは変ですね。 何か4:1に関するもので記憶にありませんか?
Luiahu

2021/12/31 01:20 編集

4:1に関するものに記憶は無いですね。 あと、勘違いしていたのですがトレーニング画像は、良品が150枚で不良品が100枚でした。申し訳ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問