所以我做了一个神经网络模型,用张量流keras对狗和猫进行分类,但它的准确性并没有提高。有什么建议吗?



所以我对这个东西相当陌生,我写了一些代码,写在下面,我做的模型似乎没有对猫和狗进行分类。基本上数据是猫狗图片的大量集合,从 12500 只猫开始,然后按该顺序排列 12500 只狗。我似乎无法弄清楚为什么这不起作用。我尝试过调整重量和批量大小,但没有任何效果。有什么建议吗?

import tensorflow as tf
from tensorflow import keras
import numpy as np
import cv2
import os
import random
import pickle
#cat: 1, dog: 0
training_data_path = '/Path/to/folder/containing/images'
IMG_SIZE = 100
training_data = []

def create_training_data():
counter = 0
for file in os.listdir(training_data_path):
if 'cat' in str(file):
label = 1
img_path = os.path.join(training_data_path, file)
array = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
new_array = cv2.resize(array, (IMG_SIZE, IMG_SIZE))
training_data.append([new_array, label])
print(counter)
counter += 1
else:
label = 0
img_path = os.path.join(training_data_path, file)
print(img_path)
print(label)
array = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
new_array = cv2.resize(array, (IMG_SIZE, IMG_SIZE))
training_data.append([new_array, label])
print(counter)
counter += 1
random.shuffle(training_data)
X = []
y = []
for point in training_data:
X.append(point[0])
y.append(point[1])
X = np.array(X)
y = np.array(y)
pickle_out = open('X3.pickle', 'wb')
pickle.dump(X, pickle_out)
pickle_out.close()
pickle_out = open('y3.pickle', 'wb')
pickle.dump(y, pickle_out)
pickle_out.close()

def NN_model():
pickle_in = open('X3.pickle', 'rb')
pickle_in_2 = open('y3.pickle', 'rb')
batch_size = 1000
X = pickle.load(pickle_in)
y = pickle.load(pickle_in_2)
inputs = keras.Input(shape=(X.shape[1:]))  
f = keras.layers.Flatten()(inputs)
predictions = keras.layers.Dense(2, activation=tf.nn.softmax)(f)
model = keras.Model(inputs=inputs, outputs=predictions)

model.compile(optimizer=tf.train.AdamOptimizer(learning_rate=0.1),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(X, y, epochs=5, batch_size=batch_size)

NN_model()

您基本上有一个带有两个单元的密集层来对图像进行分类。 这是行不通的,您的网络太"简单"了,无法对图像进行分类。

我建议您查看以下教程:

凯拉斯图像分类

他们的模型片段如下:

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(3, 150, 150)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3)))
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())  # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

最新更新