前提
深層学習のモデルをkerasのFunctional APIを用いて実装しようとしています。
皆様の知恵を貸していただけると幸いです。
実現したいこと
モデルを定義したのですが、エラーを吐いてしまい動きません。
画像を2次元convをした後、Flattenで1次元化、その後全結合層で繋いでいければと考えております。
発生している問題・エラーメッセージ
ResourceExhaustedError Traceback (most recent call last)
<ipython-input-13-d13a46859390> in <module>
67
68 y = Flatten()(y)
---> 69 y = Dense(4096, activation='relu')(y)
70
ResourceExhaustedError:
OOM when allocating tensor with shape[131072,4096] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc [Op:Add]
該当のソースコード
class_num=5
#InputA
inputA = Input(shape=(inputA_shape[0],inputA_shape[1],1), name="inputA")
x = Conv2D(64,(3,3), strides=(1, 1), padding='same', activation='relu')(inputA)
x = Conv2D(64,(3,3), strides=(1, 1), padding='same', activation='relu')(x)
x = MaxPooling2D((2, 2), padding='valid')(x)
x = Conv2D(128,(3,3), strides=(1, 1), padding='same', activation='relu')(x)
x = Conv2D(128,(3,3), strides=(1, 1), padding='same', activation='relu')(x)
x = MaxPooling2D((2, 2), padding='valid')(x)
x = Conv2D(256,(3,3), strides=(1, 1), padding='same', activation='relu')(x)
x = Conv2D(256,(3,3), strides=(1, 1), padding='same', activation='relu')(x)
x = Conv2D(256,(3,3), strides=(1, 1), padding='same', activation='relu')(x)
x = MaxPooling2D((2, 2), padding='valid')(x)
x = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(x)
x = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(x)
x = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(x)
x = MaxPooling2D((2, 2), padding='valid')(x)
x = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(x)
x = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(x)
x = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(x)
x = MaxPooling2D((2, 2), padding='valid')(x)
x = Flatten()(x)
x = Dense(4096, activation='relu')(x)
#InputB
inputB = Input(shape=(inputB_shape[0],inputB_shape[1],1), name="inputB")
y = Conv2D(64,(3,3), strides=(1, 1), padding='same', activation='relu')(inputB)
y = Conv2D(64,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = MaxPooling2D((2, 2), padding='valid')(y)
y = Conv2D(128,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = Conv2D(128,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = MaxPooling2D((2, 2), padding='valid')(y)
y = Conv2D(256,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = Conv2D(256,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = Conv2D(256,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = Conv2D(256,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = MaxPooling2D((2, 2), padding='valid')(y)
y = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = MaxPooling2D((2, 2), padding='valid')(y)
y = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = Conv2D(512,(3,3), strides=(1, 1), padding='same', activation='relu')(y)
y = MaxPooling2D((2, 2), padding='valid')(y)
y = Flatten()(y)
y = Dense(4096, activation='relu')(y)
#Concatenate
z = concatenate([x, y])
z = Dense(8192, activation='relu')(z)
z = Dense(4096, activation='relu')(z)
z = Dense(1000, activation='relu')(z)
output = Dense(class_num, activation='softmax', name="output")(z)
試したこと
エラーとしての意味(メモリに乗り切れていない)ということは理解できました。
しかし、Flatttenをすることで一次元化し、全結合につながるため、エラーのように[131072,4096]とはならず、[None,4096]になると思っております。
なぜか何回か実行するとモデルが通るときがありますが、いざ実行しようとしてもその際に同様のエラーを吐いてしまいます。
補足情報(FW/ツールのバージョンなど)
Python 3.7.10
keras 2.4.3
tensorflow-gpu 2.3.0

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