Andrew Ng 的 cat vs non cat 示例的 Tensorflow 实现 (coursera)



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

  • 100历元后:原始代码:0.67…,TensorFlow:0.50
  • 400 epoch:原始代码:0.57…,TensorFlow: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

此处提供原始代码和数据集:https://github.com/ridhimagarg/Cat-vs-Non-cat-Deep-learning-implementation

课程:";"神经网络和深度学习";吴恩达,示例:具有4层NN的cat与非cat分类器。

我使用相同的:

  • 层数和节点数
  • 损失/成本(术语有点混乱(:二进制交叉熵
  • 无动量梯度下降
  • 学习率(0.0075(
  • 批量梯度下降(batch_size=列车示例数(
  • 随机种子

有什么想法吗?也许区别在于权重初始化?如果是,我该如何修改?感谢任何帮助,提前感谢!

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

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中实现自己的初始值设定项并传递给您的模型。

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),

相关内容

  • 没有找到相关文章

最新更新