【问题标题】:keras: ValueError: Error when checking model target: expected activation_1 to have shape (None, 60) but got array with shape (10, 100)keras:ValueError:检查模型目标时出错:预期activation_1具有形状(None,60)但得到形状为(10、100)的数组
【发布时间】:2018-07-29 08:19:47
【问题描述】:

我正在尝试移植RocAlphaGo 来玩亚马逊游戏,在尝试实施监督策略训练器时出现问题。

from keras.models import Sequential, Model
from keras.layers.core import Activation, Flatten
from keras.layers import convolutional

defaults = {
            "board": 10,
            "filters_per_layer": 128,
            "layers": 12,
            "filter_width_1": 5
}
# copy defaults, but override with anything in kwargs
params = defaults
network = Sequential()
# create first layer
network.add(convolutional.Convolution2D(
      input_shape=(6, 10, 10),
      nb_filter=128,
      nb_row=5,
      nb_col=5,
      init='uniform',
      activation='relu',
      border_mode='same'))

# create all other layers
for i in range(2, 13):
     # use filter_width_K if it is there, otherwise use 3
     filter_key = "filter_width_%d" % i
     filter_width = params.get(filter_key, 3)

     # use filters_per_layer_K if it is there, otherwise use default value
     filter_count_key = "filters_per_layer_%d" % i
     filter_nb = params.get(filter_count_key, 128)

     network.add(convolutional.Convolution2D(
         nb_filter=filter_nb,
         nb_row=filter_width,
         nb_col=filter_width,
         init='uniform',
         activation='relu',
         border_mode='same'))

# the last layer maps each <filters_per_layer> feature to a number
network.add(convolutional.Convolution2D(
    nb_filter=1,
    nb_row=1,
    nb_col=1,
    init='uniform',
    border_mode='same'))
# reshape output to be board x board
network.add(Flatten())
# softmax makes it into a probability distribution
network.add(Activation('softmax'))
  • keras 1.2.0
  • python 2.7

给出以下异常:

ValueError:检查模型目标时出错:预期activation_1 到 有形状 (None, 60) 但得到了形状 (10, 100) 的数组

训练数据集是一个 (10, 6, 10, 10) 数组,10 x 6 层,每层是一个 10x10 数组(棋盘),为什么模型需要 (None, 60) ? 如果 chagne input_shape=(6, 10, 10)input_shape=(10, 10, 10),将得到:

ValueError:检查模型输入时出错:预期 convolution2d_input_1 具有形状 (None, 10, 10, 10) 但得到了数组 形状为 (10, 6, 10, 10)

所有代码都是here

【问题讨论】:

  • 您应该使用 model.summary() 来获得输入和输出形状的概览。

标签: python tensorflow keras convolution


【解决方案1】:

正如 Matias 在 cmets 中所说,如果你添加

network.summary() 

您可能会注意到您的卷积应用于输入数据的前两个维度(即 (6,10,10))。你在这里的特征是在第一维。默认情况下,当您使用 tensorflow 时,Keras 会假设您的特征所在的维度是第三个维度,而不是第一个维度。因此,当您在 (6,10,10) 数组上应用 128 个过滤器时,输出将是 (6,10,128),如果我理解得很好,这不是您想要的。

因此,在最后一个卷积层的输出处,您会得到一个 (6,10,1) 数组,该数组平展为 (,60),而不是您预期的 (,100)。

有两种方法可以修复您的网络。您可以将输入数据更改为 (10,10,6) 格式。或者你使用Convolution2D()层的data_format="channels_first"参数。

这是第二个选项的代码:

from keras.models import Sequential, Model
from keras.layers.core import Activation, Flatten
from keras.layers import convolutional

defaults = {
            "board": 10,
            "filters_per_layer": 128,
            "layers": 12,
            "filter_width_1": 5
}
# copy defaults, but override with anything in kwargs
params = defaults
network = Sequential()
# create first layer
network.add(convolutional.Convolution2D(
      input_shape=(6, 10, 10),
      nb_filter=128,
      nb_row=5,
      nb_col=5,
      init='uniform',
      activation='relu',
      border_mode='same',
      data_format='channels_first'
      ))

# create all other layers
for i in range(2, 13):
     # use filter_width_K if it is there, otherwise use 3
     filter_key = "filter_width_%d" % i
     filter_width = params.get(filter_key, 3)

     # use filters_per_layer_K if it is there, otherwise use default value
     filter_count_key = "filters_per_layer_%d" % i
     filter_nb = params.get(filter_count_key, 128)

     network.add(convolutional.Convolution2D(
         nb_filter=filter_nb,
         nb_row=filter_width,
         nb_col=filter_width,
         init='uniform',
         activation='relu',
         border_mode='same',
         data_format='channels_first'))

# the last layer maps each <filters_per_layer> feature to a number
network.add(convolutional.Convolution2D(
    nb_filter=1,
    nb_row=1,
    nb_col=1,
    init='uniform',
    border_mode='same',
    data_format='channels_first'))
# reshape output to be board x board
network.add(Flatten())
# softmax makes it into a probability distribution
network.add(Activation('softmax'))
# display your network summary
network.summary()

编辑

考虑到您的 keras 版本,您应该使用参数“dim_ordering”并将其设置为“th”。

我在keras documentation找到了这个信息

from keras.models import Sequential, Model
from keras.layers.core import Activation, Flatten
from keras.layers import convolutional

defaults = {
            "board": 10,
            "filters_per_layer": 128,
            "layers": 12,
            "filter_width_1": 5
}
# copy defaults, but override with anything in kwargs
params = defaults
network = Sequential()
# create first layer
network.add(convolutional.Convolution2D(
      input_shape=(6, 10, 10),
      nb_filter=128,
      nb_row=5,
      nb_col=5,
      init='uniform',
      activation='relu',
      border_mode='same',
      dim_ordering='th'
      ))

# create all other layers
for i in range(2, 13):
     # use filter_width_K if it is there, otherwise use 3
     filter_key = "filter_width_%d" % i
     filter_width = params.get(filter_key, 3)

     # use filters_per_layer_K if it is there, otherwise use default value
     filter_count_key = "filters_per_layer_%d" % i
     filter_nb = params.get(filter_count_key, 128)

     network.add(convolutional.Convolution2D(
         nb_filter=filter_nb,
         nb_row=filter_width,
         nb_col=filter_width,
         init='uniform',
         activation='relu',
         border_mode='same',
         dim_ordering='th'))

# the last layer maps each <filters_per_layer> feature to a number
network.add(convolutional.Convolution2D(
    nb_filter=1,
    nb_row=1,
    nb_col=1,
    init='uniform',
    border_mode='same',
    dim_ordering='th'))
# reshape output to be board x board
network.add(Flatten())
# softmax makes it into a probability distribution
network.add(Activation('softmax'))
# display your network summary
network.summary()

【讨论】:

  • 对不起,我没有注意到你的 keras 版本。将“data_format='channels_first'”更改为“dim_ordering='th'”
  • 你的 network.summary() 对我做同样的事情,直到我改变 data_format ;-)
  • 貌似不能用data_formatTypeError: ('Keyword argument not understood:', 'data_format'),加上network.summary()会得到:[Ubuntu Pastebin](paste.ubuntu.com/p/6twq2g3K2g),我是尝试将输入数据集更改为格式 (10,10,6)
  • 非常感谢,它有效。您的回复真的很快,感谢您的帮助:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2019-11-18
  • 2017-01-13
  • 1970-01-01
  • 2020-08-29
相关资源
最近更新 更多