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

时间:2018-08-13 08:22:25

标签: 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

# 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: Error when checking input: expected dense_1_input to have shape (2,) but got array with shape (1,)

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

顺便说一句,如果我尝试更改input_shape的值以使其适合输出(根据我刚才提到的内容),我会得到相同的消息,但交换这些值。

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

2 个答案:

答案 0 :(得分:4)

我尝试运行您提供的程序。但这给我带来了另一种错误类型

  

检查目标时出错:预期activation_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中训练模型

答案 1 :(得分:1)

我想在已经给出的答案中添加一些内容。因为您实际上可以保持行与4单位相同。隐藏大小:

model.add(Dense(4, input_shape=(2,))) 

因此,假设您要保持4的隐藏大小,则只需添加一个适当的输出层即可,其形状与数据的形状相匹配。

在这种情况下:

model.add(Dense(1))

因此,如果您希望保持隐藏大小不同于1,这可能就是您想要的,这是完整的工作代码:

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

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.]]))

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