Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于结果和内存管理的Keras ConvLSTM优化_Python_Tensorflow_Keras - Fatal编程技术网

Python 用于结果和内存管理的Keras ConvLSTM优化

Python 用于结果和内存管理的Keras ConvLSTM优化,python,tensorflow,keras,Python,Tensorflow,Keras,我有我用来预测一个值(线性激活)的图像,我对使用神经网络比较陌生。我得到的图像包含了很多细节,分辨率很高,但由于它们是卫星图像,这是有问题的,因为它们的尺寸很大(809012894)。我的目标是介于0和1之间的标量 我的目标是使用排序(RNN到CONVLSM)和卷积来更好地预测值 我的步骤如下: 函数将图像加载到内存中并进行处理,返回数组 生成器从上面的数组中读取数据并将其馈送到模型中,这在当前是不必要的,但如果我能使模型足够小,可以在GPU上运行,它将是 模型通过生成器从阵列读取数据 我想为我

我有我用来预测一个值(线性激活)的图像,我对使用神经网络比较陌生。我得到的图像包含了很多细节,分辨率很高,但由于它们是卫星图像,这是有问题的,因为它们的尺寸很大(809012894)。我的目标是介于0和1之间的标量

我的目标是使用排序(RNN到CONVLSM)和卷积来更好地预测值

我的步骤如下:

  • 函数将图像加载到内存中并进行处理,返回数组
  • 生成器从上面的数组中读取数据并将其馈送到模型中,这在当前是不必要的,但如果我能使模型足够小,可以在GPU上运行,它将是
  • 模型通过生成器从阵列读取数据
  • 我想为我的目标优化模型,缩小内存中的模型大小,但提高准确性

    以下是我的代码的相关部分:

    def build_model(frames=seq_len, channels=3, pixels_x=w, pixels_y=h, kernel_sizing=kernel_sizing):
        model = Sequential()
        model.add(
            ConvLSTM2D(filters=16
                       , kernel_size=kernel_sizing
                       , strides = 3
                       , data_format='channels_last'
                       , return_sequences = False
                       , activation='relu', input_shape=(frames, pixels_x, pixels_y, channels))
                    )
        model.add(
            Conv2D(filters=16
                       , kernel_size=(3,3)
                       , activation='relu')
                    )
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Dropout(0.5))
        model.add(Flatten())
        model.add(Dense(10, activation='relu'))
        model.add(Dense(1, activation='linear'))
        
        optimizer = tf.keras.optimizers.RMSprop(0.001)
        
        model.compile(    
            loss = "mse",
            optimizer = optimizer,
            metrics=['mae', 'mse'])
        
        return model
    
    注:

  • 一般来说,我必须调整到大约.1,这使我失去了细节
  • 我尝试了(3,3)和(11,11)的内核大小调整&想要更多的过滤器,但这会占用大量内存
  • 我可以根据内核的大小进一步调整步长,这就是我想知道是否可以“缩小”内存中模型的大小的地方
  • 因为我的目标值是一个介于0和1之间的数字,我是否需要使用MAE而不是MSE,因为MSE可能由于非常小的错误而变得奇怪
  • 展平后我需要更大的致密层吗?我如何防止它变得巨大
  • 我相信我的很多记忆问题都是由于图像太大造成的,但是我如何管理这些问题并保持我的细节水平呢
  • (从上面)我是否需要剪切图像块并使用块的目标变量增加数据集的大小?如果是这样,这将如何用于测试来自实际预测集的新图像
  • 编辑: model.summary():

    总而言之,这里有一些很好的建议,可以改进模型的优化,从而避免可怕的“ResourceExhausterRor:OOM当分配张量时”:

    • 在二维图层中使用较大的步幅
    • 减少密集2D层中的神经元数量
    • 使用较小的批处理大小(或每\u历元增加步数)
    • 使用灰度图像(将有一个通道而不是三个通道)
    • 减少层数
    • 使用更多MaxPoolig2D层,并增加其池大小
    • 减小图像的大小(可以使用PIL或cv2)
    • 申请退学
    • 使用较小的浮点精度,即np.float16而不是np.float32(最后手段)
    • 如果使用预先训练的模型,请冻结第一层

    希望这有帮助

    您的model.summary()输出多少个参数?我首先要做的是将步幅增加2倍?编辑以添加model.summary()您应该能够添加更多具有更小内核大小的卷积层,并且每个层都有16-64个过滤器。这将增加你的深度,但会使你的完全连接层显着更小。深度也会提高你的准确度。我不确定这会对#params产生什么影响,但它实际上可能会降低它。你也可以使你的模型保持图像大小不变,然后在逐渐增大的图像上进行训练,例如从.1比例开始,然后向上移动到全比例图像。通过这种方式,你应该能够得到一个比全尺寸训练更有效的模型,如果你在计算上有限制的话,我该如何使它保持不变的图像大小呢?模型似乎总是想要一个输入形状是吗?如果你能提供参数、模型类型等,我可以对此进行研究。