【问题标题】:Encountering problems with multiple outputs on keras在 keras 上遇到多个输出的问题
【发布时间】:2020-05-29 12:01:10
【问题描述】:

我正在使用带有新功能 API 的 Keras 神经网络的 one-hot 编码。我遇到了如下所示的错误:

Failed to find data adapter that can handle input: (<class 'list'> containing values of types {'(<class \'list\'> containing values of types {\'(<class \\\'list\\\'> containing values of types {\\\'(<class \\\\\\\'list\\\\\\\'> containing values of types {"<class \\\\\\\'int\\\\\\\'>"})\\\'})\'})'}), (<class 'dict'> containing {"<class 'str'>"} keys and {'(<class \'list\'> containing values of types {\'(<class \\\'list\\\'> containing values of types {"<class \\\'int\\\'>"})\'})'} values)

如果我没记错的话,我相信网络不接受一种热编码作为合适的输出。有谁知道这个错误的解决方法?

代码片段:

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

board_inputs = keras.Input(shape=(8, 8, 12))


conv1= layers.Conv2D(10, 3, activation='relu')
conv2 = layers.Conv2D(10, 3, activation='relu')
pooling1 = layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding="valid", data_format=None,)
pooling2 = layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding="valid", data_format=None,)
flatten = keras.layers.Flatten(data_format=None)


x = conv1(board_inputs)
x = pooling1(x)
x = conv2(x)
x = flatten(x)
piece_output = layers.Dense(12,name = 'piece')(x)
alpha_output = layers.Dense(7,name = 'alpha')(x)
number_output = layers.Dense(7,name = 'number')(x)


model = keras.Model(inputs=board_inputs, outputs=[piece_output,alpha_output,number_output], name="chess_ai_v3")
model.compile(
    loss=keras.losses.mse,
    optimizer=keras.optimizers.Adam(),
    metrics=None,
)

keras.utils.plot_model(model, "multi_input_and_output_model.png", show_shapes=True)
history = model.fit(
    trans_data[:len(trans_data)],
    {"piece": pieces, "alpha": alphas,"number": numbers},
    epochs=2,
    batch_size=32,
)
# history = model.fit(trans_data[:len(trans_data)],pieces[:len(trans_data)],batch_size=64, epochs=1000)
# print(type(numbers[0]))

【问题讨论】:

  • 您对错误的解释不正确,您应该添加代码之类的细节,因为孤立的错误没有上下文就没有任何意义。
  • 添加了代码 sn-p
  • 每个输入和目标都应该是 numpy 数组,而不是列表列表,我认为这让 tf.keras 感到困惑。输入也应该是浮点值,而不是整数,你应该将它们转换为 float32
  • 我认为将模型设置为具有多个输出时会有所不同。将模式设置为具有单个输出,因为当我在每组上训练网络时它运行得很好答案。
  • 我没看懂你的意思,我在 Keras 训练过多输入多输出模型没问题。

标签: tensorflow machine-learning keras neural-network


【解决方案1】:

我能够使用以下代码重现您的错误。错误与 Keras 上的多输入/输出无关。当我们将输入作为list of arrayarray of listdict 类型传递给model.fit() 时,会出现此错误。我正在使用tensorflow version 2.2.0

重现错误的代码 -

import numpy as np
import tensorflow as tf
from tensorflow import keras

data_a = [300, 455, 350, 560, 700, 800, 200, 250]
labels = [455, 350, 560, 700, 800, 200, 250, 300]

data_a = np.reshape(data_a, (8, 1, 1))

inputs = keras.layers.Input(shape=(1, 1))

x = keras.layers.Dense(40, activation='relu')(inputs)
output = keras.layers.Dense(1, activation='sigmoid')(x)

model = keras.models.Model(inputs=inputs, outputs=output)

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

model.fit(data_a,labels, epochs=10, steps_per_epoch=4)

输出 -

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-85-2b4ecdfa5a74> in <module>()
     17 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
     18 
---> 19 model.fit(data_a,labels, epochs=10, steps_per_epoch=4)

3 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/data_adapter.py in select_data_adapter(x, y)
    961         "Failed to find data adapter that can handle "
    962         "input: {}, {}".format(
--> 963             _type_name(x), _type_name(y)))
    964   elif len(adapter_cls) > 1:
    965     raise RuntimeError(

ValueError: Failed to find data adapter that can handle input: <class 'numpy.ndarray'>, (<class 'list'> containing values of types {"<class 'int'>"})

另外,如果您将数据作为list of arrays 传递如下 -

data_a = [np.array(300), np.array(455), np.array(350), np.array(560), np.array(700), np.array(800), np.array(200), np.array(250)]

然后你得到错误 -

ValueError: Failed to find data adapter that can handle input: (<class 'list'> containing values of types {"<class 'numpy.ndarray'>"}), (<class 'list'> containing values of types {"<class 'int'>"}).

另外,如果您将数据作为 dict 类型传递 -

data_a = {'a':300, 'b':455, 'c':350, 'd':560, 'e':700, 'f':800, 'g':200, 'h':250}

然后你得到错误 -

ValueError: Failed to find data adapter that can handle input: (<class 'dict'> containing {"<class 'str'>"} keys and {"<class 'int'>"} values), (<class 'list'> containing values of types {"<class 'int'>"})

解决方案 - 将数据转换为相同类型时修复了错误 - array of arraylist of list

修改,

data_a = [300, 455, 350, 560, 700, 800, 200, 250]
labels = [455, 350, 560, 700, 800, 200, 250, 300]

data_a = np.array([300, 455, 350, 560, 700, 800, 200, 250])
labels = np.array([455, 350, 560, 700, 800, 200, 250, 300])

固定代码 -

import numpy as np
import tensorflow as tf
from tensorflow import keras

data_a = np.array([300, 455, 350, 560, 700, 800, 200, 250])
labels = np.array([455, 350, 560, 700, 800, 200, 250, 300])

data_a = np.reshape(data_a, (8, 1, 1))

inputs = keras.layers.Input(shape=(1, 1))

x = keras.layers.Dense(40, activation='relu')(inputs)
output = keras.layers.Dense(1, activation='sigmoid')(x)

model = keras.models.Model(inputs=inputs, outputs=output)

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

model.fit(data_a,labels, epochs=10, steps_per_epoch=4, verbose=0)

print("Ran Successfully")

输出 -

Ran Successfully

还要回答你的另一个问题,

如果我没记错的话,我相信网络不接受一种热编码作为合适的输出。有谁知道这个错误的解决方法?

下面是一个简单的例子,我正在做Ytrain = np_utils.to_categorical(Ytrain)

完整代码 -

import tensorflow as tf
print(tf.__version__)
import numpy as np
from tensorflow.keras import utils as np_utils

Xtrain = np.random.randint(0, 100, size=(150, 10, 1))

Ytrain = np.random.choice([0,1, 2], size=(150, 1))
Ytrain = np_utils.to_categorical(Ytrain)

print(Ytrain.shape)

input_shape = (10, 1)
input_layer = tf.keras.layers.Input(input_shape)
conv_x = tf.keras.layers.Conv1D(filters=32, kernel_size=10, strides = 1, padding='same')(input_layer)

conv_x = tf.keras.layers.BatchNormalization()(conv_x)
conv_x = tf.keras.layers.Activation('relu')(conv_x)
g_pool = tf.keras.layers.GlobalAvgPool1D()(conv_x)
output_layer = tf.keras.layers.Dense(3, activation='softmax')(g_pool)
model = tf.keras.models.Model(inputs= input_layer, outputs = output_layer) 
model.summary()

model.compile(loss='categorical_crossentropy', optimizer= tf.keras.optimizers.Adam(), 
          metrics=['accuracy'])
hist = model.fit(Xtrain, Ytrain, batch_size= 5, epochs= 10, verbose= 0)

print("Ran Successfully")

输出 -

2.2.0
(150, 3)
Model: "model_13"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_21 (InputLayer)        [(None, 10, 1)]           0         
_________________________________________________________________
conv1d_9 (Conv1D)            (None, 10, 32)            352       
_________________________________________________________________
batch_normalization_15 (Batc (None, 10, 32)            128       
_________________________________________________________________
activation_9 (Activation)    (None, 10, 32)            0         
_________________________________________________________________
global_average_pooling1d_9 ( (None, 32)                0         
_________________________________________________________________
dense_14 (Dense)             (None, 3)                 99        
=================================================================
Total params: 579
Trainable params: 515
Non-trainable params: 64
_________________________________________________________________
Ran Successfully

希望这能回答您的问题。快乐学习。

【讨论】:

  • @Victor Sim - 希望我们已经回答了您的问题。如果您对答案感到满意,请您接受并投票。
猜你喜欢
  • 2020-10-27
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 2011-07-13
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多