【发布时间】:2019-12-05 10:06:42
【问题描述】:
我是 tensorflow 和 keras 的新手,不知道如何加载我的数据以适应模型。
我尝试使用从图像路径和标签列表构建的 tf.dataset,但无济于事。我知道下面代码中的模型本身可能不太适合我的任务。我只是想尝试 tf 并学习如何建立模型并训练它。我的图片有多种格式(tiff、png、jpg)并且有不同的尺寸。这就是为什么我需要调整它们的大小并将它们转换为 numpy-arrays。我按照这个帖子试了一下:TensorFlow: training on my own image
import tensorflow as tf
import random
import numpy
import cv2
from PIL import Image
from pathlib import Path
import os
from tensorflow.keras.preprocessing.image import ImageDataGenerator
training_data_path = Path("/home/xxxx/validation_data")
validation_data_path = Path("/home/xxxx/validation_data")
test_data_paths = Path("/home/xxxx/test_data")
validation_image_paths = list(validation_data_path.glob("**/*"))
label_array = ["DIS","ANG", "FEA", "SAD", "SUR", "JOY", "NEU"]
label_to_index = dict((name, index) for index,name in enumerate(label_array))
def getLabelDict(image_paths):
all_image_labels = [label_to_index[Path(path).absolute().name[0:3]]
for path in image_paths]
return all_image_labels
def getLabelList(image_paths):
all_img_labels = list()
for path in image_paths:
all_img_labels.append(Path(path).absolute().name[0:3])
return all_img_labels
def preProcessPath(path):
return path.absolute().name
def get_ds(data_path):
image_paths = list(data_path.glob("**/*"))
img_paths = tf.constant(image_paths)
dataset = tf.data.Dataset.from_tensor_slices((img_paths, getLabelList(image_paths)))
for path in image_paths:
dataset.map(getPic(path))
return dataset
def getPic(path):
image = Image.open(path).convert('RGB')
image = image.resize((256,256,3))
array = numpy.array(image.getdata())
array = array.reshape((256,256,3))
return array
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
ds_inputs, ds_labels = get_ds(test_data_paths).make_one_shot_iterator()
val_inputs, val_labels= validation_data=get_ds(validation_data_path).make_one_shot_iterator()
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(256,256,3)),
tf.keras.layers.Dense(128, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(ds_inputs, epochs=1, steps_per_epoch=3,validation_data=val_inputs)
编辑:删除代码中不必要的行
现在我收到一个类型错误:TypeError: 无法将类型对象转换为张量。内容:
【问题讨论】:
-
你能修复你的代码缩进吗?
for path in training_data_path.glob("**/*"):下面的行应该缩进。此外,您可能会考虑将所有函数定义放在主代码之前,以使其更具可读性。
标签: python tensorflow keras neural-network