为什么我的神经网络训练这么慢?

时间:2019-09-18 12:15:36

标签: python performance keras neural-network deep-learning

我有两个前馈神经网络(用python中的keras构建)执行相似的任务,但是训练时间却完全不同,我无法弄清原因。

我有一个神经网络,接受形状的输入和输出: 输入形状:(100000,21)输出形状:(100000,9), 第一个轴是训练样本的数量,第二个轴分别是输入和输出层中节点的数量。 然后我有另一个神经网络,它接受上述输入的一个子集,并产生上述输出的一个子集,例如: 输入形状:(100000,13)输出形状:(100000,1) 除此差异外,设置完全相同。但是第一个网络的训练速度明显更快,这可能是什么原因造成的?

这些设置是: 5个具有128个节点的隐藏层的回归问题,具有relu激活功能,adam优化器,输出层的线性激活。我认为纪元的数量也有所不同,但是就我而言,这不应该对每个纪元的培训时间有所影响。批处理大小为64,全局正常初始化。

这里是keras分别为每个网络提供的一些训练输出,请注意,输入和输出节点较少的网络明显较慢:

input shape: (100000, 21) output shape: (100000, 9),
Train on 90000 samples, validate on 10000 samples
Epoch 1/500
90000/90000 [==============================] - 3s 31us/step - loss: 0.3145 - val_loss: 0.1749
Epoch 2/500
90000/90000 [==============================] - 2s 23us/step - loss: 0.1426 - val_loss: 0.1298
Epoch 3/500
90000/90000 [==============================] - 2s 23us/step - loss: 0.1161 - val_loss: 0.0999
Epoch 4/500
90000/90000 [==============================] - 2s 
input shape: (100000, 13) output shape: (100000, 1)
Train on 90000 samples, validate on 10000 samples
Epoch 1/100
90000/90000 [==============================] - 36s 398us/step - loss: 0.0922 - val_loss: 0.0525
Epoch 2/100
44608/90000 [=============>................] - ETA: 12s - loss: 0.0503

在第二种情况下,每个时期的训练时间不会减少到24秒以上,尽管我希望在任何形式的随机梯度下降的情况下,只要输入较少,就需要较少的梯度计算,因此训练速度会更快。

这是第一个神经网络的代码:

# initiate:
model = Sequential()

# add hidden layers
model.add(Dense(nodes, input_dim = n, activation='relu', kernel_initializer = 'glorot_normal'))
for i in range(layers):
    model.add(Dense(nodes, activation = 'relu', kernel_initializer = 'glorot_normal'))

# add output
model.add(Dense(out, activation = 'linear', kernel_initializer = 'glorot_normal')) 

# compile the keras model
model.compile(loss='mean_squared_error', optimizer='adam')

# fit the keras model on the dataset
print('input shape:',np.shape(X_norm), 'output shape:', np.shape(L_norm))
history = model.fit(X_norm, L_norm, epochs=epochs, batch_size=batch_size, validation_split = (1/10) 
                   , callbacks = [earlystop]) 

第二个网络完全相同,除了model.fit中的输入数量:

# fit the keras model on the dataset
    history = model.fit(inputdt, outputdt, epochs=epochs, batch_size=batch_size, validation_split = (1/10) 
                       , verbose = 1, callbacks = [earlystop]) 

其中inputdt和outputdt分别是X_norm和L_norm的切片。

0 个答案:

没有答案