将字母顺序传递给CNN-Keras

时间:2019-10-13 04:03:30

标签: python tensorflow keras

我具有以下格式的数据:

  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

现在,我只想将此数据传递到由Keras构建的简单CNN中。我将模型构建为:

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设备的StreamExecutor失败   顺序0:内部:对cuDevicePrimaryCtxRetain的调用失败:   CUDA_ERROR_OUT_OF_MEMORY:内存不足;报告的总内存:   11721506816

我训练了尺寸为512x512x3的图像,它的输入尺寸远远超过此尺寸。那么,为什么会导致此错误?

1 个答案:

答案 0 :(得分:1)

显然您的视频卡没有足够的内存来处理输入数据,因此会出现错误。尝试将批次大小减小为4或2,然后再次运行相同的模型。