Python Andrew Ng的Tensorflow实现&x27;s cat与非cat示例(coursera)

Python Andrew Ng的Tensorflow实现&x27;s cat与非cat示例(coursera),python,tensorflow,machine-learning,neural-network,Python,Tensorflow,Machine Learning,Neural Network,在完成了一门基本的机器学习课程后,我试图用TensorFlow作为练习重现其中的一个例子。在最初的示例中,神经网络是从头开始构建的,我想用TensorFlow重现相同的神经网络。 我能够创建相同的层结构和激活功能,但结果不同。 使用原始代码,成本降低得慢得多,例如: 100纪元后:原始代码:0.67…,张量流:0.50 400纪元后:原始代码:0.57…,张量流:0.27 我知道这样更好,但我想了解差异的原因 我的代码: tf.random.set_seed(1) model =

在完成了一门基本的机器学习课程后,我试图用TensorFlow作为练习重现其中的一个例子。在最初的示例中,神经网络是从头开始构建的,我想用TensorFlow重现相同的神经网络。 我能够创建相同的层结构和激活功能,但结果不同。 使用原始代码,成本降低得慢得多,例如:

  • 100纪元后:原始代码:0.67…,张量流:0.50
  • 400纪元后:原始代码:0.57…,张量流:0.27
我知道这样更好,但我想了解差异的原因

我的代码:

    tf.random.set_seed(1)

model = tf.keras.models.Sequential([
    layers.Dense(20, activation = "relu"),
    layers.Dense(7, activation = "relu"),
    layers.Dense(5, activation = "relu"),
    layers.Dense(1, activation = "sigmoid")
])

model.compile(
    loss = keras.losses.BinaryCrossentropy(from_logits = False),
    optimizer = keras.optimizers.SGD(learning_rate = 0.0075),
    metrics = ["accuracy"]
)
model.fit(train_x, train_y, batch_size = 209, epochs = 500, verbose = 2) #batch_size = 209 = number of train examples, to have batch gradient descent
原始代码和数据集可在以下位置获得:

课程:Andrew Ng的“神经网络与深度学习” 示例:具有4层NN的cat与非cat分类器

我使用同样的方法:

  • 层和节点数
  • 损失/成本(术语有点混乱):二进制交叉熵
  • 无动量梯度下降(SGD)
  • 学习率(0.0075)
  • 批量梯度下降(批量大小=列车示例数)
  • 随机种子
有什么想法吗? 也许区别在于重量初始化?如果是,我如何修改?
感谢您的帮助,提前谢谢

权重/偏差初始化是原因。 这是原始初始化:

    W1 = np.random.randn(n_h, n_x) *0.01
    b1 = np.zeros((n_h, 1))
    W2 = np.random.randn(n_y, n_h) *0.01
    b2 = np.zeros((n_y, 1))
您可以在Keras中实现自己的初始值设定项,并传递给您的模型

要在tensorflow中复制相同的初始化,请执行以下操作:

def my_init(shape, dtype=None):
     np.random.seed(1)
     a = np.random.randn(shape[0], shape[1])*0.01  # the same initialization as in the original code from coursera
     return tf.convert_to_tensor(a, dtype = dtype) # converting the output to a tensor
将my_init添加到图层,例如:

layers.Dense(20, activation = "relu", kernel_initializer = my_init),