前提・実現したいこと
python3系でkerasを用いてalexnet2つの結合層までの出力をconcatenateしたいのですが,エラーが解決できません
rgbでの224,224,3の画像と,3次元情報を画像化した224,224,3の画像を学習に使用したいと考えています
また今のままでは全層trainbleになっていると思うのですが学習する層の指定もしたいです
発生している問題・エラーメッセージ
RuntimeError: Graph disconnected: cannot obtain value for tensor Tensor("conv2d_1_input:0", shape=(?, 224, 224, 3), dtype=float32) at layer "conv2d_1_input". The following previous layers were accessed without issue: []
該当のソースコード
python3
#concatenate_RGB-D.py
import keras
from keras import backend as K, optimizers
from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import Adam
from keras.losses import categorical_crossentropy
from keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint
from keras.models import save_model, load_model
from keras.layers import BatchNormalization, Embedding, Concatenate, Maximum, Add
from keras.preprocessing.image import array_to_img, img_to_array, load_img
from keras.utils.np_utils import to_categorical
import os
import numpy as np
from keras.models import Sequential, Model
from keras.layers import Input, Dropout, Flatten, Conv2D, MaxPooling2D, Dense, Activation, BatchNormalization
from keras.applications.vgg16 import VGG16
from keras.optimizers import Adagrad
from keras.optimizers import Adam
from keras.optimizers import SGD
from keras.layers import Activation, Dropout, Conv1D, Conv2D, Reshape, Lambda
import sys
from alex_rgb import alex_rgb
from alex_d import alex_d
ROWS = 224
COLS = 224
CHANNELS = 3
label_list = []
image_list = []
クラスの個数を指定
CLASSES = 3
batch = 32
epoch = 100
rgb_label_list = []
d_label_list = []
rgb_img_list = []
d_img_list = []
train_dir = 'C:/Users/hash/PycharmProjects/keras_deep/RGB-D/test_sukunai/'
path以下の*ディレクトリ以下の画像を読み込む。
for train_path in os.listdir(train_dir):
for dir in os.listdir('{}{}'.format(train_dir, train_path)):
# print('{}{}/{}'.format(train_dir, train_path, dir))
for file in os.listdir('{}{}/{}'.format(train_dir, train_path, dir)):
if str(train_path) == "depth":
d_label_list.append(int(dir) - 1)
img = img_to_array(
load_img('{}{}/{}/{}'.format(train_dir, train_path, dir, file), target_size=(ROWS, COLS, CHANNELS)))
d_img_list.append(img)
elif str(train_path) == "rgb": img = img_to_array( load_img('{}{}/{}/{}'.format(train_dir, train_path, dir, file), target_size=(ROWS, COLS, CHANNELS))) rgb_img_list.append(img)
Y = to_categorical(d_label_list)
input_img_rgb = Input(shape=(ROWS, COLS, CHANNELS), name="input_tensor_rgb")
input_img_d = Input(shape=(ROWS, COLS, CHANNELS), name="input_tensor_d")
cnn1 = alex_rgb()
cnn2 = alex_d()
leave only maximum features to eliminate null inputs
network = Concatenate()([cnn1, cnn2])
network = Dense(4096, activation='relu', name="last_dense")(network)
classification layer
network = Dropout(0.5)(network)
network = Dense(CLASSES, activation='softmax', name='softmax')(network)
model = Model(inputs=[input_img_rgb, input_img_d], outputs=network)
model.compile(optimizer=Adam(lr=1e-4, decay=1e-6),
loss=categorical_crossentropy,
metrics=['accuracy'])
model.summary() # モデルの表示
img_list = [bark_img_list, leaf_img_list, form_img_list]
numpy配列に変更
img_list = [bark_img_list, leaf_img_list, form_img_list]
rgb_img_list = np.array(rgb_img_list)
d_img_list = np.array(d_img_list)
学習を実行。10%はテストに使用。
fit = model.fit(([rgb_img_list, d_img_list]), Y,
batch_size=batch, epochs=epoch, validation_split=0.1)
model.save('./my_model_RGB_D_10.h5')
model.save_weights('./my_model_weights_RGB_D_10.h5')
#ここからalex_rgb.py
import ...
def conv2d(filters, kernel_size, strides=1, bias_init=1, **kwargs):
trunc = TruncatedNormal(mean=0.0, stddev=0.01)
cnst = Constant(value=bias_init)
return Conv2D(
filters,
kernel_size,
strides=strides,
padding='same',
activation='relu',
kernel_initializer=trunc,
bias_initializer=cnst,
**kwargs
)
def dense(units):
trunc = TruncatedNormal(mean=0.0, stddev=0.01)
cnst = Constant(value=1)
return Dense(
units,
activation='tanh',
kernel_initializer=trunc,
bias_initializer=cnst
)
def alex_rgb():
model = Sequential()
# 第1畳み込み層 model.add(conv2d(96, 11, strides=(4, 4), bias_init=0, input_shape=(224, 224, 3))) model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) model.add(BatchNormalization()) # 第2畳み込み層 model.add(conv2d(256, 5, bias_init=1)) model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) model.add(BatchNormalization()) # 第3~5畳み込み層 model.add(conv2d(384, 3, bias_init=0)) model.add(conv2d(384, 3, bias_init=1)) model.add(conv2d(256, 3, bias_init=1)) model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) model.add(BatchNormalization()) # 密結合層 model.add(Flatten()) model.add(dense(4096)) model.add(Dropout(0.5)) model.add(dense(4096)) model.add(Dropout(0.5)) # 読み出し層 nn = model.output return nn
試したこと
alex_rgb.pyの入力にinput_img_rgbの入力があわせられていない気がするのですが書き方がわからずに困っています
alex_rgb.pyとd_alex.pyは処理自体が同じですがあとで書き換えるため違うフォルダに記述しています(今回は2つの処理が全く同じなのでd_alex.pyを省略しています)
補足情報(FW/ツールのバージョンなど)
concatenate_RGB-D.pyでフォルダ内の画像をlistに格納,2つのcnnの指定,cnnの統合,結合層の学習をする予定で
alex_rgb.pyとalex_d.pyでそれぞれのcnnの中身を書く予定です
keras==2.1.3で環境自体は実行に問題は無いと思います(他ソースコードは動いています)

あなたの回答
tips
プレビュー