質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

13585閲覧

kerasのVGG16モデルに対し、グレースケールの画像を入力する方法について

Kohei_KESE

総合スコア41

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2018/11/13 08:30

表記の件について、下記のようにプログラムを作成したところ、最後の3行でDimension 0 in both shapes must be equal, but are 3 and 64. Shapes are [3,3,1,64] and [64,3,3,3]. for 'Assign' (op: 'Assign') with input shapes: [3,3,1,64], [64,3,3,3]. といったエラーが発生しました。カラースケールにしたときはうまくいったのですが、今回うまくいかなかった理由がわかりませんでした。どうかアドバイスを教えて頂きたいです。よろしくお願いします。

Python

1filenames = os.listdir(r"100dataset_train") #dataというフォルダにある画像を読み込み 2Path = "./100dataset_train/" 3save_PATH = '71VGG16' 4h = 256 5w = 256 6 7train = np.zeros((num_files, h, w)) #画像データの箱を用意し 8# #画像をひとつずつ読み込み箱に入れていく 9# two_data = cv2.imread(Path+filenames[1], 0) 10# plt.imshow(two_data, cmap = "gray") 11# plt.show() 12for i,filename in zip(range(num_files),filenames): 13 one_data = cv2.imread(Path+filename, 0) #cv2で画像を読み込んで 14# plt.imshow(one_data) 15# plt.show() 16# one_data = cv2.resize(one_data,(h, w)) #認識NNに合わせてサイズ変換し 17 train[i] = one_data[400:656, 400:656] 18del one_data 19 20x_train = train.reshape(-1, w, h, 1)/255 21del train 22#VGG16 23#Conv層 24input_tensor = Input(shape = (w, h, 1)) 25vgg16 = VGG16(include_top=False,input_tensor=input_tensor) 26vgg16.summary()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

VGGの学習済みモデルのはじめのConv層は3ch->64chへ変換するように定義されているため,(None, h, w, 1)の1chのグレースケール画像を入力として受けることができません.

対応としては,

  1. 無理やりグレースケール画像を3chにして入力する.

例えば,以下のようになります.

train = np.zeros((num_files, h, w, 3)) #画像データの箱を用意し # #画像をひとつずつ読み込み箱に入れていく # two_data = cv2.imread(Path+filenames[1], 0) # plt.imshow(two_data, cmap = "gray") # plt.show() for i,filename in zip(range(num_files),filenames): one_data = cv2.imread(Path+filename, 0) #cv2で画像を読み込んで # plt.imshow(one_data) # plt.show() # one_data = cv2.resize(one_data,(h, w)) #認識NNに合わせてサイズ変換し one_data = np.tile(one_data, (1, 1, 3)) train[i] = one_data[400:656, 400:656, :]
  1. keras.applicationのVGGを自分で書き換えたPythonファイルを作る.

の2点が考えられると思います.

以上です.

投稿2018/11/14 05:52

Hiroki013

総合スコア99

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そのvgg16がどこから来てるのかよくわかりませんが、多分スクラッチじゃなないのであればc,w,hの順番でモデル構築されてると思います。

投稿2018/11/14 01:38

headrock

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kohei_KESE

2018/11/14 02:50

モデルは~/.keras/keras.jsonにあります。カラースケールの入力ではきちんと動作したのでw,h,cの順番で合っていると考えています。
guest

0

ベストアンサー

設定ファイル ~/.keras/keras.json"image_data_format": "channels_last" とちゃんとなっていますか?

追記

自分の環境で試したところ、確かに1チャンネルでは質問のエラーが出ました。

python

1from tensorflow.keras.applications.vgg16 import VGG16 2from tensorflow.keras.layers import Input 3 4# 学習済みモデル VGG16 を構築する。 5h, w, c = 256, 256, 1 6input_tensor = Input(shape = (w, h, c)) 7vgg16 = VGG16(include_top=False, input_tensor=input_tensor)
ValueError: Shapes (3, 3, 1, 64) and (64, 3, 3, 3) are incompatible

Keras のコードを調べたところ、コンストラクタの引数で weights='imagenet' となっており、何も指定しない場合は ImageNet で学習済みのモデルを使用するようになっています。これは3チャンネル画像の入力のモデルであるため、重みを読み込む際に不整合となりエラーとなっておりました。

質問者さんが取れる対策は次のいずれかです。

1 weights=None と指定し、ImageNet の学習済みモデルを使用しない。

# 学習済みモデル VGG16 を構築する。 h, w, c = 256, 256, 3 input_tensor = Input(shape = (w, h, c)) vgg16 = VGG16(include_top=False, weights=None, input_tensor=input_tensor)

2 入力をRGB画像に変換する。

OpenCV の場合

python

1cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)

フルスクラッチで学習する場合は1、ImageNet の学習済みモデルを使用したい場合は2を選んでください。

投稿2018/11/13 08:39

編集2018/11/14 15:44
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kohei_KESE

2018/11/13 23:59

keras.jsonの中身は { "floatx": "float32", "epsilon": 1e-07, "backend": "tensorflow", "image_data_format": "channels_last" } とあるのでchannel_lastは設定してあるように思えます。
headrock

2018/11/14 11:02

kerasであればbackendでtensorflowを使っていますが構築されているモデルにinputレイヤーが含まれていますよ。 上記の書き方はinputレイヤーが重複してますね。 グレースケールの画像を3chにするかinputレイヤーを自分で書き換えてあげれば動くと思います。
tiitoi

2018/11/14 15:46 編集

channel_last になっていないのが原因かと思ったのですが、原因は別にありました。失礼しました。 デフォルト引数が weights='imagenet' となっているため、チャンネル数を変更するとカーネルの形状が変わってしまうため、重みの読み込みでエラーになります。 なので、weights=None にすれば、エラーにならないはずです。
Kohei_KESE

2018/11/15 02:53

回答ありがとうございます。 提示して頂いた方法で動作を確認することができましたし、原因も把握することができました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問