Keras:为什么Sequential和Model会提供不同的输出?

时间:2018-02-01 11:51:18

标签: python neural-network keras recurrent-neural-network keras-layer

我正在使用Keras来计算简单的序列分类神经网络。我玩了不同的模块,我发现有两种方法可以创建顺序神经网络。

第一种方法是使用Sequential API。这是我在很多教程/文档中找到的最常用的方法。 这是代码:

# Sequential Neural Network using Sequential()
model = Sequential()
model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='relu', input_shape=(27 , 300,)))
model.add(MaxPooling1D(pool_size=2))
model.add(LSTM(100))
model.add(Dense(len(7, activation='softmax'))
model.summary()

第二种方法是从" scratch"建立de序列神经网络。使用Model API。这是代码。

# Sequential neural network using Model()   
inputs = Input(shape=(27 , 300))
x = Conv1D(filters=32, kernel_size=3, padding='same', activation='relu')(inputs)
x = MaxPooling1D(pool_size=2)(x)
x = LSTM(100)(x)
predictions = Dense(7, activation='softmax')(x)
model = Model(inputs=inputs, outputs=predictions)
model.summary()

我用固定种子(np.random.seed(1337))训练它,训练数据相同,输出不同...... 知道摘要的唯一区别是使用Model API的第一层输入。

有没有人知道为什么这个神经网络不同? 如果没有,为什么我会得到不同的结果?

由于

2 个答案:

答案 0 :(得分:2)

您只能在numpy中设置随机种子,而不能在tensorflow中设置随机种子(以防万一,它是keras的后端)。尝试在您的代码中添加它:

from numpy.random import seed
seed(1337)
from tensorflow import set_random_seed
set_random_seed(1337)

有关该主题的详细文章here

答案 1 :(得分:0)

 tf.keras.backend.clear_session()
 tf.random.set_seed(seed_value)

您可以使用上面的代码块并运行加载的模型进行某些迭代,然后检查错误是否仍然存在。 为了重现性,我面临着同样的问题,它对我有用。 正如安德烈(Andrey)所述,除了这两个种子设置器之外,您还需要设置Python哈希环境

import os
os.environ['PYTHONHASHSEED']=str(seed_value)

您仍然可以再添加一个块来强制TensorFlow使用单线程。 (如果您使用的是多核) 多线程是产生不可重复结果的潜在来源。

  session_conf = tf.ConfigProto(
  intra_op_parallelism_threads=1,
  inter_op_parallelism_threads=1)
  sess = tf.Session(config=session_conf)