代码之家  ›  专栏  ›  技术社区  ›  Jonathan

给CNN传递一系列信件-凯拉斯

  •  1
  • Jonathan  · 技术社区  · 5 年前

    我有以下格式的数据:

    1. 150个字母的序列
    2. 字母只能是A、B、C、D、E。
    3. 我总共有20k个序列
    4. 序列中的10K标记为1,其他10K标记为0

    我通过执行以下操作将这150个字母转换为一个热向量:

    from skimage.transform import resize
    import numpy as np
    def transform(data): #transform sequence into one hot encoding
        def one_hot_encode(seq):
            mapping = dict(zip("ABCDE", range(5)))    
            seq2 = [mapping[i] for i in seq]
            return np.eye(5)[seq2]
    
        train = np.zeros((len(data), 150, 5, 1), dtype=np.uint8)
        for idx, d in enumerate(data):
            seq = one_hot_encode(d)
            seq = resize(seq, (150, 5, 1), mode='constant', preserve_range=True)
            train[idx] = seq.astype('float32')
        return train
    

    现在,我只想把这些数据传给一个简单的CNN,它是由Keras建立的。我将模型构建为:

    model = Sequential()
    model.add(Conv2D(64,kernel_size=(3,3),activation='relu',input_shape=(150,5,1)))
    model.add(Conv2D(32, kernel_size=3, activation='relu'))
    model.add(Flatten())
    model.add(Dense(1, activation='sigmoid'))
    model.summary()
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    

    现在,我试着通过这样做来训练: history = model.fit(X_train, Y_train, epochs=100, verbose=False, validation_split=0.25, batch_size=10)

    但这会导致以下错误:

    内部错误:初始化CUDA设备的流执行器失败 序号0:内部:调用CuDevicePrimaryCtxRetain失败: cuda_error_out_of_memory:内存不足;报告的总内存: 11721506816

    我已经训练了512x512x3尺寸的图像,它的输入尺寸远远超过这个。为什么会出现这个错误?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Milo Lu    5 年前

    显然你的显卡没有足够的内存来处理输入数据,因此出错了。尝试将批处理大小减小到4或2,然后再次运行同一模型。