【发布时间】:2021-11-03 23:17:10
【问题描述】:
我是神经网络和机器学习的初学者(因此我希望模型学习简单的y = 2 * x)。我先解释一下我所知道的,最后是最小的工作示例。
生成器函数仅输出 (x, y) 与 y = 2 * x 对,并以 batch_size 为一组进行批处理:
generator = data_generator(batch_size=3)
print(next(generator))
# (
# array([[0], [1], [2]]),
# array([[0], [2], [4]]),
# )
print(next(generator))
# (
# array([[3], [4], [5]]),
# array([[6], [8], [10]]),
# )
print(next(generator))
# (
# array([ [6], [7], [8]]),
# array([[12], [14], [16]]),
# )
由于这是一个线性函数,模型只需要单层就可以学习y = 2 * x:
- 输入
- 乘数层:
tf.keras.layers.Dense(1)(其中权重应为2,来自y = 2 * x) - 输出
运行以下代码,只需要pip install tensorflow==2.6.0
最小的工作示例(运行,但准确度始终接近 0):
import random
import tensorflow as tf
import numpy as np
def data_generator(batch_size):
start = 0
end = start + batch_size
while True:
x = np.arange(start, end)
y = 2 * np.arange(start, end)
x = np.expand_dims(x, axis=-1)
y = np.expand_dims(y, axis=-1)
yield x, y
start += batch_size
end = start + batch_size
# Randomly divide so that we get repeated data points
# if random.random() < 0.5:
# start //= 2
model = tf.keras.Sequential([
tf.keras.layers.InputLayer(input_shape=(1,)),
tf.keras.layers.Dense(1),
])
model.compile(
loss=tf.keras.losses.BinaryCrossentropy(),
optimizer=tf.keras.optimizers.Adam(),
metrics=['accuracy'],
)
batch_size = 32
generator_training = data_generator(batch_size)
generator_testing = data_generator(batch_size)
model.fit(
x=generator_training,
validation_data=generator_testing,
)
我尝试了以下方法来提高准确性,但无济于事:
- 使
batch_size为generator_testing小于batch_size为generator_training以便测试通常在已经训练过的数据上进行 - 使用
if random.random() < 0.5: start //= 2,这样训练会得到一些数据点不止一次 - 添加更多
Dense层 - 改变每个
Dense层中的神经元数量 - 将所有
x和y值除以一个大数 (1000000),使这些值介于0和1之间(至少在开始时)
为什么训练给出的准确率是10e-4 或更低,我应该怎么做才能让神经网络学习y = 2 * x?
【问题讨论】:
-
这是一个回归问题。精度对于回归问题没有意义。我建议您先研究 ML 理论,然后确定合适的损失函数和度量标准。
-
如果你不使用适当的损失函数,模型将无法训练,这里的二元交叉熵没有意义,你应该使用均方误差。
标签: python machine-learning keras neural-network tf.keras