前提・実現したいこと
人の約2万の代謝物をt-sne次元圧縮法を使って画像化された143人分の画像データを学習データに、それらの人の年齢を教師データにして、CNNを用いた回帰学習を行いたいです。実行するとエラーを出さずに、最後まで動きます。(実行時間10分程度)。しかし、model.predictを行うと一定の値した出力されず、学習ができていません。
環境 macOS big sur ver 11.2 、python3.6 、jupyter notebook、 tensorflow
質問事項
・model.predict(X_test)を実行し、テストデータの年齢を予測すると全部同じぐらいの数字として予測されます。(out_put: array([[50.41556 ], [50.415688],[50.41586 ],[50.415657],[50.416435],[50.416126],[50.415924],[50.415714],[50.415657],[50.415928],[50.41616 ],[50.415886],[50.416042],[50.416138],[50.415443]], dtype=float32) )これは、データが足りないということなのでしょうか、それともコーディングが間違っているのでしょうか?テストデータは画像の青色の部分から抽出されているので、教師データは本来、一定の値ではありません
・tensorflowで学習のログを確認した時、損失関数の分布が、参考書で見るようなシグモイド曲線になりません。どうすればよいでしょうか?
発生している問題・エラーメッセージ
該当のソースコード
python
1ソースコード 2import glob 3import re 4import os 5import cv2 6import numpy as np 7import matplotlib.pyplot as plt 8from PIL import Image 9from sklearn.model_selection import train_test_split 10import tensorflow as tf 11from tensorflow.keras import datasets, layers, models 12from tensorflow.keras.layers import Dropout, Flatten, Dense 13 14img_dir ='PATH' #ディレクトリのPATH 15types = [ 'sample_data*.png'] #ディレクトリの中の画像ファイルを格納 16paths = [] 17for t in types: 18 paths.extend(glob.glob(os.path.join(img_dir, t)))#pathsに画像ファイルを格納 19 20X = [] 21Y = [] 22for f in paths: 23 img = cv2.imread(f) 24 img = np.asarray(img) 25 X.append(img)#Xに画像データを格納 26 27 f =re.sub(' PATH ','',f) #画像ファイルの名前から教師ラベルを抽出 28 f =re.sub('[0-9]+','',f,1) 29 f =re.search(r'\d+', f) 30 f =f.group() 31 Y.append(f)#Yに教師ラベルを格納 32 33Y = np.array(Y) 34Y = Y.astype(float) 35X = np.array(X) 36print(X.shape,Y.shape)#Xの画像データを行列に変換 37X = X / 255.0 38Y = Y / 100#損失関数を小さくするために表記 39 40X_train, X_test, y_train, y_test = train_test_split(X,Y,random_state = 0,test_size = 0.1)#XとYをtrain_dataとtest_dataに分ける 41print(X_train.shape, y_train.shape, X_test.shape, y_test.shape) #データの確認 42 43model = models.Sequential()#CNNモデル構築、input画像は、500×500 ピクセルRGBの画像データ 44model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(500, 500, 3))) 45model.add(layers.MaxPooling2D((2, 2))) 46model.add(layers.Conv2D(64, (3, 3), activation='relu')) 47model.add(layers.MaxPooling2D((2, 2))) 48model.add(layers.Conv2D(64, (3, 3), activation='relu')) 49model.add(layers.MaxPooling2D((2, 2))) 50model.add(Flatten()) 51model.add(layers.Dense(64, activation='relu')) 52model.add(Dense(1)) 53model.summary() 54 55model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.0001),#モデルのコンパイルと学習、確立的勾配降下法(SDG)X: 画像のデータ、Y :目的関数(教師ラベル) 56 loss='mse',#損失関数 57 metrics=['mae']) 58 59tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir="PATH_flog/", 60 histogram_freq=1)#TensorBoardで学習のログを残す 61 62model.fit(X_train, y_train, batch_size=16, epochs=8,verbose=1,callbacks=[tensorboard_callback]) 63test_loss,test_acc = model.evaluate(X_test, y_test, verbose=1) 64 65print(test_loss) 66 67model.predict(X_test)
試したこと
rensorflowで学習を可視化
損失関数を小さくするために、Y を0〜1での範囲で示すように変更(658→0.071)
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー