![](/img/trans.png)
[英]Keras - "ValueError: Error when checking target: expected activation_1 to have shape (None, 9) but got array with shape (9,1)
[英]keras: ValueError: Error when checking model target: expected activation_1 to have shape (None, 60) but got array with shape (10, 100)
我正在嘗試將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'))
給出以下異常:
ValueError:檢查模型目標時出錯:預期activation_1的形狀為(無,60),但數組的形狀為(10,100)
訓練數據集是一個(10、6、10、10)數組,每層10 x 6層,每層是10x10數組(棋盤),為什么需要模型(無,60)? 如果chagne input_shape=(6, 10, 10)
到input_shape=(10, 10, 10)
,將得到:
ValueError:檢查模型輸入時出錯:預期convolution2d_input_1具有形狀(None,10,10,10)但具有形狀(10,6,10,10)的數組
所有代碼都在這里
正如Matias在評論中所說,如果您添加
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文檔中找到了此信息
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.