期望dense_1有2个维度,但得到形状的数组(308,1,6)

时间:2017-05-01 05:49:37

标签: python tensorflow deep-learning keras keras-layer

我正在尝试首次使用Conv1D进行时间序列数据的多类分类,我的模型在使用时仍然会抛出此错误。

import numpy as np
import os

import keras
from keras.models import Sequential
from keras.layers import Conv1D, Dense, TimeDistributed, MaxPooling1D, Flatten

# fix random seed for reproducibility
np.random.seed(7)

dataset1 = np.genfromtxt(os.path.join('data', 'norm_cellcycle_384_17.txt'), delimiter=',', dtype=None)
data = dataset1[1:]

# extract columns
genes = data[:,0]
y_all = data[:,1].astype(int)
x_all = data[:,2:-1].astype(float)

# deleted this line when using sparse_categorical_crossentropy
# 384x6
y_all = keras.utils.to_categorical(y_all)

# 5
num_classes = np.unique(y_all).shape[0]

# split entire data into train set and test set
validation_split = 0.2

val_idx = np.random.choice(range(x_all.shape[0]), int(validation_split*x_all.shape[0]), replace=False)
train_idx = [x for x in range(x_all.shape[0]) if x not in val_idx]

x_train = x_all[train_idx]
y_train = y_all[train_idx]

# 308x17x1
x_train = x_train[:, :, np.newaxis]
# 308x1
y_train = y_train[:,np.newaxis]

x_test = x_all[val_idx]
y_test = y_all[val_idx]

# deleted this line when using sparse_categorical_crossentropy
y_test = keras.utils.to_categorical(y_test)

# 76x17x1
x_test = x_test[:, :, np.newaxis]
# 76x1
y_test = y_test[:,np.newaxis]


print(x_train.shape[0],'train samples')
print(x_test.shape[0],'test samples')


# Create Model 
# number of filters for 1D conv
nb_filter = 4
filter_length = 5

window = x_train.shape[1]
model = Sequential()

model.add(Conv1D(filters=nb_filter,kernel_size=filter_length,activation="relu", input_shape=(window,1)))
model.add(MaxPooling1D())
model.add(Conv1D(nb_filter=nb_filter, filter_length=filter_length, activation='relu'))
model.add(MaxPooling1D())
model.add(Flatten())
model.add(Dense(num_classes, activation='softmax'))
model.summary()
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(x_train, y_train, epochs=25, batch_size=2, validation_data=(x_test, y_test))

我不知道为什么会收到此错误。当我使用binary_crossentropy丢失而没有y_all的热编码时,我的模型可行。但是当我使用一个热编码y_all并使用categorical_crossentropy丢失时,它失败了。当我不使用一个热编码时,keras会抛出一个错误,让我将y_all改为一个二进制矩阵。 我甚至不知道数组中的(1,6)来自哪里。

  

ValueError:检查模型目标时出错:期望dense_1有2个维度,但得到的数组有形状(308,1,6)

请帮忙!我已经坚持了好几个小时!已经完成了所有相关问题,但仍然没有意义。

更新:我现在使用sparse_categorical_crossentropy,因为它有整数支持。我从上面的代码中删除了to_categorical行,我得到了这个新错误:

  

InvalidArgumentError(参见上面的回溯):收到标签值   5的有效范围在[0,5]之外。标签值:2 5
  [[节点:   SparseSoftmaxCrossEntropyWithLogits / SparseSoftmaxCrossEntropyWithLogits   = SparseSoftmaxCrossEntropyWithLogits [T = DT_FLOAT,Tlabels = DT_INT64,_device =“/ job:localhost / replica:0 / task:0 / cpu:0”](Reshape_1,Cast)]]

请求的数据样本:

,Main,Gp,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17
YDL179w,1,-0.75808,-0.90319,-0.98935,-0.73995,-0.67193,-0.12777,-0.95307,-1.01656,0.79730,2.11688,1.98537,0.61591,0.56603,-0.13684,-0.52228,-0.05068,0.78823,
YLR079w,1,-0.48845,-0.70828,-0.47688,-0.65814,-0.45374,-0.47302,-0.71214,-1.02839,0.24048,3.11376,1.28952,0.44874,0.04379,-0.31104,-0.30332,-0.34575,0.82285,
YER111c,1,-0.42218,0.23887,1.84427,-0.02083,-0.61105,-0.65827,-0.79992,-0.39857,-0.09166,2.03314,1.58457,0.68744,0.14443,-0.72910,-1.46097,-0.82353,-0.51662,
YBR200w,1,0.09824,0.55258,-0.89641,-1.19111,-1.11744,-0.76133,0.09824,2.16120,1.46126,1.03148,0.67537,-0.33155,-0.60170,-1.39987,-0.42978,-0.15963,0.81045,
YPL209c,2,-0.65282,-0.32055,2.53702,2.00538,0.60982,0.51014,-0.55314,-1.01832,-0.78573,0.01173,0.07818,-0.05473,-0.22087,0.24432,-0.28732,-1.11801,-0.98510,
YJL074c,2,-0.81087,-0.19448,1.72941,0.59002,-0.53069,-0.25051,-0.92294,-0.92294,-0.53069,0.08570,1.87884,1.97223,0.45927,-0.36258,-0.34390,-1.07237,-0.77351,
YNL233w,2,-0.43997,0.66325,2.85098,0.74739,-0.42127,-0.47736,-0.79524,-0.80459,-0.48671,-0.21558,1.25226,1.01852,-0.10339,-0.56151,-0.96353,-0.46801,-0.79524,
YLR313c,2,-0.46611,0.42952,3.01689,1.13856,0.01902,-0.44123,-0.66514,-0.98856,-0.59050,-0.47855,0.84002,0.39220,0.50416,-0.50342,-0.82685,-0.64026,-0.73977,
YGR041w,2,-0.57187,-0.26687,1.10561,-0.38125,-0.68624,-0.26687,-0.87687,-1.18186,-0.80062,0.60999,2.09686,1.82998,1.14374,0.11437,-0.80062,-0.87687,-0.19062,

2 个答案:

答案 0 :(得分:0)

所以我注意到即使我知道这个数据集中有5个类,如y_all获得的唯一值所示,出于某种原因,Keras to_categorical认为有6个类。

# 384x6 
y_all = keras.utils.to_categorical(y_all)

# 5 
num_classes = np.unique(y_all).shape[0]

我不知道为什么会这样。牢记这一点,我改变了这行代码,我的模型开始运行:

  

model.add(Dense(num_classes,activation ='softmax'))

  

model.add(Dense(num_classes + 1,activation ='softmax'))

我仍然不知道为什么to_categorical会这样做。有人知道吗?

答案 1 :(得分:0)

在Keras中,

const baseTable=[{exid:"2",name:"aa",children_meta:{has:false}},{exid:"1",name:"aa1",children_meta:{has:false}},{exid:"3",name:"bb",children_meta:{has:true},children:[{exid:"101",name:"c101"},{exid:"102",name:"c102"}]}];const againstTable=[{exid:"2",name:"aa",children_meta:{has:false}},{exid:"3",name:"bb",children_meta:{has:true},children:[{exid:"102",name:"c102"}]}]; const result = baseTable.reduce((output, baseItem) => { const matchOnExid = againstTable.find(againstItem => { return againstItem.exid === baseItem.exid; }); if (matchOnExid) { /* If match of exid found from agaistTable for current baseTable item then examine the children sub-arrays */ const baseChildren = baseItem.children; const againstChildren = matchOnExid.children; if (Array.isArray(baseChildren) && Array.isArray(againstChildren)) { /* If valid children sub-arrays exist of items, filter a subset of the baseItem children for items that do not exist in the children sub-array of the matched againstItem */ const matchChildrenOnExid = baseChildren.filter(baseChildItem => { return againstChildren.every(againstChildItem => { return againstChildItem.exid !== baseChildItem.exid; }); }); if (matchChildrenOnExid.length > 0) { /* If a subset of children do exist, then baseItem can be added to resulting array. Note also that we need to update the children array of the returned result to reflect the subset that was just found */ output.push({ ...baseItem, children: matchChildrenOnExid }); } } } else { /* If no match of exid found, just add the baseItem to the result */ output.push(baseItem); } return output; }, []); console.log(result);将给定参数编码为to_categorical(x)个类,其中n,即通常从n = max(x) + 1开始的类。