python keras神经网络预测不工作(输出0或1)

问题描述 投票:0回答:2

我用keras创建了一个用于预测加法的神经网络。我有2个输入和1个输出(添加2个输入的结果)。

我用tensorflow训练我的神经网络然后我试图预测加法,但程序返回01值而不是3,4,5,etc

这是我的代码:

from keras.models import Sequential
from keras.layers import Dense
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load dataset
dataset = numpy.loadtxt("data.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:2]
Y = dataset[:,2]
# create model
model = Sequential()
model.add(Dense(12, input_dim=2, init='uniform', activation='relu'))
model.add(Dense(2, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X, Y, epochs=150, batch_size=10,  verbose=2)



# calculate predictions
predictions = model.predict(X)
# round predictions
rounded = [round(x[0]) for x in predictions]
print(rounded)

我的文件data.csv

1,2,3
3,3,6
4,5,9
10,8,18
1,3,4
5,3,8

例如:

1+2=3
3+3=6
4+5=9
...etc.

但我把它作为输出:0,1,0,0,1,0,1...为什么我没有得到3,6,9...的输出?

我更新了代码以使用其他损失功能,但我有同样的错误:

from keras.models import Sequential
from keras.layers import Dense
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("data.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:2]
Y = dataset[:,2]
# create model
model = Sequential()
model.add(Dense(12, input_dim=2, init='uniform', activation='relu'))
model.add(Dense(2, init='uniform', activation='relu'))
#model.add(Dense(1, init='uniform', activation='sigmoid'))
model.add(Dense(1, input_dim=2, init='uniform', activation='linear'))

# Compile model
#model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X, Y, epochs=150, batch_size=10,  verbose=2)



# calculate predictions
predictions = model.predict(X)
# round predictions
rounded = [round(x[0]) for x in predictions]
print(rounded)

outout = 1,1,1,3,1,1,...等

python tensorflow keras
2个回答
3
投票

正如@ebeneditos所提到的,您需要将最后一层中的激活函数更改为sigmoid以外的其他函数。您可以尝试将其更改为线性。

model.add(Dense(1, init='uniform', activation='linear'))

您还应该将损失函数更改为均方误差,因为您的问题更多的是回归问题而不是分类问题(binary_crossentropy用作二元分类问题的损失函数)

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])

1
投票

这是由于你在最后一层有Sigmoid function。正如其定义:

它只能取0到1之间的值。您应该更改最后一层的激活功能。

你可以试试这个(用Dense(8)而不是Dense(2)):

# Create model
model = Sequential()
model.add(Dense(12, input_dim=2, init='uniform', activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='linear'))

# Compile model
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])

# Fit the model
model.fit(X, Y, epochs=150, batch_size=10,  verbose=2)
© www.soinside.com 2019 - 2024. All rights reserved.