【问题标题】:How can I solve error of ": Incompatible shapes" in tensorflow CNN?如何解决 tensorflow CNN 中“:不兼容的形状”的错误?
【发布时间】:2020-03-10 21:43:20
【问题描述】:

我是 Tensorflow 的初学者,我尝试创建一个 CNN 来对图像进行分类,这是我的训练模型代码:

import tensorflow as tf 
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Dropout,Activation,Flatten,Conv2D,MaxPooling2D
import pickle
from tensorflow.keras import backend as K


X=pickle.load(open("X.pickle","rb"))
Y=pickle.load(open("Y.pickle","rb"))

print(X.shape[1:])
X=X/255.0
print("_____________________________________")
print(X.shape[1:])
model=Sequential()
model.add(Conv2D(64,(3,3),input_shape=X.shape[1:]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Dense(64))

model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss="sparse_categorical_crossentropy",optimizer="adam",metrics=['accuracy'])
model.fit(X,Y,batch_size=64,validation_split=0.1)

这是图像预处理

import cv2
import numpy as np 
import matplotlib.pyplot as plt 
import os 
import random

DATADIR="C:/myDirectory/PetImages"
CATEGORIES=["Dog","cat"]

IMG_SIZE=50

training_data=[]

def create_training_data():
    for categorie in CATEGORIES:
        path=os.path.join(DATADIR,categorie)

        class_num=CATEGORIES.index(categorie)
        for img in os.listdir(path):
            try:
                img_array=cv2.imread(os.path.join(path,img),cv2.IMREAD_GRAYSCALE)   
                new_array=cv2.resize(img_array,(IMG_SIZE,IMG_SIZE))
                training_data.append([new_array,class_num])
            except Exception as e:
                pass

 create_training_data()
 print(len(training_data))

 random.shuffle(training_data)

X=[]
Y=[]

for features,label in training_data:
    X.append(features)
    Y.append(label)

X=np.array(X).reshape(-1,IMG_SIZE,IMG_SIZE,1)

print(X.shape[1:])
import pickle

pickle_out=open("X.pickle","wb")
pickle.dump(X,pickle_out)
pickle_out.close()


pickle_out=open("Y.pickle","wb")
pickle.dump(Y,pickle_out)
pickle_out.close()

我得到了这个错误: tensorflow.python.framework.errors_impl.InvalidArgumentError:不兼容的形状:[64,1] vs. [64,11,11,1] [[{{node metrics/acc/Equal}}]]

如果有人知道使用自己的数据集图像在 tensorflow 中对图像进行分类的另一种方法,请帮助我?

【问题讨论】:

    标签: python image tensorflow conv-neural-network


    【解决方案1】:

    问题可能是,您没有在 Conv 和 Dense 层之间使用 Flatten()。密集层无法处理 Conv 层的直接输出,因此需要将它们展平。

    例子:

    model=Sequential()
    model.add(Conv2D(64,(3,3),input_shape=X.shape[1:]))
    model.add(Activation("relu"))
    model.add(MaxPooling2D(pool_size=(2,2)))
    
    model.add(Conv2D(64,(3,3)))
    model.add(Activation("relu"))
    model.add(MaxPooling2D(pool_size=(2,2)))
    
    model.add(Flatten())
    model.add(Dense(64))
    model.add(Activation('relu'))
    
    model.add(Dense(1))
    model.add(Activation('sigmoid'))
    

    希望这会有所帮助!

    【讨论】:

    • 添加 Flatten() 时出现此错误:tensorflow.python.framework.errors_impl.InvalidArgumentError: 收到的标签值 1 超出 [0, 1) 的有效范围。标签值:1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 1 1 1 [[{ {node loss/activation_3_loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits}}]]
    • 你正在尝试使用sparse_categorical_crossentropy,所以输出层应该是:model.add(Dense(2)) model.add(Activation("softmax"))
    • 你可以使用 sigmoid 激活,但你应该使用二元交叉熵
    • 输出层节点应该等于你拥有的类的数量,对于你想要实现的稀疏交叉熵和 softmax 激活
    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 2017-10-25
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 2022-12-12
    相关资源
    最近更新 更多