0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

kerasのconcatenateレイヤーを使い,画像と他の引数をCNNにぶちこむとき

Posted at

はじめに

numpyの文法を,当たり前に書ければつまずくことは無かったと思う.自分向けの備忘録として書きます.

やりたいこと
研究にて,回帰予測モデルを構築したい

できなかったこと
CNNアーキテクチャに入力変数を入れるとき,思うように型変換ができなかった.

エラー文は以下

Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray)

期待される入力サイズ

  1. 画像(300×300×3)
  2. 他の変数(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)

を,

画像とは別に他の変数x_train2を入れる
model.fit(x=[x_train1, x_train2],y=y_train)

みたいにすれば良いらしい.
今回は,x_train1x_train["Image"]x_train2x_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の勉強不足のツケを払わされました.image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?