Neural network 用ReLUs拟合多项式函数的神经网络
出于好奇,我正在尝试将具有校正线性单元的神经网络拟合为多项式函数。 例如,我想看看神经网络对函数Neural network 用ReLUs拟合多项式函数的神经网络,neural-network,julia,relu,flux-machine-learning,Neural Network,Julia,Relu,Flux Machine Learning,出于好奇,我正在尝试将具有校正线性单元的神经网络拟合为多项式函数。 例如,我想看看神经网络对函数f(x)=x^2+x的近似值有多容易(或困难)。下面的代码应该能够做到这一点,但似乎没有学到任何东西。当我跑的时候 using Base.Iterators: repeated ENV["JULIA_CUDA_SILENT"] = true using Flux using Flux: throttle using Random f(x) = x^2 + x x_train = shuffle(1:
f(x)=x^2+x
的近似值有多容易(或困难)。下面的代码应该能够做到这一点,但似乎没有学到任何东西。当我跑的时候
using Base.Iterators: repeated
ENV["JULIA_CUDA_SILENT"] = true
using Flux
using Flux: throttle
using Random
f(x) = x^2 + x
x_train = shuffle(1:1000)
y_train = f.(x_train)
x_train = hcat(x_train...)
m = Chain(
Dense(1, 45, relu),
Dense(45, 45, relu),
Dense(45, 1),
softmax
)
function loss(x, y)
Flux.mse(m(x), y)
end
evalcb = () -> @show(loss(x_train, y_train))
opt = ADAM()
@show loss(x_train, y_train)
dataset = repeated((x_train, y_train), 50)
Flux.train!(loss, params(m), dataset, opt, cb = throttle(evalcb, 10))
println("Training finished")
@show m([20])
它回来了
loss(x_train, y_train) = 2.0100101f14
loss(x_train, y_train) = 2.0100101f14
loss(x_train, y_train) = 2.0100101f14
Training finished
m([20]) = Float32[1.0]
这里的任何人都看到了我如何使网络适应
f(x)=x^2+x
?您的试验似乎有两个问题,主要与您如何使用优化器和处理输入有关——Julia或Flux没有任何问题。提供的解决方案确实可以学习,但决不是最优的
- 在回归问题上激活softmax输出是没有意义的。Softmax用于分类问题,其中模型的输出表示概率,因此应在区间(0,1)上。很明显,多项式的值超出了这个区间。在这样的回归问题中,通常会有线性输出激活。这意味着在通量中,输出层上不应定义输出激活
- 数据的形状很重要<代码>火车计算
的梯度,其中损失(d…)
是d
数据中的一批。在您的情况下,一个小批次由1000个样本组成,同一批次重复50次。神经网络通常使用较小的批量进行训练,但样本集较大。在我提供的代码中,所有批次都由不同的数据组成
- 一般来说,为了训练神经网络,建议对输入进行规范化。您的输入值从1到1000。我的示例应用了一个简单的线性变换来获得正确范围内的输入数据
- 规范化也可以应用于输出。如果输出较大,这可能会导致(太)大的渐变和权重更新。另一种方法是大大降低学习率
非常感谢。对于其他对结果感兴趣的读者来说:损失从195760年到1954年。当创建元组
(x,y',y)
并将预测y'
四舍五入为个位数时,输出包含以下元组<代码>(1828.2,2),(481230772.1231842)和(961923644.492482)
。(当然,这些数字在每次运行时都会有所不同,这是为了给出准确度的概念。)
using Flux
using Flux: @epochs
using Random
normalize(x) = x/1000
function generate_data(n)
f(x) = x^2 + x
xs = reduce(hcat, rand(n)*1000)
ys = f.(xs)
(normalize(xs), normalize(ys))
end
batch_size = 32
num_batches = 10000
data_train = Iterators.repeated(generate_data(batch_size), num_batches)
data_test = generate_data(100)
model = Chain(Dense(1,40, relu), Dense(40,40, relu), Dense(40, 1))
loss(x,y) = Flux.mse(model(x), y)
opt = ADAM()
ps = Flux.params(model)
Flux.train!(loss, ps, data_train, opt , cb = () -> @show loss(data_test...))