【问题标题】:ValueError: Shapes () and (150, 5) are incompatible TenosrflowValueError: Shapes () 和 (150, 5) 不兼容 Tensorflow
【发布时间】:2020-11-28 07:56:08
【问题描述】:

所以我正在训练一个图像分类模型并且出现了这个错误。这个错误似乎没有任何答案。有人可以解释一下我的代码有什么问题吗?我正在使用 tf.data。标签有什么问题吗?我该怎么做才能解决这个问题:

import numpy as np
import pandas as pd
import os
from tqdm import tqdm
from sklearn.utils import shuffle

import cv2
import warnings

warnings.filterwarnings('ignore')

import tensorflow as tf
from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Dense, Flatten, Dropout, Activation, Conv1D, MaxPool1D

from tensorflow.keras.layers import Dense, Dropout, Activation, Input, BatchNormalization, GlobalAveragePooling2D

physical_devices = tf.config.list_physical_devices('GPU')
tf.config.experimental.set_memory_growth(physical_devices[0], True)
training_folder = r"F:\Pycharm_projects\Kaggle Cassava\data\train_images"
samples_df = pd.read_csv(r"F:\Pycharm_projects\Kaggle Cassava\data\train.csv")
samples_df = shuffle(samples_df, random_state=42)
samples_df["label"] = samples_df["label"].astype("str")
samples_df.head()
temp_labels = {}
imgg = []
lab = []
for i in range(len(samples_df)):
    image_name = samples_df.iloc[i, 0]
    image_label = samples_df.iloc[i, 1]
    la = {image_name: image_label}
    temp_labels.update(la)
print(len(temp_labels))
for im in tqdm(os.listdir(training_folder)):
    path = os.path.join(training_folder, im)
    label = temp_labels.get(im)
    img = cv2.imread(path)
    img = tf.image.random_crop(img, size=(150, 150, 3))
    imgg.append(img)
    lab.append(label)

lables = np.array(lab).astype(np.float32)
img = np.array(imgg).astype(np.float32)
train = tf.data.Dataset.from_tensor_slices((img, lables)).shuffle(buffer_size=1000)
print(tf.data.Dataset.cardinality(train))
model = Sequential()
model.add(Conv1D(filters=16, kernel_size=2, strides=1, activation="relu"))
model.add(BatchNormalization())

model.add(Conv1D(filters=16, kernel_size=2, strides=1, activation="relu"))
model.add(BatchNormalization())

model.add(BatchNormalization())

model.add(Flatten())
model.add(Dense(5, activation="sigmoid"))

tf.keras.optimizers.Adam(
    learning_rate=0.0001, )
model.compile(optimizer='adam',
              loss="categorical_crossentropy"
              ,
              metrics=['accuracy'])
model.fit(train, batch_size=32, shuffle=True, epochs=1)

我可以做些什么来解决这个错误。

【问题讨论】:

    标签: python numpy tensorflow machine-learning keras


    【解决方案1】:

    首先,如果您提供图像,您应该使用Conv2D 而不是Conv1D。 (see doc)

    然后,添加这个:

    model.add(tf.keras.layers.Input(shape=(150,150,3)))
    

    在这两层之间:

    model = Sequential()
    
    model.add(tf.keras.layers.Input(shape=(150,50)))
    
    model.add(Conv2D(filters=16, kernel_size=2, strides=(1,1), activation="relu"))
    

    同时更改model.fit

    model.fit(images,labels, batch_size=32, shuffle=True, epochs=1)
    
    

    【讨论】:

    • 我收到此 ValueError:conv1d_4 层的输入 0 与该层不兼容::预期 min_ndim=3,发现 ndim=2。收到的完整形状:(无,5)
    • 我不知道你在为你的网络提供什么,你的图片是什么形状的?
    • 150,150,3 看到这个 img = tf.image.random_crop(img, size=(150, 150, 3))
    • 得到这个 ValueError: 层 conv2d 的输入 0 与层不兼容: : 预期 min_ndim=4, 发现 ndim=3。收到的完整形状:(无,150,150)。我应该在图像大小上添加一些东西
    • 试试这个 model.fit(img, lables, batch_size=32, shuffle=True, epochs=1)
    【解决方案2】:

    首先,改变你的最后一层激活函数。用于二进制分类的“sigmoid”激活。看来你有 5 个类而不是 2 个。所以将“sigmoid”更改为“softmax”并重试。

    【讨论】:

    • 仍然得到 ``` ValueError: Shapes () and (150, 5) are incompatible ```
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2021-05-29
    • 2016-08-26
    • 2021-03-17
    相关资源
    最近更新 更多