繁体   English   中英

如何解决 tensorflow CNN 中“:形状不兼容”的错误?

[英]How can I solve error of ": Incompatible shapes" in tensorflow CNN?

我是 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 中的图像进行分类的另一种方法,请帮助我?

问题可能是,您没有在 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'))

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM