簡體   English   中英

為什么我的 tensorflow 程序中不斷出現值錯誤?

[英]Why did the value error keep coming in my tensorflow program?

當我嘗試安裝我為分類圖像而構建的 model 時,我總是收到錯誤消息:

ValueError: Input 0 of layer thumbnail is incompatible with the layer: expected ndim=4, found ndim=3. Full shape received: [160, 240, 3]

我不知道為什么會這樣,因為圖像的形狀都是正確的:每張圖像 (240, 160, 3)。 我將所有標簽和示例放入 function loadData() 中的 tf.data.Dataset 中。 順序 model 期望(示例,標簽),所以我想這很好。

import numpy as np
import tensorflow as tf
import os
from PIL import Image
from sklearn.model_selection import train_test_split

def loadData(nExamplesPerClass=1):
    path = os.path.dirname(__file__) + '\\croppedData\\'
    res = []
    labels = []

    for i, file in enumerate(os.listdir(path + 'pos')):
        if i == nExamplesPerClass:
            break 
        image = np.asarray(Image.open(path + 'pos\\' + file))
        res.append(image)

    for i, file in enumerate(os.listdir(path + 'neg')):
        if i == nExamplesPerClass:
            break
        image = np.asarray(Image.open(path + 'neg\\' + file))
        res.append(image)

    labels = [1 for _ in range(nExamplesPerClass)]
    labels += [0 for _ in range(nExamplesPerClass)]

    res, labels = shuffle_in_unison(np.array(res), np.array(labels))
    # res.shape = (200, 240, 160, 3) (examples, width, height, color channels)

    return tf.data.Dataset.from_tensor_slices((res, labels))

def shuffle_in_unison(a, b):
    n_elem = a.shape[0]
    indeces = np.random.permutation(n_elem)
    return a[indeces], b[indeces]

def main():
    model = tf.keras.Sequential(name="thumbnail")
    model.add(tf.keras.layers.Conv2D(filters=48, kernel_size=(5,5), strides=(1,1), padding='same', name='1', activation='relu', data_format='channels_last', input_shape=(240, 160, 3)))
    model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=(5,5), strides=(1,1), padding='same', name='2',activation='relu'))
    model.add(tf.keras.layers.Conv2D(filters=16, kernel_size=(5,5), strides=(1,1), padding='same', name='3',activation='relu'))
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(256, activation='tanh', name='4'))
    model.add(tf.keras.layers.Dropout(rate=0.4))
    model.add(tf.keras.layers.Dense(32, activation='sigmoid'))
    model.add(tf.keras.layers.Dense(2, activation='softmax'))

    X = loadData(nExamplesPerClass=100)

    model.compile(optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.SparseCategoricalCrossentropy(), 
        metrics=['binary_accuracy', 'FalsePositives', 'FalseNegatives'])

    EPOCHS = 1

    print(model.fit(X, verbose=1))

if __name__ == "__main__":
    main()

您需要批處理數據集:

X = loadData(nExamplesPerClass=100)
X = X.batch(32)  # or your number of samples per batch

fit function 沒有用於將數據集拆分為批次的內置功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM