[英]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.