機械学習
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
**7/2 [#j417c702]
様々なCNNモデル(の組み合わせ4パターンは以下に記載)を試し...
-グループA:"EfficientNetV2M", "InceptionResNetV2", "Dens...
-グループB:"EfficientNetB3", "ResNet50", "MobileNetV3Sma...
-グループC:"InceptionResNetV2", "ResNet101", "EfficientN...
-グループD:"EfficientNetV2S", "EfficientNetV2M", "Effici...
-CNN+binning3.pyについて(抜粋)
--1, 学習画像と連続スコアの読み込み(回帰スコアが1.00点未...
def load_images_and_scores(folder): ...
images, scores = [], [] ...
for fname in sorted(os.listdir(folder)): ...
if fname.endswith(".png") or fname.endswith(".jp...
try: #エラー処理のためのtryブロック
score = float(fname[0]) ...
score += np.random.uniform(-0.2, 0.2) ...
if score < 1.0 or score > 5.0: ...
print(f"⚠️ スコア範囲外: {fname} → {s...
continue
path = os.path.join(folder, fname) ...
img = Image.open(path).convert("RGB").re...
images.append(np.array(img) / 255.0) ...
scores.append(score) ...
except: ...
print(f"スキップ: {fname}")
return np.array(images), np.array(scores) ...
--2, CNN構築
def create_model(version): ...
input_img = Input(shape=(*IMAGE_SIZE, 3)) ...
if version == 0:
base = EfficientNetV2S(include_top=False, weight...
elif version == 1:
base = DenseNet121(include_top=False, weights="i...
elif version == 2:
base = MobileNetV3Large(include_top=False, weigh...
base.trainable = False ...
x = base.output ...
x = layers.GlobalAveragePooling2D()(x) ...
x = layers.Dense(2048, activation='relu')(x) ...
x = layers.BatchNormalization()(x) ...
x = layers.Dropout(0.5)(x) ...
.
.
.
output = layers.Dense(1)(x) ...
output = ClipLayer()(output) ...
model = Model(inputs=input_img, outputs=output) ...
model.compile(optimizer='adam', loss=custom_penalizi...
return model ...
--3, 回帰スコアとモデル学習の設定
# === binning: 回帰スコア → 評点1〜5 ===
→回帰モデルの連続値出力を1〜5の整数評価に変換する関数を...
def binning(score): #binning関数の定義
if score < 2.3: return 1
elif score < 3.1: return 2
elif score < 3.4: return 3
elif score < 3.7: return 4
else: return 5
# === モデル学習 ===
→データを読み込み、訓練・検証セットに分割し、全ての選択...
x, y = load_images_and_scores(TRAIN_FOLDER) ...
x_train, x_val, y_train, y_val = train_test_split(x, y, ...
model = create_model(i) ...
.
.
.
model.save(MODEL_PATHS[i]) ...
print(f"✅ モデル{i+1}保存完了: {MODEL_PATHS[i]}"
--4, 回帰スコアから評点の予測
# === 評点予測・保存 ===
→アンサンブル学習済みモデルでテスト画像を予測し、平均ス...
models_ensemble = [ ...
tf.keras.models.load_model(p, compile=False) ...
for p in MODEL_PATHS ...
]
test_fnames = sorted([f for f in os.listdir(TEST_FOLDER)...
os.makedirs(OUTPUT_BASE, exist_ok=True) ...
for i in range(1, 6): ...
os.makedirs(os.path.join(OUTPUT_BASE, f"score{i}"), ...
--------------------------------------------------------...
for fname in test_fnames: ...
path = os.path.join(TEST_FOLDER, fname) ...
img = Image.open(path).convert("RGB").resize(IMAGE_S...
x_input = np.array(img) / 255.0 ...
x_input = x_input.reshape(1, *IMAGE_SIZE, 3) ...
preds = [model.predict(x_input, verbose=0)[0][0] for...
avg_score = np.mean(preds) ...
final_score = binning(avg_score) ...
save_path = os.path.join(OUTPUT_BASE, f"score{final_...
img.save(save_path) ...
print(f"📂 {fname} → 回帰スコア: {avg_score:.2f} → ...
# === 検証評価 ===
→検証データでアンサンブル予測を行い、平均スコアを整数評...
val_preds = [model.predict(x_val, verbose=0).flatten() f...
y_val_pred = np.mean(val_preds, axis=0) ...
y_val_bin = np.array([binning(s) for s in y_val_pred]) ...
y_true_bin = np.array([binning(s) for s in y_val]) ...
**6/23 [#j417c623]
-錆の画像から評点を判断するのに用いるスクリプト
--MMLI (=More Machine Learning Images).py … 既存の画像を...
--CNN+binning
, 特徴 / スクリプト名 , CNN+binning.py , CNN+binning2.py ...
, モデルの種類 , オリジナルCNN3種 , 強化CNN(層数増加) ,...
, アンサンブル学習 , ○ , ○ , ○ , ○
, 出力形式 , 回帰+binning , 回帰+binning , 回帰+binnin...
, Soft Labeling(評点ぼかし) , ○ , ○ , ○ , ○
, 損失関数 , MSE+重みペナルティ , 強化ペナルティ損失関数...
, 特徴量の利用 , × , × , × , ○(画像+数値特徴:面積、粒...
, 特徴量融合方法 , ー , ー , ー , CNN出力ベクトル+数値特...
, 出力スケーリング , × , × , × , ○(シグモイド関数+0〜5....
, カスタムbinning関数 , ○ , ○ , ○ , ○
, UMAP可視化 , ○ , ○ , ○ , ○
, 判別補正(3⇔4の補正など) , × , × , × , ○(特徴量条件付...
, 使用層の深さ・複雑さ , 普通 , やや深め , 深層+転移学習...
**手書き数字の画像をCNNで機械学習するのに必要な画像とPyth...
-/home/kouzou/Morii25/hikitugi 内にある画像とPythonファイ...
***5/21 [#j417c521]
-- 1, Mnist-Hanbetsu-Full_auto4.py (Ver4.0) … Ver3.0では...
-- 2, Mnist-Hanbetsu-Full_auto5.py (Ver5.0) … Ver4.0からC...
--1回目の学習は畳込みとプーリング層が1層の最もシンプルな...
--2回目は1回目よりも畳込み層を深くしたことに加えて正則化 ...
--3回目はより学習させる範囲を大きくし正則化を強化させた学...
-各モデルの構造比較(表)
,項目 ,モデル1 ,モデル2 ,モデル3
,畳み込み層 ,1層 ,2層 ,2層
,プーリング ,1回 ,1回 ,1回
,正規化 ,× ,〇 ,〇
,Dropout ,× ,〇(1回),〇(2回)
,Dense層,64ユニット ,128ユニット ,64ユニット
,出力層 ,softmax(10) ,softmax(10) ,softmax(10)
,学習の安定性 ,弱い(過学習しやすい) ,普通(汎化性能〇)...
ただVer5.0は様々な学習要素を詰め込んでしまったのが原因な...
***5/14 [#j417c512]
-新たに作成したPythonファイルについて説明していく
--1, Gazou-Kakou.py … 判別させたい画像に点や直線, 円や多...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
---1-1, Gazou-Kakou-Sen_only.py … 上記のGazou-Kakou.pyか...
---1-2, Gazou-Kakou-Ten_only.py … 上記のGazou-Kakou.pyか...
---1-3, Gazou-Kakou-Zukei_only.py … 上記のGazou-Kakou.py...
---※1-1~3 はGazou-Kakou.py内において "処理を適用:ランダ...
--2, Suuji-Gazou-Seisei.py … 0~9までの数字を自動で生成す...
--3, Mnist-tyuusyutsu.py … Mnist上にある画像データを抽出...
--4, Hanbetsu-Full_auto.py … 判別画像の処理からそれらの判...
--5, Mnist-Hanbetsu-Full_auto.py … 上記の Hanbetsu-Full_a...
--6, Mnist-Hanbetsu-Full_auto2.py … 5の Mnist-Hanbetsu-Fu...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
***5/7 [#j417c507]
--1~9 のjpg画像 … CNNで手書き数字を機械学習させたものに数...
--mnist.py … mnistという6万枚の手書き数字データ(学習用が5...
--mnist-hosei.py … mnist.pyとの違いは画像が傾いていたり文...
--Hukusuu-hanbetsu.py … mnist.py または mnist-hosei.py を...
--Suuji-kakuritsu.py … mnist.py または mnist-hosei.py を...
--kani.py … mnist.py または mnist-hosei.py を実行した後に...
--suuji-hanbetsu.py … mnist.py または mnist-hosei.py を実...
**錆の写真からSVMで機械学習するまでの流れ [#g1ddf3ca]
この一連の流れは同じファイル内に保存するのが望ましい
-(1) RGBrironti.py について (コマンド)
--1, MATE端末を開き py ファイルのある hikitugi に移動する...
--2, py ファイルを呼び出す (python RGByomitori.py)
--3, フォルダーのパス入力が求められるので錆の写真があるフ...
--4, 保存するファイル名を入力する → Enterキー (一例: /hom...
--5, その後ウィンドウのどこかしらに錆の画像が表示されるの...
と表示される。
--6, ファイル内にある写真すべての "シアン" , "イエロー" ,...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
---補足:保存するファイル名を以前作成したファイル名と同じ...
-(2) matrix.py について (コマンド)
--1, MATE端末を開き py ファイルのある hikitugi に移動する...
--2, py ファイルを呼び出す (python matrix.py) → Enterキー
--3, 結果を書き込むファイルを入力してください と表示され...
--4, シアン・イエロー・マゼンタの各RGB値を入力してくださ...
-(3) henkan.py について (コマンド)
--1, MATE端末を開き py ファイルのある hikitugi に移動する...
--2, py ファイルを呼び出す (python henkan.py)
--3, 変換行列ファイルのパスを入力してください と表示され...
--4, 補正したいPPM画像のパスを入力してください と表示され...
---基本的に/home/kouzou/sato24/gr/data内にある ○_ppm や h...
--5, 補正後の画像を保存するパスを入力してください と表示...
-(4) グレースケール化とedge.py について(コマンド)
--1, $ convert rating○_○.ppm -colorspace Gray gray.pgm →...
--2, py ファイルを呼び出す (python edge.py)
--3, 入力ディレクトリパスの入力が求められる。なお edge.py...
--4, 出力ディレクトリパスの入力が求められる。ここでは3で...
--- 3のedgeはエッジ処理したものを入れておくファイル名であ...
--5, エッジ処理の閾値1, 2を入力してくださいと表示される
---エッジ処理の閾値1は "Cannyエッジ検出の「低い方のしきい...
---エッジ処理の閾値2は "Cannyエッジ検出の「高い方のしきい...
--6, 閾値1, 2 を入力して Enterキー を押してしばらくすると...
http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/202...
-(5) svm.py について (コマンド)
--1, py ファイルを呼び出す前に svm.py ファイル(編集画面)...
--2, ファイルを開いたら13行目に書いてある data_dir = 〜 ...
---① 150_300_edgeファイルをhikitugiファイル内にコピーす...
---② 編集画面の13行目: data_dir = "150_300_edge" と編集す...
---③ 編集画面の15行目: class_names = ["mk1_pgm", "mk2_pgm...
--3, 編集が完了したら python svm.py と入力 → Enterキー
**GIMPでの画像の切り取り方(200×200ピクセルの場合) [#xccc5...
--1, GIMPで画像を開き上のツールバーから 画像 → ガイド → ...
--2, 新規ガイドを選択すると方向と位置を決めることができ、...
--3, 水平方向に200ピクセル間隔で線を引けたら次に垂直方向...
--4, そうしたらツールバーから 画像 → ガイドを使用して切り...
*環境整備 [#k8c8c048]
**Anaconda [#caa0c13b]
インストールが終了すると
Do you wish to update your shell profile to automaticall...
This will activate conda on startup and change the comma...
If you'd prefer that conda's base environment not be act...
run the following command when conda is activated:
conda config --set auto_activate_base false
You can undo this by running `conda init --reverse $SHEL...
みたいに出る。
「yes」を選ぶと、condaが自動で初期化され、端末を開いた時...
「no」を選ぶと、通常はcondaコマンドを手動で有効化(例:c...
ということなので、パソコン起動時から常駐されたくないから...
.bashrcを.bashrc.bakにバックアップを取ってから、末尾に
export PATH=/home/kouzou/anaconda3/bin:$PATH
みたいに書き込む(ユーザー名がkouzouの場合)。
で、bashrcを有効にするために、
$. .bashrc
と打ち込んでから(あるいはターミナルを起動し直して)、conda...
usage: conda [-h] [-v] [--no-plugins] [-V] COMMAND ...
みたいに出ればよい。
***anaconda-navigatorがエラーで起動しない [#pf5269ae]
ターミナルでanaconda-navigatorと打ち込んで、
Could not initialize GLX
中止 (コアダンプ)
となる場合。
jupyterを使うことが目的の場合は、
jupyter lab
jupyter notebook
などで、ブラウザーで使うとうい方法がある。
**vscode [#x0577917]
$ sudo snap install --classic code
codeと打ち込んで起動できればよい。
view→Command Palette...検索欄>にdisplayと打ち込んで、Conf...
**tensorflow [#a485236d]
$ pip install --upgrade pip
$ pip install tensorflow
pipはPython用パッケージマネージャー。
インストール終了したら、pythonと打ち込んで、Python対話モ...
プロンプトが>>>になったら、以下のように入力してみる。
エラーが出ずにバージョンが表示されればよい。
>>> import tensorflow as tf
>>> print(tf.__version__)
*ランダム性 [#l36e93b0]
以下のプログラムで、まずset1でEfficientNetV2S、DenseNet12...
非常に良い質問です。
DenseNet121 を両方のセット(set1・set2)で使っているのに、
MAE や Accuracy が数%ずれるのは ―― スクリプト上で理論的...
実際には完全な再現性が保証されていないためです。
以下に、なぜ差が生じるのかを技術的に解説します。
🧩 差が出る主な原因
① モデル初期化のランダム性
base = DenseNet121(include_top=False, weights="imagenet",...
weights="imagenet" で初期化する場合、重みは固定されて...
上に積んでいる全結合層 (Dense, Dropout, BatchNormaliz...
➡️ set1 と set2 で 別インスタンスの DenseNet121 を作成し...
上位層の重み初期値が異なり、学習曲線がわずかに変化します。
② Data Augmentation と Soft Labeling の乱数
コード内で次の処理があります👇
score += np.random.uniform(-0.2, 0.2) # Soft Labeling
また、Data Augmentation(ランダム回転・明度変換など)を適...
tf.image.random_brightness, random_contrast, random_hue ...
➡️ これらのランダム性は、Python・NumPy の seed 固定だけで...
TensorFlow 内部のデータパイプラインが独自に乱数を生成する...
③ 学習過程における GPU / 並列演算の非決定性
TensorFlow + cuDNN(GPU)の場合、
特定のレイヤー(特に BatchNormalization, Dropout)で
計算順序や浮動小数誤差の違いにより、結果が微妙に変わりま...
例:同じ初期値でも、計算を別のGPUスレッドで行うと小数...
それが累積して MAE/ACC が ±1〜3% 変化することも。
④ 2回目の DenseNet121 の学習が完全に独立
set1 と set2 は以下のように完全に独立して実行されています:
result1 = run_experiment(..., model_set="set1")
result2 = run_experiment(..., model_set="set2")
そのため、set2 の DenseNet121 は set1 の学習結果を引き継...
たとえ構造が同じでも、別々に初期化・最適化・EarlyStopping...
誤差1〜3%のズレはごく自然な範囲です。
🧠 つまり — DenseNet121 の差は「同じモデル構造でも別の学...
set1 と set2 の DenseNet121 は パラメータ初期値が異な...
Soft Labeling と Data Augmentation のランダム性も加わ...
→ MAE, Accuracy, F1 が数%ずれる。
✅ 差を最小化したい場合の対策
対策 内容
① 乱数の完全固定 random.seed, np.random.seed, tf.random.s...
os.environ["TF_DETERMINISTIC_OPS"]="1" を設定(あなたのス...
② Data Augmentation を停止 ランダム操作をすべて無効化して...
③ Soft Labeling を固定化 np.random.uniform(-0.2, 0.2) を...
④ GPUを無効化 CPU演算は遅いが、決定論的に動作するため再現...
⑤ 同一モデルを再利用 set2でDenseNet121を再インスタンス化...
📘 まとめ(Wiki掲載用に適した説明)
DenseNet121 の結果が set1 と set2 で数%異なる理由
同一モデル構造を使用していても、学習の初期化やデータ...
具体的には、①重みの初期化、②Soft LabelingやData Augme...
そのため、全く同じ条件で再現性を保証するには、乱数固...
もし希望があれば、
「このスクリプトで完全に再現性を確保する設定(CPU強制・Au...
を実装した改良版も書けます。
作成しましょうか?
あなた:
アンサンブル学習ではなく、DenseNet121のモデルを単独で計算...
ChatGPT:
非常に鋭い質問です。
結論から言うと――
はい、DenseNet121を単独で計算した場合でも、毎回結果は...
これはアンサンブル特有の現象ではなく、ニューラルネッ...
🧩 単独モデル(例:DenseNet121単体)でも結果が変わる主な...
① 重み初期値のランダム性
Keras/TensorFlow は各層(Dense, BatchNormなど)の初期重み...
x = layers.Dense(512, activation="relu")(x)
たとえ同じデータ・同じエポック数でも、
初期重みがわずかに違えば、最終的に収束する重みが異なるた...
MAEやAccuracyに1〜3%(場合によっては5%)ほど差が出ます。
② Data Augmentationのランダム性
tf.image.random_brightness, random_flip, random_hue など...
各エポックで入力データがランダムに変化します。
このため:
同じ画像が「異なる明るさ・彩度」で学習される
結果として学習経路が毎回少しずつ異なる
➡️ 同じDenseNet121でも、毎回微妙に異なる学習パターンにな...
③ GPU演算の非決定性
TensorFlow + cuDNN (GPU) では以下のような「非決定的な演算...
並列演算の順序が変わる(浮動小数誤差が累積)
BatchNormalization や Dropout の内部処理にランダム性...
これにより、全く同じコードを2回実行しても結果が異なること...
特に DenseNet は BatchNorm を大量に含むため、影響が顕著で...
④ EarlyStopping や Validation Split の影響
EarlyStopping もまたランダム分割 (train_test_split) に依...
例えば random_state=42 を固定しても、Augmentation や Drop...
validation loss の最小点がずれることがあります。
🧠 対して「アンサンブル学習」ではどうなるか
アンサンブル(複数モデルの平均)はむしろ個々のランダム性...
したがって:
単独モデルよりも結果は安定しやすい
しかし、「同じアンサンブルを2回作る」ときには、やはり...
✅ まとめ(Wiki掲載用にも適した説明)
DenseNet121 単独でも再現性は完全ではない
ニューラルネットワークの学習には、初期重み、Data Augm...
一方、アンサンブル学習はこれらのランダム性を平均化し...
もし「DenseNet121の結果を完全に再現」したい場合は、
次のような設定を行うとよいです👇
import os, random, numpy as np, tensorflow as tf
os.environ["PYTHONHASHSEED"] = "42"
os.environ["TF_DETERMINISTIC_OPS"] = "1"
os.environ["TF_CUDNN_DETERMINISTIC"] = "1"
random.seed(42)
np.random.seed(42)
tf.random.set_seed(42)
# GPUではなくCPUで実行
tf.config.set_visible_devices([], 'GPU')
これでランダム性を最大限抑えられます。
(ただしCPUのみ実行になるため学習時間は大幅に増えます。)
ご希望があれば、「DenseNet121を完全再現性モードで1回ずつ...
*創造工房 [#g1ddf3cdd]
-やること(11/25のゼミ終わりまで⇒ゼミ終わりにリハーサル)
--mnist で手書き文字の判別
-用意すること・もの
--1回目
---説明のスライド⇒機械学習について(用途・目的)
---mnistについて(データDLは3年に),説明(mnistとは,創...
---スクリプトブロックごとに何をしているか説明(wikiに貼り...
---混同行列
---実行
--3年にやらせたいこと
---自身に文字を書かせる(学習データ流用して判別)
---混同行列出力⇒どの要素の学習がうまく行っていないか
---機械学習の実行はターミナルで(texで.py作成)
--2回目
---最初に効率のいい学習を行うには という説明(過学習の説...
---実習
---発表(時間余ったら)
-必要なもの
--丹羽
---機械学習スクリプト
---手書き文字判別スクリプト⇒スクリプトの説明も
--森井
---機械学習説明スライド
---mnist説明スライド
---最初に効率のいい学習を行うには という説明スライド
終了行:
#contents
**7/2 [#j417c702]
様々なCNNモデル(の組み合わせ4パターンは以下に記載)を試し...
-グループA:"EfficientNetV2M", "InceptionResNetV2", "Dens...
-グループB:"EfficientNetB3", "ResNet50", "MobileNetV3Sma...
-グループC:"InceptionResNetV2", "ResNet101", "EfficientN...
-グループD:"EfficientNetV2S", "EfficientNetV2M", "Effici...
-CNN+binning3.pyについて(抜粋)
--1, 学習画像と連続スコアの読み込み(回帰スコアが1.00点未...
def load_images_and_scores(folder): ...
images, scores = [], [] ...
for fname in sorted(os.listdir(folder)): ...
if fname.endswith(".png") or fname.endswith(".jp...
try: #エラー処理のためのtryブロック
score = float(fname[0]) ...
score += np.random.uniform(-0.2, 0.2) ...
if score < 1.0 or score > 5.0: ...
print(f"⚠️ スコア範囲外: {fname} → {s...
continue
path = os.path.join(folder, fname) ...
img = Image.open(path).convert("RGB").re...
images.append(np.array(img) / 255.0) ...
scores.append(score) ...
except: ...
print(f"スキップ: {fname}")
return np.array(images), np.array(scores) ...
--2, CNN構築
def create_model(version): ...
input_img = Input(shape=(*IMAGE_SIZE, 3)) ...
if version == 0:
base = EfficientNetV2S(include_top=False, weight...
elif version == 1:
base = DenseNet121(include_top=False, weights="i...
elif version == 2:
base = MobileNetV3Large(include_top=False, weigh...
base.trainable = False ...
x = base.output ...
x = layers.GlobalAveragePooling2D()(x) ...
x = layers.Dense(2048, activation='relu')(x) ...
x = layers.BatchNormalization()(x) ...
x = layers.Dropout(0.5)(x) ...
.
.
.
output = layers.Dense(1)(x) ...
output = ClipLayer()(output) ...
model = Model(inputs=input_img, outputs=output) ...
model.compile(optimizer='adam', loss=custom_penalizi...
return model ...
--3, 回帰スコアとモデル学習の設定
# === binning: 回帰スコア → 評点1〜5 ===
→回帰モデルの連続値出力を1〜5の整数評価に変換する関数を...
def binning(score): #binning関数の定義
if score < 2.3: return 1
elif score < 3.1: return 2
elif score < 3.4: return 3
elif score < 3.7: return 4
else: return 5
# === モデル学習 ===
→データを読み込み、訓練・検証セットに分割し、全ての選択...
x, y = load_images_and_scores(TRAIN_FOLDER) ...
x_train, x_val, y_train, y_val = train_test_split(x, y, ...
model = create_model(i) ...
.
.
.
model.save(MODEL_PATHS[i]) ...
print(f"✅ モデル{i+1}保存完了: {MODEL_PATHS[i]}"
--4, 回帰スコアから評点の予測
# === 評点予測・保存 ===
→アンサンブル学習済みモデルでテスト画像を予測し、平均ス...
models_ensemble = [ ...
tf.keras.models.load_model(p, compile=False) ...
for p in MODEL_PATHS ...
]
test_fnames = sorted([f for f in os.listdir(TEST_FOLDER)...
os.makedirs(OUTPUT_BASE, exist_ok=True) ...
for i in range(1, 6): ...
os.makedirs(os.path.join(OUTPUT_BASE, f"score{i}"), ...
--------------------------------------------------------...
for fname in test_fnames: ...
path = os.path.join(TEST_FOLDER, fname) ...
img = Image.open(path).convert("RGB").resize(IMAGE_S...
x_input = np.array(img) / 255.0 ...
x_input = x_input.reshape(1, *IMAGE_SIZE, 3) ...
preds = [model.predict(x_input, verbose=0)[0][0] for...
avg_score = np.mean(preds) ...
final_score = binning(avg_score) ...
save_path = os.path.join(OUTPUT_BASE, f"score{final_...
img.save(save_path) ...
print(f"📂 {fname} → 回帰スコア: {avg_score:.2f} → ...
# === 検証評価 ===
→検証データでアンサンブル予測を行い、平均スコアを整数評...
val_preds = [model.predict(x_val, verbose=0).flatten() f...
y_val_pred = np.mean(val_preds, axis=0) ...
y_val_bin = np.array([binning(s) for s in y_val_pred]) ...
y_true_bin = np.array([binning(s) for s in y_val]) ...
**6/23 [#j417c623]
-錆の画像から評点を判断するのに用いるスクリプト
--MMLI (=More Machine Learning Images).py … 既存の画像を...
--CNN+binning
, 特徴 / スクリプト名 , CNN+binning.py , CNN+binning2.py ...
, モデルの種類 , オリジナルCNN3種 , 強化CNN(層数増加) ,...
, アンサンブル学習 , ○ , ○ , ○ , ○
, 出力形式 , 回帰+binning , 回帰+binning , 回帰+binnin...
, Soft Labeling(評点ぼかし) , ○ , ○ , ○ , ○
, 損失関数 , MSE+重みペナルティ , 強化ペナルティ損失関数...
, 特徴量の利用 , × , × , × , ○(画像+数値特徴:面積、粒...
, 特徴量融合方法 , ー , ー , ー , CNN出力ベクトル+数値特...
, 出力スケーリング , × , × , × , ○(シグモイド関数+0〜5....
, カスタムbinning関数 , ○ , ○ , ○ , ○
, UMAP可視化 , ○ , ○ , ○ , ○
, 判別補正(3⇔4の補正など) , × , × , × , ○(特徴量条件付...
, 使用層の深さ・複雑さ , 普通 , やや深め , 深層+転移学習...
**手書き数字の画像をCNNで機械学習するのに必要な画像とPyth...
-/home/kouzou/Morii25/hikitugi 内にある画像とPythonファイ...
***5/21 [#j417c521]
-- 1, Mnist-Hanbetsu-Full_auto4.py (Ver4.0) … Ver3.0では...
-- 2, Mnist-Hanbetsu-Full_auto5.py (Ver5.0) … Ver4.0からC...
--1回目の学習は畳込みとプーリング層が1層の最もシンプルな...
--2回目は1回目よりも畳込み層を深くしたことに加えて正則化 ...
--3回目はより学習させる範囲を大きくし正則化を強化させた学...
-各モデルの構造比較(表)
,項目 ,モデル1 ,モデル2 ,モデル3
,畳み込み層 ,1層 ,2層 ,2層
,プーリング ,1回 ,1回 ,1回
,正規化 ,× ,〇 ,〇
,Dropout ,× ,〇(1回),〇(2回)
,Dense層,64ユニット ,128ユニット ,64ユニット
,出力層 ,softmax(10) ,softmax(10) ,softmax(10)
,学習の安定性 ,弱い(過学習しやすい) ,普通(汎化性能〇)...
ただVer5.0は様々な学習要素を詰め込んでしまったのが原因な...
***5/14 [#j417c512]
-新たに作成したPythonファイルについて説明していく
--1, Gazou-Kakou.py … 判別させたい画像に点や直線, 円や多...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
---1-1, Gazou-Kakou-Sen_only.py … 上記のGazou-Kakou.pyか...
---1-2, Gazou-Kakou-Ten_only.py … 上記のGazou-Kakou.pyか...
---1-3, Gazou-Kakou-Zukei_only.py … 上記のGazou-Kakou.py...
---※1-1~3 はGazou-Kakou.py内において "処理を適用:ランダ...
--2, Suuji-Gazou-Seisei.py … 0~9までの数字を自動で生成す...
--3, Mnist-tyuusyutsu.py … Mnist上にある画像データを抽出...
--4, Hanbetsu-Full_auto.py … 判別画像の処理からそれらの判...
--5, Mnist-Hanbetsu-Full_auto.py … 上記の Hanbetsu-Full_a...
--6, Mnist-Hanbetsu-Full_auto2.py … 5の Mnist-Hanbetsu-Fu...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
***5/7 [#j417c507]
--1~9 のjpg画像 … CNNで手書き数字を機械学習させたものに数...
--mnist.py … mnistという6万枚の手書き数字データ(学習用が5...
--mnist-hosei.py … mnist.pyとの違いは画像が傾いていたり文...
--Hukusuu-hanbetsu.py … mnist.py または mnist-hosei.py を...
--Suuji-kakuritsu.py … mnist.py または mnist-hosei.py を...
--kani.py … mnist.py または mnist-hosei.py を実行した後に...
--suuji-hanbetsu.py … mnist.py または mnist-hosei.py を実...
**錆の写真からSVMで機械学習するまでの流れ [#g1ddf3ca]
この一連の流れは同じファイル内に保存するのが望ましい
-(1) RGBrironti.py について (コマンド)
--1, MATE端末を開き py ファイルのある hikitugi に移動する...
--2, py ファイルを呼び出す (python RGByomitori.py)
--3, フォルダーのパス入力が求められるので錆の写真があるフ...
--4, 保存するファイル名を入力する → Enterキー (一例: /hom...
--5, その後ウィンドウのどこかしらに錆の画像が表示されるの...
と表示される。
--6, ファイル内にある写真すべての "シアン" , "イエロー" ,...
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/mori...
---補足:保存するファイル名を以前作成したファイル名と同じ...
-(2) matrix.py について (コマンド)
--1, MATE端末を開き py ファイルのある hikitugi に移動する...
--2, py ファイルを呼び出す (python matrix.py) → Enterキー
--3, 結果を書き込むファイルを入力してください と表示され...
--4, シアン・イエロー・マゼンタの各RGB値を入力してくださ...
-(3) henkan.py について (コマンド)
--1, MATE端末を開き py ファイルのある hikitugi に移動する...
--2, py ファイルを呼び出す (python henkan.py)
--3, 変換行列ファイルのパスを入力してください と表示され...
--4, 補正したいPPM画像のパスを入力してください と表示され...
---基本的に/home/kouzou/sato24/gr/data内にある ○_ppm や h...
--5, 補正後の画像を保存するパスを入力してください と表示...
-(4) グレースケール化とedge.py について(コマンド)
--1, $ convert rating○_○.ppm -colorspace Gray gray.pgm →...
--2, py ファイルを呼び出す (python edge.py)
--3, 入力ディレクトリパスの入力が求められる。なお edge.py...
--4, 出力ディレクトリパスの入力が求められる。ここでは3で...
--- 3のedgeはエッジ処理したものを入れておくファイル名であ...
--5, エッジ処理の閾値1, 2を入力してくださいと表示される
---エッジ処理の閾値1は "Cannyエッジ検出の「低い方のしきい...
---エッジ処理の閾値2は "Cannyエッジ検出の「高い方のしきい...
--6, 閾値1, 2 を入力して Enterキー を押してしばらくすると...
http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/202...
-(5) svm.py について (コマンド)
--1, py ファイルを呼び出す前に svm.py ファイル(編集画面)...
--2, ファイルを開いたら13行目に書いてある data_dir = 〜 ...
---① 150_300_edgeファイルをhikitugiファイル内にコピーす...
---② 編集画面の13行目: data_dir = "150_300_edge" と編集す...
---③ 編集画面の15行目: class_names = ["mk1_pgm", "mk2_pgm...
--3, 編集が完了したら python svm.py と入力 → Enterキー
**GIMPでの画像の切り取り方(200×200ピクセルの場合) [#xccc5...
--1, GIMPで画像を開き上のツールバーから 画像 → ガイド → ...
--2, 新規ガイドを選択すると方向と位置を決めることができ、...
--3, 水平方向に200ピクセル間隔で線を引けたら次に垂直方向...
--4, そうしたらツールバーから 画像 → ガイドを使用して切り...
*環境整備 [#k8c8c048]
**Anaconda [#caa0c13b]
インストールが終了すると
Do you wish to update your shell profile to automaticall...
This will activate conda on startup and change the comma...
If you'd prefer that conda's base environment not be act...
run the following command when conda is activated:
conda config --set auto_activate_base false
You can undo this by running `conda init --reverse $SHEL...
みたいに出る。
「yes」を選ぶと、condaが自動で初期化され、端末を開いた時...
「no」を選ぶと、通常はcondaコマンドを手動で有効化(例:c...
ということなので、パソコン起動時から常駐されたくないから...
.bashrcを.bashrc.bakにバックアップを取ってから、末尾に
export PATH=/home/kouzou/anaconda3/bin:$PATH
みたいに書き込む(ユーザー名がkouzouの場合)。
で、bashrcを有効にするために、
$. .bashrc
と打ち込んでから(あるいはターミナルを起動し直して)、conda...
usage: conda [-h] [-v] [--no-plugins] [-V] COMMAND ...
みたいに出ればよい。
***anaconda-navigatorがエラーで起動しない [#pf5269ae]
ターミナルでanaconda-navigatorと打ち込んで、
Could not initialize GLX
中止 (コアダンプ)
となる場合。
jupyterを使うことが目的の場合は、
jupyter lab
jupyter notebook
などで、ブラウザーで使うとうい方法がある。
**vscode [#x0577917]
$ sudo snap install --classic code
codeと打ち込んで起動できればよい。
view→Command Palette...検索欄>にdisplayと打ち込んで、Conf...
**tensorflow [#a485236d]
$ pip install --upgrade pip
$ pip install tensorflow
pipはPython用パッケージマネージャー。
インストール終了したら、pythonと打ち込んで、Python対話モ...
プロンプトが>>>になったら、以下のように入力してみる。
エラーが出ずにバージョンが表示されればよい。
>>> import tensorflow as tf
>>> print(tf.__version__)
*ランダム性 [#l36e93b0]
以下のプログラムで、まずset1でEfficientNetV2S、DenseNet12...
非常に良い質問です。
DenseNet121 を両方のセット(set1・set2)で使っているのに、
MAE や Accuracy が数%ずれるのは ―― スクリプト上で理論的...
実際には完全な再現性が保証されていないためです。
以下に、なぜ差が生じるのかを技術的に解説します。
🧩 差が出る主な原因
① モデル初期化のランダム性
base = DenseNet121(include_top=False, weights="imagenet",...
weights="imagenet" で初期化する場合、重みは固定されて...
上に積んでいる全結合層 (Dense, Dropout, BatchNormaliz...
➡️ set1 と set2 で 別インスタンスの DenseNet121 を作成し...
上位層の重み初期値が異なり、学習曲線がわずかに変化します。
② Data Augmentation と Soft Labeling の乱数
コード内で次の処理があります👇
score += np.random.uniform(-0.2, 0.2) # Soft Labeling
また、Data Augmentation(ランダム回転・明度変換など)を適...
tf.image.random_brightness, random_contrast, random_hue ...
➡️ これらのランダム性は、Python・NumPy の seed 固定だけで...
TensorFlow 内部のデータパイプラインが独自に乱数を生成する...
③ 学習過程における GPU / 並列演算の非決定性
TensorFlow + cuDNN(GPU)の場合、
特定のレイヤー(特に BatchNormalization, Dropout)で
計算順序や浮動小数誤差の違いにより、結果が微妙に変わりま...
例:同じ初期値でも、計算を別のGPUスレッドで行うと小数...
それが累積して MAE/ACC が ±1〜3% 変化することも。
④ 2回目の DenseNet121 の学習が完全に独立
set1 と set2 は以下のように完全に独立して実行されています:
result1 = run_experiment(..., model_set="set1")
result2 = run_experiment(..., model_set="set2")
そのため、set2 の DenseNet121 は set1 の学習結果を引き継...
たとえ構造が同じでも、別々に初期化・最適化・EarlyStopping...
誤差1〜3%のズレはごく自然な範囲です。
🧠 つまり — DenseNet121 の差は「同じモデル構造でも別の学...
set1 と set2 の DenseNet121 は パラメータ初期値が異な...
Soft Labeling と Data Augmentation のランダム性も加わ...
→ MAE, Accuracy, F1 が数%ずれる。
✅ 差を最小化したい場合の対策
対策 内容
① 乱数の完全固定 random.seed, np.random.seed, tf.random.s...
os.environ["TF_DETERMINISTIC_OPS"]="1" を設定(あなたのス...
② Data Augmentation を停止 ランダム操作をすべて無効化して...
③ Soft Labeling を固定化 np.random.uniform(-0.2, 0.2) を...
④ GPUを無効化 CPU演算は遅いが、決定論的に動作するため再現...
⑤ 同一モデルを再利用 set2でDenseNet121を再インスタンス化...
📘 まとめ(Wiki掲載用に適した説明)
DenseNet121 の結果が set1 と set2 で数%異なる理由
同一モデル構造を使用していても、学習の初期化やデータ...
具体的には、①重みの初期化、②Soft LabelingやData Augme...
そのため、全く同じ条件で再現性を保証するには、乱数固...
もし希望があれば、
「このスクリプトで完全に再現性を確保する設定(CPU強制・Au...
を実装した改良版も書けます。
作成しましょうか?
あなた:
アンサンブル学習ではなく、DenseNet121のモデルを単独で計算...
ChatGPT:
非常に鋭い質問です。
結論から言うと――
はい、DenseNet121を単独で計算した場合でも、毎回結果は...
これはアンサンブル特有の現象ではなく、ニューラルネッ...
🧩 単独モデル(例:DenseNet121単体)でも結果が変わる主な...
① 重み初期値のランダム性
Keras/TensorFlow は各層(Dense, BatchNormなど)の初期重み...
x = layers.Dense(512, activation="relu")(x)
たとえ同じデータ・同じエポック数でも、
初期重みがわずかに違えば、最終的に収束する重みが異なるた...
MAEやAccuracyに1〜3%(場合によっては5%)ほど差が出ます。
② Data Augmentationのランダム性
tf.image.random_brightness, random_flip, random_hue など...
各エポックで入力データがランダムに変化します。
このため:
同じ画像が「異なる明るさ・彩度」で学習される
結果として学習経路が毎回少しずつ異なる
➡️ 同じDenseNet121でも、毎回微妙に異なる学習パターンにな...
③ GPU演算の非決定性
TensorFlow + cuDNN (GPU) では以下のような「非決定的な演算...
並列演算の順序が変わる(浮動小数誤差が累積)
BatchNormalization や Dropout の内部処理にランダム性...
これにより、全く同じコードを2回実行しても結果が異なること...
特に DenseNet は BatchNorm を大量に含むため、影響が顕著で...
④ EarlyStopping や Validation Split の影響
EarlyStopping もまたランダム分割 (train_test_split) に依...
例えば random_state=42 を固定しても、Augmentation や Drop...
validation loss の最小点がずれることがあります。
🧠 対して「アンサンブル学習」ではどうなるか
アンサンブル(複数モデルの平均)はむしろ個々のランダム性...
したがって:
単独モデルよりも結果は安定しやすい
しかし、「同じアンサンブルを2回作る」ときには、やはり...
✅ まとめ(Wiki掲載用にも適した説明)
DenseNet121 単独でも再現性は完全ではない
ニューラルネットワークの学習には、初期重み、Data Augm...
一方、アンサンブル学習はこれらのランダム性を平均化し...
もし「DenseNet121の結果を完全に再現」したい場合は、
次のような設定を行うとよいです👇
import os, random, numpy as np, tensorflow as tf
os.environ["PYTHONHASHSEED"] = "42"
os.environ["TF_DETERMINISTIC_OPS"] = "1"
os.environ["TF_CUDNN_DETERMINISTIC"] = "1"
random.seed(42)
np.random.seed(42)
tf.random.set_seed(42)
# GPUではなくCPUで実行
tf.config.set_visible_devices([], 'GPU')
これでランダム性を最大限抑えられます。
(ただしCPUのみ実行になるため学習時間は大幅に増えます。)
ご希望があれば、「DenseNet121を完全再現性モードで1回ずつ...
*創造工房 [#g1ddf3cdd]
-やること(11/25のゼミ終わりまで⇒ゼミ終わりにリハーサル)
--mnist で手書き文字の判別
-用意すること・もの
--1回目
---説明のスライド⇒機械学習について(用途・目的)
---mnistについて(データDLは3年に),説明(mnistとは,創...
---スクリプトブロックごとに何をしているか説明(wikiに貼り...
---混同行列
---実行
--3年にやらせたいこと
---自身に文字を書かせる(学習データ流用して判別)
---混同行列出力⇒どの要素の学習がうまく行っていないか
---機械学習の実行はターミナルで(texで.py作成)
--2回目
---最初に効率のいい学習を行うには という説明(過学習の説...
---実習
---発表(時間余ったら)
-必要なもの
--丹羽
---機械学習スクリプト
---手書き文字判別スクリプト⇒スクリプトの説明も
--森井
---機械学習説明スライド
---mnist説明スライド
---最初に効率のいい学習を行うには という説明スライド
ページ名: