はじめに
numpy
の文法を,当たり前に書ければつまずくことは無かったと思う.自分向けの備忘録として書きます.
やりたいこと
研究にて,回帰予測モデルを構築したい
できなかったこと
CNNアーキテクチャに入力変数を入れるとき,思うように型変換ができなかった.
エラー文は以下
Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray)
期待される入力サイズ
- 画像(300×300×3)
- 他の変数(n)
ただし,n は自然数.
データ数が1000で,他の変数の数が7とすると,とすると,(1000,300,300,3),他の変数は(1000,7),ということになる.
他の変数って何,というと,例えば
画像の他に,圧縮強度や空隙率,透水係数,etc. からP波速度を推定するといったみたいな.そんな論文がありました.
データの中身
csvファイルをDataFrame
にて読み込み,train_test_split
を用いてデータを分割する.
path | Volume | Strength |
---|---|---|
/data/sample1.png | 302.123 | 50.21 |
/data/sample2.png | 212.121 | 32.12 |
みたいな感じ.もちろん架空のデータであり,4列目以降もある.
pathだけはkears.preprocessing.load_img
にて読み込む.
解決パート
concatenateを使ったときの文法は
df
として格納した上のデータ(1列目はload_img
にて読んだ画像,2列目はVolume
...)を,kerasが要求するndarray
にする.
model.fit(x=x_train, y=y_train)
を,
model.fit(x=[x_train1, x_train2],y=y_train)
みたいにすれば良いらしい.
今回は,x_train1
がx_train["Image"]
,x_train2
がx_train[["Volume","Strength"]]
となっているわけだ.
どうやって入れるか
紆余曲折会ったけど,最終的にこうやった
history = model.fit(
# x_train, y_train, # 画像だけが説明変数ならば
[
np.stack(x_train[["Image"]].values.flatten(), axis=0).astype(np.float32),
x_train[["Volume","Strength"]].values.astype(np.float32)
],
y_train,
epochs=64,
validation_split=0.2,
)
どうやって抜け出したか
chatGPTです.ずっと相談していました.本当にありがとう.
自分一人では,きっと処理できなかった.numpy
の勉強不足のツケを払わされました.