我是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]与[64,11,11,1] [[{{nodemetrics / acc / Equal}}]
如果有人知道使用其自己的数据集图像对张量流中的图像进行分类的另一种方法,请帮帮我吗?
答案 0 :(得分:0)
问题可能是您没有在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'))
希望这会有所帮助!