CNN 数据不适合内存(内核死亡)
CNN data doesn't fit in memory (kernel dies)
我正在处理 this 数据集(图像部分),归一化为 1103 张大小为 1396 x 1676 的图像。
我正在尝试将其提供给这种形状的 CNN(取自 here):
n, w, h = X_train.shape # which is (n, 1396, 1676)
cnn = Sequential()
cnn.add(Conv2D(32, (3, 3), activation="relu", input_shape=(w, h, 1)))
cnn.add(MaxPooling2D(pool_size = (2, 2)))
cnn.add(Conv2D(32, (3, 3), activation="relu", input_shape=(w, h, 1)))
cnn.add(MaxPooling2D(pool_size = (2, 2)))
cnn.add(Conv2D(32, (3, 3), activation="relu", input_shape=(w, h, 1)))
cnn.add(MaxPooling2D(pool_size = (2, 2)))
cnn.add(Conv2D(64, (3, 3), activation="relu", input_shape=(w, h, 1)))
cnn.add(MaxPooling2D(pool_size = (2, 2)))
cnn.add(Conv2D(64, (3, 3), activation="relu", input_shape=(w, h, 1)))
cnn.add(MaxPooling2D(pool_size = (2, 2)))
cnn.add(Flatten())
cnn.add(Dense(activation = 'relu', units = 128))
cnn.add(Dense(activation = 'relu', units = 64))
cnn.add(Dense(activation = 'sigmoid', units = 1))
cnn.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
early = EarlyStopping(monitor="val_loss", mode="min", patience=3)
learning_rate_reduction = ReduceLROnPlateau(monitor='val_loss', patience=2, verbose=1,factor=0.3, min_lr=0.000001)
callbacks_list = [early, learning_rate_reduction]
cnn.fit(X_train, Y_train, epochs=25, validation_split=0.7, callbacks=callbacks_list)
在 Google Colab 和我 16Gb 机器上的 Jupyter 中,它都会导致内核死亡。我尝试使用生成器一次只提供 10 张图像,但它没有产生任何好的结果(准确度为 0.5)。
你能建议一个解决这个问题的方法吗?也许也调整一些参数
取决于您尝试训练的内容(不考虑数据和目标)。你的第一个开始是不要使用高分辨率的图像。从小处着手 (256x256 or 512x512
)。您需要做的就是先调整图像大小(使用 opencv 到 resize
),然后在其上训练模型。它肯定会给你(和硬件)一些喘息的空间。
尝试减小批量大小,例如使用 16 也尝试减小图像的比例
我正在处理 this 数据集(图像部分),归一化为 1103 张大小为 1396 x 1676 的图像。 我正在尝试将其提供给这种形状的 CNN(取自 here):
n, w, h = X_train.shape # which is (n, 1396, 1676)
cnn = Sequential()
cnn.add(Conv2D(32, (3, 3), activation="relu", input_shape=(w, h, 1)))
cnn.add(MaxPooling2D(pool_size = (2, 2)))
cnn.add(Conv2D(32, (3, 3), activation="relu", input_shape=(w, h, 1)))
cnn.add(MaxPooling2D(pool_size = (2, 2)))
cnn.add(Conv2D(32, (3, 3), activation="relu", input_shape=(w, h, 1)))
cnn.add(MaxPooling2D(pool_size = (2, 2)))
cnn.add(Conv2D(64, (3, 3), activation="relu", input_shape=(w, h, 1)))
cnn.add(MaxPooling2D(pool_size = (2, 2)))
cnn.add(Conv2D(64, (3, 3), activation="relu", input_shape=(w, h, 1)))
cnn.add(MaxPooling2D(pool_size = (2, 2)))
cnn.add(Flatten())
cnn.add(Dense(activation = 'relu', units = 128))
cnn.add(Dense(activation = 'relu', units = 64))
cnn.add(Dense(activation = 'sigmoid', units = 1))
cnn.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
early = EarlyStopping(monitor="val_loss", mode="min", patience=3)
learning_rate_reduction = ReduceLROnPlateau(monitor='val_loss', patience=2, verbose=1,factor=0.3, min_lr=0.000001)
callbacks_list = [early, learning_rate_reduction]
cnn.fit(X_train, Y_train, epochs=25, validation_split=0.7, callbacks=callbacks_list)
在 Google Colab 和我 16Gb 机器上的 Jupyter 中,它都会导致内核死亡。我尝试使用生成器一次只提供 10 张图像,但它没有产生任何好的结果(准确度为 0.5)。
你能建议一个解决这个问题的方法吗?也许也调整一些参数
取决于您尝试训练的内容(不考虑数据和目标)。你的第一个开始是不要使用高分辨率的图像。从小处着手 (256x256 or 512x512
)。您需要做的就是先调整图像大小(使用 opencv 到 resize
),然后在其上训练模型。它肯定会给你(和硬件)一些喘息的空间。
尝试减小批量大小,例如使用 16 也尝试减小图像的比例