【问题标题】:Not getting reproducible results TensorFlow-Keras-Google Collab没有得到可重现的结果 TensorFlow-Keras-Google Colab
【发布时间】:2020-11-22 09:39:35
【问题描述】:

我一直在尝试创建一个能够识别不同歌唱技巧的模型。我得到了很好的结果,但我想用不同的优化器、层等进行不同的测试。但是,我无法得到可重现的结果。通过运行两次此模型训练:

num_epochs = 100
batch_size = 128
history = modelo.fit(X_train_f, Y_train, validation_data=(X_test_f,Y_test), epochs=num_epochs, batch_size=batch_size, verbose=2)

我可以在第一次运行时获得 25% 的准确率,然后在第二次运行时达到 34%。然后,如果我将优化器从“sgd”更改为“adam”,我将得到 99%。如果我回到之前的“sgd”优化器,它让我在第二次运行时获得了 34%,我会得到 100% 或类似的东西。我不明白为什么。

我已经尝试了很多我在类似问题中读到的东西。以下几行显示了我如何尝试使我的代码可重现,这些实际上是我整个代码的第一行:

import numpy as np
import tensorflow as tf
import random as rn

import os

#https://stackoverflow.com/questions/57305909/tensorflow-keras-reproducibility-problem-on-google-colab

os.environ['PYTHONHASHSEED']=str(5)
np.random.seed(5)
rn.seed(12345)

session_conf = tf.compat.v1.ConfigProto(intra_op_parallelism_threads=1,
                                    inter_op_parallelism_threads=1)

tf.compat.v1.set_random_seed(1234)

sess = tf.compat.v1.Session(graph=tf.compat.v1.get_default_graph(), config=session_conf)
tf.compat.v1.keras.backend.set_session(sess)

问题是,我对上面不起作用的代码做错了什么(正如我所提到的)?

这里是我创建训练集的地方:

from keras.datasets import mnist
from keras.utils import np_utils

from keras.models import Sequential
from keras.layers.convolutional import Conv1D, MaxPooling1D
from keras.layers.core import Dense, Flatten
from keras.layers import BatchNormalization,Activation
from keras.optimizers import SGD, Adam

from sklearn.model_selection import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size=0.2, random_state=2)

我的模特:

from tensorflow.keras import layers
from tensorflow.keras import initializers

input_dim = X_train_f.shape[1]
output_dim = Y_train.shape[1]

modelo = Sequential()
modelo.add(Conv1D(filters=6, kernel_initializer=initializers.glorot_uniform(seed=5), kernel_size=5, activation='relu', input_shape=(40, 1))) # 6
modelo.add(MaxPooling1D(pool_size=2))

modelo.add(Conv1D(filters=16, kernel_initializer=initializers.glorot_uniform(seed=5), kernel_size=5, activation='relu')) # 16
modelo.add(MaxPooling1D(pool_size=2))

modelo.add(Flatten())
modelo.add(Dense(120, kernel_initializer=initializers.glorot_uniform(seed=5), activation='relu')) # 120
modelo.add(Dense(84, kernel_initializer=initializers.glorot_uniform(seed=5), activation='relu')) # 84
modelo.add(Dense(nclases, kernel_initializer=initializers.glorot_uniform(seed=5), activation='softmax'))

sgd = SGD(lr=0.1)
#modelo.compile(loss='categorical_crossentropy', 
#               optimizer='adam', 
#               metrics=['accuracy'])
modelo.compile(loss='categorical_crossentropy', 
           optimizer=sgd, 
           metrics=['accuracy'])

modelo.summary()
modelo.input_shape

【问题讨论】:

  • 您好,欢迎来到 StackOverflow。您能否扩展您的问题以寻求具体帮助?现在的问题似乎太笼统了,不清楚要问什么。
  • @Cninroh 感谢您的欢迎。我刚刚编辑了这个问题,希望现在更清楚,可以得到一些帮助:)

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

这是正常情况。与 SGD 相比,Adam 优化器要强大得多。 Adam 隐式执行坐标梯度裁剪,因此与 SGD 不同,它可以处理重尾噪声。

【讨论】:

  • 谢谢@Andrey。我了解 Adam 比 SGD 更适合我的目的。我真正想做的是使用大约 30 种不同的层配置进行比较,这是我无法做到的,因为我的结果不可重现。
猜你喜欢
  • 2020-07-19
  • 2019-12-09
  • 2020-05-19
  • 2017-12-27
  • 2018-02-02
  • 2019-12-06
  • 2015-12-01
  • 2016-11-12
  • 2020-02-28
相关资源
最近更新 更多