訓練を受けた[3D]
CNNでモデルを訓練し、そのウエイトを使って伝達学習を使用しようとしています。あらかじめ訓練されたモデルの入力形状を重み付きで変更する
しかし、入力サイズが(256,256,256,1)
であるのに対して、入力サイズが(64,64,7,3)
であるという問題があります。どうすればこの問題を解決できますか?
訓練を受けた[3D]
CNNでモデルを訓練し、そのウエイトを使って伝達学習を使用しようとしています。あらかじめ訓練されたモデルの入力形状を重み付きで変更する
しかし、入力サイズが(256,256,256,1)
であるのに対して、入力サイズが(64,64,7,3)
であるという問題があります。どうすればこの問題を解決できますか?
これは1つの解決策です:ネットワークの始めに1x1 conv2Dレイヤーを追加すると、(64,64,64)に減らすことができます。この1x1 conv2Dは、(64,64、n)という結果になります。ここでnは、あなたが望むユニットの数です。あなたのケースTensorflow 3.
に、あなたはこのようにそれを行うだろう:
tf.layers.conv2D(inputs, 3, kernel_size=(1,1), activation=<your_activation>)
このアプローチの利点を、それがデータから(64,64,64から行くための変換を学ぶということです)〜(64,64,3)となる。
私は、なぜあなたが最初に(256,256,256)または(64,64,64)の画像を持っているのかは分かりませんでした。通常、最後の次元はチャネルの数で、「RGB」の場合のように3つです。
編集:編集した質問に応じて、目的のサイズを取得する方法がいくつかあります。
たとえば、ネットワークの冒頭に1つ以上のconv3dレイヤーを追加し、適切なkernel_sizeとstrideを選択して、目的のサイズにすることができます。あなたは次の層を追加した場合:例ネットワークの先頭に
tf.layers.conv3d(inputs, 3, kernel_size=(193,193,250), strides=(1,1,1))
をinputs
が暗いのテンソルである場合は、DIM =(なし、64,64,7,3)のテンソルを取得します=(なし、256,256,256,1)。 3d(max/avg/etc)のプール層を使用することもできます。
そしてもちろん、あなたはまた、あなたが望む寸法を得るためにtf.reshape
、tf.image.resize_images
、tf.transpose
、tf.concat
、tf.layers.conv2d
などを使用することができます。例:
inputs = tf.placeholder(<tf.type>, shape=(None,256,256,256,1))
a = tf.reshape(inputs, (-1,256,256,256)) # shape=(None,256,256,256)
b = tf.image.resize_images(a, (64,64)) # shape=(None,64,64,256)
c = tf.layers.conv2d(b, 7, kernel_size=(1,1)) # shape=(None,64,64,7)
d = tf.reshape(c, (-1,64,64,7,1)) # shape=(None,64,64,7,1)
e = tf.layers.conv3d(d, 3, kernel_size=(1,1,1)) # shape=(None,64,64,7,3)
とにかく、あなたが望む寸法を得るには多くの方法がありますが、問題によっては別の方法よりも1つの方法を優先することができます。
お詫び申し上げます。私は寸法を混乱させました、今私は記事を編集しました。さらに、私はConv3DではなくConv2Dに取り組んでいます。 – Hamdard