Keras model.train_on_batch вылетает мое ядро, а model.fit - нет, хотя мой вход меньше с train_on_batch - PullRequest
0 голосов
/ 02 июля 2019

Я тренирую сверточную нейронную сеть с Keras и бэкэндом Tensorflow по списку последовательностей ДНК, чтобы предсказать некоторые из их особенностей.У меня настроены две сети:

  1. дополняет начало моих последовательностей, закодированных в одно горячее состояние, так что все последовательности имеют одинаковую длину, что означает, что я могу пропустить их через все сразу, используя модель.поместиться.Это заполнение уменьшает мои тренировочные данные, так как я не могу замаскировать свой ввод с помощью Conv2D.

  2. обучает последовательность модели по порядку и не дополняет их, так что модель принимает переменные входные длины.Я надеюсь, что это улучшит точность модели, но каждый раз, когда я перебираю свой список последовательностей и вызываю model.train_on_batch, мое ядро ​​iPython падает.

Вот модель, в которой я передаюмягкие входы:

kernel_length=50
kernel_length2=25
kernel_length3=12
conv_layers=128
hot_dim=5
model = Sequential()

model.add(Conv2D(conv_layers, (kernel_length, hot_dim), padding='valid', input_shape=(x_train.shape[1], hot_dim, 1)))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(Conv2D(conv_layers, (kernel_length2, 1), padding='valid', input_shape=(x_train.shape[1], hot_dim, 1)))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(Conv2D(conv_layers, (kernel_length3, 1), padding='valid', input_shape=(x_train.shape[1], hot_dim, 1)))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(MaxPooling2D(pool_size=(35,1), padding='valid'))

model.add(Flatten())
model.add(Dense(128, activation="relu"))
model.add(Dropout(0.2))
model.add(Dense(64, activation="relu"))
model.add(Dropout(0.2))
model.add(Dense(16, activation="relu"))
model.add(Dense(1, activation='linear'))

model.compile(loss='mean_squared_error', optimizer='adam',metrics=["accuracy", "mae", "mse"])

model.summary()

Возвращает сводка модели:

    _________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_60 (Conv2D)           (None, 851, 1, 128)       32128     
_________________________________________________________________
activation_58 (Activation)   (None, 851, 1, 128)       0         
_________________________________________________________________
dropout_92 (Dropout)         (None, 851, 1, 128)       0         
_________________________________________________________________
conv2d_61 (Conv2D)           (None, 827, 1, 128)       409728    
_________________________________________________________________
activation_59 (Activation)   (None, 827, 1, 128)       0         
_________________________________________________________________
dropout_93 (Dropout)         (None, 827, 1, 128)       0         
_________________________________________________________________
conv2d_62 (Conv2D)           (None, 816, 1, 128)       196736    
_________________________________________________________________
activation_60 (Activation)   (None, 816, 1, 128)       0         
_________________________________________________________________
dropout_94 (Dropout)         (None, 816, 1, 128)       0         
_________________________________________________________________
max_pooling2d_20 (MaxPooling (None, 23, 1, 128)        0         
_________________________________________________________________
flatten_16 (Flatten)         (None, 2944)              0         
_________________________________________________________________
dense_69 (Dense)             (None, 128)               376960    
_________________________________________________________________
dropout_95 (Dropout)         (None, 128)               0         
_________________________________________________________________
dense_70 (Dense)             (None, 64)                8256      
_________________________________________________________________
dropout_96 (Dropout)         (None, 64)                0         
_________________________________________________________________
dense_71 (Dense)             (None, 16)                1040      
_________________________________________________________________
dense_72 (Dense)             (None, 1)                 17        
=================================================================
Total params: 1,024,865
Trainable params: 1,024,865
Non-trainable params: 0
_________________________________________________________________

Моя модель партии немного отличается, так как мне приходится использовать GlobalMaxPooling2D:

kernel_length=20
kernel_length2=18
kernel_length3=15
conv_layers=64
model = Sequential()

model.add(Conv2D(conv_layers, (kernel_length, 4), padding='valid', input_shape=(None, 4, 1)))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(Conv2D(conv_layers, (kernel_length2, 1), padding='valid', input_shape=(None, 4, 1)))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(Conv2D(conv_layers, (kernel_length3, 1), padding='valid', input_shape=(None, 4, 1)))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(GlobalMaxPooling2D())
model.add(Dense(128, activation="relu"))
model.add(Dropout(0.2))
model.add(Dense(64, activation="relu"))
model.add(Dropout(0.2))
model.add(Dense(16, activation="relu"))
model.add(Dense(1, activation='linear'))

model.compile(loss='mean_squared_error', optimizer='adam',metrics=["accuracy", "mae", "mse"])

model.summary()

И сводка модели для этого

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_3 (Conv2D)            (None, None, 1, 64)       5184      
_________________________________________________________________
activation_3 (Activation)    (None, None, 1, 64)       0         
_________________________________________________________________
dropout_5 (Dropout)          (None, None, 1, 64)       0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, None, 1, 64)       73792     
_________________________________________________________________
activation_4 (Activation)    (None, None, 1, 64)       0         
_________________________________________________________________
dropout_6 (Dropout)          (None, None, 1, 64)       0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, None, 1, 64)       61504     
_________________________________________________________________
activation_5 (Activation)    (None, None, 1, 64)       0         
_________________________________________________________________
dropout_7 (Dropout)          (None, None, 1, 64)       0         
_________________________________________________________________
global_max_pooling2d_2 (Glob (None, 64)                0         
_________________________________________________________________
dense_5 (Dense)              (None, 128)               8320      
_________________________________________________________________
dropout_8 (Dropout)          (None, 128)               0         
_________________________________________________________________
dense_6 (Dense)              (None, 64)                8256      
_________________________________________________________________
dropout_9 (Dropout)          (None, 64)                0         
_________________________________________________________________
dense_7 (Dense)              (None, 16)                1040      
_________________________________________________________________
dense_8 (Dense)              (None, 1)                 17        
=================================================================
Total params: 158,113
Trainable params: 158,113
Non-trainable params: 0

Я могу обучить эту модель чему-то вроде:

epochs = 10
for y in range(epochs):
    print(y)
    for x in range(len(x_train)):
        model.train_on_batch(x_train[x], np.array(y_train.iloc[x]).reshape((1,1)), sample_weight=None, class_weight=None)

Я не понимаю, почему при использовании train_on_batch происходит сбой моего ядра iPython, пока model.fitне является.model.fit вызывается для модели с одинаковым количеством последовательностей, и все они дополняются, что означает, что у него гораздо больше параметров для обучения, чем для модели train_on_batch.

С model.fit я использую размер пакетаиногда до 200, тогда как способ, которым я тренируюсь с model.train_on_batch, по сути такой же, как при использовании размера пакета 1, не так ли?

Редактировать: ошибка, которую я получаю при работе в интерпретаторе:

2019-07-02 18:29:40.689406: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 9051 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0, compute capability: 6.1)
    2019-07-02 18:29:51.843913: F tensorflow/stream_executor/cuda/cuda_dnn.cc:542] Check failed: cudnnSetTensorNdDescriptor(handle_.get(), elem_type, nd, dims.data(), strides.data()) == CUDNN_STATUS_SUCCESS (3 vs. 0)batch_descriptor: {count: 1 feature_map_count: 128 spatial: 0 1  value_min: 0.000000 value_max: 0.000000 layout: BatchDepthYX}
    Aborted (core dumped)
...