使用keras进行预测的错误
Errors in making predictions using keras
我正在尝试使用神经网络来近似对数正态分布 pdf(作为练习)。但是,model.predict()
总是 returns 1. 这是我的代码
import tensorflow as tf
import numpy as np
from scipy.stats import lognorm
from tensorflow import keras
mu = 5
sig =1
data = np.linspace(0,600,10000)
labels =lognorm.pdf(data,sig,0,np.exp(mu))
model = keras.Sequential()
model.add(keras.layers.Dense(64,input_shape=(1,),activation='sigmoid'))
model.add(keras.layers.Dense(64, activation='sigmoid'))
model.add(keras.layers.Dense(1, activation='softmax'))
model.compile(optimizer=tf.train.AdamOptimizer(0.001),
loss='mse',
metrics=['accuracy'])
model.fit(data, labels, epochs=1)
# Now test
x = np.random.lognormal(mu, sig, 100)
y =lognorm.pdf(x,sig,0,np.exp(mu))
score = model.evaluate(x, y)
# score = [0.9951245284080505, 0.0]
# Now try prediction
newx = np.linspace(600,1000,50)
newy = model.predict(newx)
score2 = model.evaluate(newx, newy)
# score2 = [0.0, 1.0]
score2
是 0,但不应该是。谁能帮我找出哪里做错了?
你的最后一层是 softmax,它试图获取最高的输出字段并将其对齐到 1 的值,同时缩放其他所有内容。
Softmax 主要用于分类问题,您希望明确声明一个潜在输出为 "correct"。
在这种情况下,您只有一个输出,它打算表示 0 到 1 之间的值,所以我可能会在最后一层使用另一个 sigmoid。
我正在尝试使用神经网络来近似对数正态分布 pdf(作为练习)。但是,model.predict()
总是 returns 1. 这是我的代码
import tensorflow as tf
import numpy as np
from scipy.stats import lognorm
from tensorflow import keras
mu = 5
sig =1
data = np.linspace(0,600,10000)
labels =lognorm.pdf(data,sig,0,np.exp(mu))
model = keras.Sequential()
model.add(keras.layers.Dense(64,input_shape=(1,),activation='sigmoid'))
model.add(keras.layers.Dense(64, activation='sigmoid'))
model.add(keras.layers.Dense(1, activation='softmax'))
model.compile(optimizer=tf.train.AdamOptimizer(0.001),
loss='mse',
metrics=['accuracy'])
model.fit(data, labels, epochs=1)
# Now test
x = np.random.lognormal(mu, sig, 100)
y =lognorm.pdf(x,sig,0,np.exp(mu))
score = model.evaluate(x, y)
# score = [0.9951245284080505, 0.0]
# Now try prediction
newx = np.linspace(600,1000,50)
newy = model.predict(newx)
score2 = model.evaluate(newx, newy)
# score2 = [0.0, 1.0]
score2
是 0,但不应该是。谁能帮我找出哪里做错了?
你的最后一层是 softmax,它试图获取最高的输出字段并将其对齐到 1 的值,同时缩放其他所有内容。
Softmax 主要用于分类问题,您希望明确声明一个潜在输出为 "correct"。
在这种情况下,您只有一个输出,它打算表示 0 到 1 之间的值,所以我可能会在最后一层使用另一个 sigmoid。