Python Keras中不同的输入/输出形状

Python Keras中不同的输入/输出形状,python,neural-network,keras,Python,Neural Network,Keras,我对所有这些神经网络的东西都是新手,实际上我正在尝试一些具有不同codig选项的玩具代码(原始Python、TF…) 目前,我在TFLearn中制作了一个简单的二进制AND、OR和NOT运算符求解网络: # 1. Import library of functions import numpy as np import tflearn from keras.models import Sequential from keras.layers import Dense, Activation #

我对所有这些神经网络的东西都是新手,实际上我正在尝试一些具有不同codig选项的玩具代码(原始Python、TF…)

目前,我在TFLearn中制作了一个简单的二进制AND、OR和NOT运算符求解网络:

# 1. Import library of functions
import numpy as np
import tflearn
from keras.models import Sequential
from keras.layers import Dense, Activation

# 2. Logical data
input = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]
YOR = [[0.], [1.], [1.], [1.]]
YAND=[[0.], [0.], [0.], [1.]]
YNOT=[[0.], [1.], [1.], [0.]]

######   VERSION TFLEARN     #####
# 3. Building our neural network/layers of functions 
neural_net = tflearn.input_data(shape=[None, 2])
neural_net = tflearn.fully_connected(neural_net, 1, activation='sigmoid')
neural_net = tflearn.regression(neural_net, optimizer='sgd', learning_rate=2, loss='mean_square')

# 4. Train the neural network / Epochs
model = tflearn.DNN(neural_net,tensorboard_verbose=0)
model.fit(input, YOR, n_epoch=1000, snapshot_epoch=False)

# 5. Testing final prediction
print("Testing OR operator")
print("0 or 0:", model.predict([[0., 0.]]))
print("0 or 1:", model.predict([[0., 1.]]))
print("1 or 0:", model.predict([[1., 0.]]))
print("1 or 1:", model.predict([[1., 1.]]))
现在,我正尝试使用以下代码在Keras中复制它(使用CNTK后端):

# 2. Logical OR operator / the data
input = np.array([[0., 0.], [0., 1.], [1., 0.], [1., 1.]])
YOR = np.array([[0.], [1.], [1.], [1.]])
YAND=np.array([[0.], [0.], [0.], [1.]])
YNOT=np.array([[0.], [1.], [1.], [0.]])

######   VERSION KERAS     #####
# 3. Building our neural network/layers of functions 
model= Sequential()
model.add(Dense(4,input_shape=[2,]))
model.add(Activation('sigmoid'))

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 4. Train the neural network / Epochs
model.fit(input,YOR,epochs=1000,verbose=1)

# 5. Testing final prediction
print("Testing OR operator")
print("0 or 0:", model.predict([[0., 0.]]))
print("0 or 1:", model.predict([[0., 1.]]))
print("1 or 0:", model.predict([[1., 0.]]))
print("1 or 1:", model.predict([[1., 1.]]))
在执行时,我希望在每种情况下都能获得运算符的结果,但我得到了以下错误:

ValueError:检查输入时出错:预期密集\u 1\u输入具有形状(2,),但获得了具有形状(1,)的数组。

根据,似乎输出形状必须与输入形状相同,尽管我可以修改输入形状,但显然无法识别输出形状arg

顺便说一下,如果我试图更改输入形状的值以使其适合输出(根据我刚才提到的),我会得到相同的消息,但会交换这些值


这是否意味着我只能获得与输入相同形状的结果?

我尝试运行您提供的程序。但它给我带来了不同类型的错误

检查目标时出错:预期激活_13具有形状(4),但获得具有形状(1)的数组

我在Dense中更改了值以解决上述错误。你为什么不试试这个

model= Sequential()
model.add(Dense(1,input_shape=(2,)))
model.add(Activation('sigmoid'))

model.compile(optimizer='rmsprop',
          loss='binary_crossentropy',
          metrics=['accuracy'])

# 4. Train the neural network / Epochs
model.fit(input,YOR,epochs=1000,verbose=1)

# 5. Testing final prediction
print("Testing OR operator")
test = np.array([[0., 0.]])
print("0 or 0:", model.predict(test))
test = np.array([[0., 1.]])
print("0 or 1:", model. model.predict(test))
test = np.array([[1., 0.]])
print("1 or 0:",  model.predict(test))
test = np.array([[1., 1.]])
 print("1 or 1:",  model.predict(test))

此外,即使输入和输出形状不同,我们也可以在Keras中训练模型

我想在已经给出的答案中添加一些内容。因为实际上,您可以使用
4
units resp保持线路不变。隐藏大小:

model.add(Dense(4, input_shape=(2,))) 
因此,假设您希望将隐藏大小保持在
4
,那么您只需要添加一个适当的输出层,该层的形状与数据的形状匹配

就你而言:

model.add(Dense(1))
因此,如果您想保持隐藏大小不同于
1
这可能是您想要的,下面是完整的工作代码:

注意:我还为输出层添加了另一个激活


我希望这能使事情变得更清楚,并帮助您更好地理解错误消息。

错误的不同是由于我的代码中未保存的更改。你的建议对我有用,但我仍然对稠密的价值有一些怀疑。1是该层中的单元数还是输出或预期的输出单元数?通过确认他们也这么做,我发现TFLearn在输入/输出方面更直观,特别是在形状定义方面…这是预期的输出量,在这种情况下,您只需要预测一个值即可,我只是觉得争论的名称令人困惑。在解决了前一个问题几分钟后,我试图做类似的事情(但没有正确),因此非常感谢您的建议!为了使CNN增加更多的隐藏层,这也可能在以后变得方便,对吗?顺便说一句,这也导致了性能的显著提高(至少在1k时代)@Julen在问题中,你使用了4个单位来进行密集/隐藏。接受的答案发布了一种方法,其中隐藏的大小设置为1,这与输出层同时存在。这确实有效,但也会改变隐藏的大小。但我添加答案的原因是要指出问题不在于输入层,而在于缺少的输出层。因此,您的代码实际上很好,只是缺少了输出层。因此,通过适当的输出层,完全可以将隐藏的_单位设置为4。因此,我希望这能让您更清楚地了解问题的真正原因。我对答案进行了一些编辑,以使其更清楚—祝您好运!:)
import numpy as np

from keras.models import Sequential
from keras.layers import Dense, Activation

# 2. Logical OR operator / the data
input = np.array([[0., 0.], [0., 1.], [1., 0.], [1., 1.]])
YOR = np.array([[0.], [1.], [1.], [1.]])
YAND=np.array([[0.], [0.], [0.], [1.]])
YNOT=np.array([[0.], [1.], [1.], [0.]])

######   VERSION KERAS     #####
# 3. Building our neural network/layers of functions 
model= Sequential()
model.add(Dense(4, input_shape=(2,)))
# you can place 
model.add(Activation('sigmoid'))
# layer to match output shape
model.add(Dense(1))
# of course you can add a sigmoid or other 
# activation here to match you target value range
model.add(Activation('sigmoid'))

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 4. Train the neural network / Epochs
print(input.shape)
model.fit(input,YOR,epochs=1000,verbose=1)

# 5. Testing final prediction
print("Testing OR operator")
print("0 or 0:", model.predict([[0., 0.]]))
print("0 or 1:", model.predict([[0., 1.]]))
print("1 or 0:", model.predict([[1., 0.]]))
print("1 or 1:", model.predict([[1., 1.]]))