Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法将输出层设置为“分类”_Python_Keras_Conv Neural Network - Fatal编程技术网

Python 无法将输出层设置为“分类”

Python 无法将输出层设置为“分类”,python,keras,conv-neural-network,Python,Keras,Conv Neural Network,我目前正在尝试实现一个CNN,其目的是执行分类,但由于某些原因,我无法将输出维度定义为1 下面是一个示例代码: import keras from keras.layers.merge import Concatenate from keras.models import Model from keras.layers import Input, Dense from keras.layers import Dropout from keras.layers.core import Dense,

我目前正在尝试实现一个CNN,其目的是执行分类,但由于某些原因,我无法将输出维度定义为1

下面是一个示例代码:

import keras
from keras.layers.merge import Concatenate
from keras.models import Model
from keras.layers import Input, Dense
from keras.layers import Dropout
from keras.layers.core import Dense, Activation, Lambda, Reshape,Flatten
from keras.layers import Conv2D, MaxPooling2D, Reshape, ZeroPadding2D
import numpy as np

train_data_1 = np.random.randint(100,size=(100,3,6,3))
train_data_2 = np.random.randint(100,size=(100,3,6,3))
test_data_1 = np.random.randint(100,size=(10,3,6,3))
test_data_2 = np.random.randint(100,size=(10,3,6,3))
labels_train_data =np.random.randint(145,size=100)
labels_test_data =np.random.randint(145,size=10)


input_img_1 = Input(shape=(3, 6, 3))
input_img_2 = Input(shape=(3, 6, 3))

conv2d_1_1 = Conv2D(filters = 32, kernel_size = (3,3) , padding = "same" , activation = 'relu' , name = "conv2d_1_1" )(input_img_1)
conv2d_2_1 = Conv2D(filters = 64, kernel_size = (3,3) , padding = "same" , activation = 'relu' )(conv2d_1_1)
conv2d_3_1 = Conv2D(filters = 64, kernel_size = (3,3) , padding = "same" , activation = 'relu' )(conv2d_2_1)
conv2d_4_1 = Conv2D(filters = 32, kernel_size = (1,1) , padding = "same" , activation = 'relu' )(conv2d_3_1)
conv2d_4_1_flatten = Flatten()(conv2d_4_1)

conv2d_1_2 = Conv2D(filters = 32, kernel_size = (3,3) , padding = "same" , activation = 'relu' , name = "conv2d_1_2")(input_img_2)
conv2d_2_2 = Conv2D(filters = 64, kernel_size = (3,3) , padding = "same" , activation = 'relu' )(conv2d_1_2)
conv2d_3_2 = Conv2D(filters = 64, kernel_size = (3,3) , padding = "same" , activation = 'relu' )(conv2d_2_2)
conv2d_4_2 = Conv2D(filters = 32, kernel_size = (1,1) , padding = "same" , activation = 'relu' )(conv2d_3_2)
conv2d_4_2_flatten = Flatten()(conv2d_4_2)


merge = keras.layers.concatenate([conv2d_4_1_flatten, conv2d_4_2_flatten])

dense1 = Dense(100, activation = 'relu')(merge)
dense2 = Dense(50,activation = 'relu')(dense1)
dense3 = Dense(1 ,activation = 'softmax')(dense2)


model = Model(inputs = [input_img_1, input_img_2] , outputs = dense3)
model.compile(loss="sparse_categorical_crossentropy", optimizer="adam")

print model.summary()

labels_train = keras.utils.to_categorical(labels_train_data, num_classes=145)
labels_test = keras.utils.to_categorical(labels_test_data, num_classes=145)

hist_current = model.fit(x = [train_data_1, train_data_2],
                    y = labels_train,
                    shuffle=False,
                    validation_data=([test_data_1 ,test_data_2], labels_test),
                    validation_split=0.1,
                    epochs=150000,
                    batch_size = 15,
                    verbose=1)
错误消息是:

Traceback (most recent call last):
  File "test_model.py", line 57, in <module>
    verbose=1)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1405, in fit
    batch_size=batch_size)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1299, in _standardize_user_data
    exception_prefix='model target')
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 133, in _standardize_input_data
    str(array.shape))
ValueError: Error when checking model target: expected dense_3 to have shape (None, 1) but got array with shape (100, 145)
回溯(最近一次呼叫最后一次):
文件“test_model.py”,第57行,在
详细=1)
文件“/usr/local/lib/python2.7/dist-packages/keras/engine/training.py”,第1405行,适合
批次大小=批次大小)
文件“/usr/local/lib/python2.7/dist-packages/keras/engine/training.py”,第1299行,在用户数据中
异常(前缀为“模型目标”)
文件“/usr/local/lib/python2.7/dist packages/keras/engine/training.py”,第133行,输入数据
str(array.shape))
ValueError:检查模型目标时出错:预期密集_3具有形状(无,1),但获得具有形状(100145)的数组

您的模型中存在一些不一致之处:

  • dense3=Dense(1,激活='softmax')(dense2)
    :不能在一个神经元上单独使用softmax。softmax规范化层的输出,使其总和为1。。。在这种情况下,如果仅对一个值进行规格化,它将始终输出1。然而,这并不是您得到错误的原因
  • 你们有几节课?从您的网络中,您输出一个值(最后一层是密集的(1)),因此我希望您希望预测两个类(输出1或0)。但这里我们看到你的输出是一个有145种可能性的分类。。。您的
    label\u train
    数组是100个长度为145的热向量,因此我假设您希望将100个样本分类为145个不同的类别。。。这就是keras抱怨的原因,您的网络输出(100,1)和目标(标签)是(100145)。你真正想做什么
  • 编辑:

    在注释之后,由于要预测图像是否属于145个类中的一个,因此必须输出145个值。因此,您必须更改网络的顶层,以便最后一层是密集的(145,activation='softmax')。所以我建议你替换

    dense1 = Dense(100, activation = 'relu')(merge)
    dense2 = Dense(50,activation = 'relu')(dense1)
    dense3 = Dense(1 ,activation = 'softmax')(dense2)
    

    如果你真的想有3个密集层,否则你可以删除中间的一个。。。这将取决于您的用例,因此隐藏层的体系结构取决于您。我只是坚持你的最后一层应该是密集的(145,activation='softmax')

    有道理吗

    编辑2:

    最重要的是,你不应该将你的目标(标签)编码为分类,当你使用稀疏的分类交叉熵时,它是在引擎盖下自动完成的

    因此,要么使用
    keras.utils.to\u categorical
    对目标使用
    loss=categorical\u crossentropy

    或者不使用
    keras.utils.to\u category
    将目标转换为\u category并使用
    loss=sparse\u category\u crossentropy


    它正在我的机器上运行。

    1。谢谢这肯定需要纠正。我基本上是在图像上做分类,我有145个类,训练数据的数量肯定大于100(251058…),但出于提问的目的,我做了这个快速的例子。图像被分为若干部分,各部分是图像的某些部分,其中执行了某些卷积。从某种意义上说,这个权重只在本地区共享。合并所有特征,完全连接的层应该根据输入执行分类。我已经编辑了我的答案。对于记录,当您使用密集型(1)时,使用'sigmoid'激活来预测两个类之间的差异,或者使用密集型(2,activation='softmax'),这是相同的。您可以复制粘贴错误吗?这没有道理。和以前完全一样。似乎就是这样!谢谢你的帮助:)
    dense1 = Dense(200, activation = 'relu')(merge)
    dense2 = Dense(150, activation = 'relu')(dense1)
    dense3 = Dense(145, activation = 'softmax')(dense2)