Keras 回调导致错误:您必须使用 dtype float 为占位符张量“conv2d_1_input”提供一个值

2024-01-31

我对张量流、keras 和深度学习场景很陌生。 我尝试制作一个简单的神经网络来识别 fer2013 数据库中的情绪,但在训练第一个 epoch 后不断遇到此错误

File "main.py", line 92, in <module>
    train(image_data, label_data, conv_arch, dense, dropout, epochs, batch_size, validation_split, patience)
File "main.py", line 38, in train
    hist = model.fit(image_data, label_data, epochs=epochs, batch_size=batch_size, validation_split=validation_split, callbacks=callbacks, shuffle=True, verbose=1)
File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras/models.py", line 965, in fit
    validation_steps=validation_steps)
File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras/engine/training.py", line 1669, in fit
    validation_steps=validation_steps)
File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras/engine/training.py", line 1226, in _fit_loop
    callbacks.on_epoch_end(epoch, epoch_logs)
File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras/callbacks.py", line 76, in on_epoch_end
    callback.on_epoch_end(epoch, logs)
File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras/callbacks.py", line 786, in on_epoch_end
    result = self.sess.run([self.merged], feed_dict=feed_dict)
File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 767, in run
    run_metadata_ptr)
File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 965, in _run
    feed_dict_string, options, run_metadata)
File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1015, in _do_run
    target_list, options, run_metadata)
File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1035, in _do_call
    raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'conv2d_1_input' with dtype float
     [[Node: conv2d_1_input = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

Caused by op u'conv2d_1_input', defined at:
  File "main.py", line 92, in <module>
    train(image_data, label_data, conv_arch, dense, dropout, epochs, batch_size, validation_split, patience)
  File "main.py", line 25, in train
    model = create_model(image_data, label_data, conv_arch=conv_arch, dense=dense, dropout=dropout)
  File "/Users/rifkibramantyo/tensorflow/variance/src/deepCNN.py", line 22, in create_model
    model.add(Conv2D(conv_arch[0][0], kernel_size=(3, 3), strides=3, padding='same', activation='relu', data_format='channels_first', input_shape=(1, image_data_train.shape[2], image_data_train.shape[3])))
  File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras/models.py", line 463, in add
    name=layer.name + '_input')
  File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras/engine/topology.py", line 1455, in Input
    input_tensor=tensor)
  File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras/legacy/interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras/engine/topology.py", line 1364, in __init__
    name=self.name)
  File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py", line 504, in placeholder
    x = tf.placeholder(dtype, shape=shape, name=name)
  File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/array_ops.py", line 1520, in placeholder
    name=name)
  File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/gen_array_ops.py", line 2149, in _placeholder
    name=name)
  File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 763, in apply_op
    op_def=op_def)
  File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2395, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "/Users/rifkibramantyo/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1264, in __init__
    self._traceback = _extract_stack()

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'conv2d_1_input' with dtype float
   [[Node: conv2d_1_input = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

我试图摆弄代码,当我删除回调数组时,错误消失了main.py?我的回调格式是否错误?

这是源代码

main.py

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from datetime import datetime

import numpy as np
from keras.callbacks import EarlyStopping, TensorBoard
from keras.utils import plot_model
from keras import backend as K

from deepCNN import *
from log import *

K.set_learning_phase(1)

def load_test_data():
    image_data_fname = '../data/data_images_Training.npy'
    label_data_fname = '../data/data_labels_Training.npy'
    image_data = np.load(image_data_fname)
    label_data = np.load(label_data_fname)
    return image_data, label_data

def train(image_data, label_data, conv_arch, dense, dropout, epochs, batch_size, validation_split, patience):
    model = create_model(image_data, label_data, conv_arch=conv_arch, dense=dense, dropout=dropout)
    plot_model(model, to_file="graph.png")
    # define callbacks
    callbacks = []
    if patience != 0:
        early_stopping = EarlyStopping(monitor='val_loss', patience=patience, verbose=1)
        tensor_board = TensorBoard(log_dir='../logs', histogram_freq=1, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None)
        callbacks.append(early_stopping)
        callbacks.append(tensor_board)

    start_time = datetime.now()
    print('Training....\n')

    hist = model.fit(image_data, label_data, epochs=epochs, batch_size=batch_size, validation_split=validation_split, callbacks=callbacks, shuffle=True, verbose=1)
    end_time = datetime.now()

    # model result:
    train_val_accuracy = hist.history
    train_acc = train_val_accuracy['acc']
    val_acc = train_val_accuracy['val_acc']
    print('          Done!')
    print('     Train acc: ', train_acc[-1])
    print('Validation acc: ', val_acc[-1])
    print(' Overfit ratio: ', val_acc[-1] / train_acc[-1])

    my_log(model, start_time, end_time,
           batch_size=batch_size,
           epochs=epochs,
           conv_arch=conv_arch,
           dense=dense,
           dropout=dropout,
           image_data_shape=image_data.shape,
           train_acc=train_acc,
           val_acc=val_acc,
           dirpath=result_location)


if __name__ == '__main__':
    image_data, label_data = load_test_data()

    result_location = '../data/results/'

    arr_conv_arch = [[(32, 1), (64, 0), (128, 0)],
                     [(32, 0), (64, 1), (128, 0)],
                     [(32, 0), (64, 0), (128, 1)],
                     [(32, 2), (64, 0), (128, 0)],
                     [(32, 3), (64, 0), (128, 0)],
                     [(32, 1), (64, 1), (128, 1)],
                     [(32, 2), (64, 2), (128, 1)],
                     [(32, 3), (64, 2), (128, 1)],
                     [(32, 3), (64, 3), (128, 3)]]
    arr_dense = [[64, 2], (256,2),(256,4),(512,2),(512,4)]
    arr_dropouts = [0.2, 0.3, 0.4, 0.5]
    arr_epochs = [1, 10, 40]
    arr_batch_size = [50, 256]
    validation_split = 0.2
    patience = 5

    #train(image_data, label_data, arr_conv_arch[8], arr_dense[0], arr_dropouts[0], 1, arr_batch_size[0], validation_split, patience)
    #train(image_data, label_data, arr_conv_arch[1], arr_dense[1], arr_dropouts[0], arr_epochs[0], arr_batch_size[0], validation_split, patience)

    for conv_arch in arr_conv_arch:
            for dense in arr_dense:
                for dropout in arr_dropouts:
                    for epochs in arr_epochs:
                        for batch_size in arr_batch_size:
                            print_architecture(image_data.shape, label_data.shape, batch_size, dropout, epochs, conv_arch, dense)
                            train(image_data, label_data, conv_arch, dense, dropout, epochs, batch_size, validation_split, patience)

深度CNN.py

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os

# disable some warnings
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dropout, Flatten, Dense
from keras.models import Sequential
from keras.layers.core import K

K.set_learning_phase(1)

def create_model(image_data_train, label_data_train, conv_arch=[(32, 1)], dense=[32, 1], dropout=0.5):
    image_data_train = image_data_train.astype('float32')

    # Define model:
    model = Sequential()
    model.add(Conv2D(conv_arch[0][0], kernel_size=(3, 3), strides=3, padding='same', activation='relu', data_format='channels_first', input_shape=(1, image_data_train.shape[2], image_data_train.shape[3])))

    if (conv_arch[0][1] - 1) != 0:
        for i in range(conv_arch[0][1] - 1):
            model.add(Conv2D(conv_arch[0][0], kernel_size=(3, 3), strides=1, padding='same', activation='relu'))
        model.add(MaxPooling2D(pool_size=2))

    if conv_arch[1][1] != 0:
        for i in range(conv_arch[1][1]):
            model.add(Conv2D(conv_arch[1][0], kernel_size=(3, 3), strides=1, padding='same', activation='relu'))
        model.add(MaxPooling2D(pool_size=2))

    if conv_arch[2][1] != 0:
        for i in range(conv_arch[2][1]):
            model.add(Conv2D(conv_arch[2][0], kernel_size=(3, 3), strides=1, padding='same', activation='relu'))
        model.add(MaxPooling2D(pool_size=2))

    # Print data shape through network for debugging
    for z in range(len(model.layers)):
        print("{} : {} --> {}".format(z, model.layers[z].input_shape, model.layers[z].output_shape))

    model.add(Flatten())  # this converts 3D feature maps to 1D feature vectors

    if dense[1] != 0:
        for i in range(dense[1]):
            model.add(Dense(dense[0], activation='relu'))
            if dropout:
                model.add(Dropout(dropout))

    prediction = model.add(Dense(label_data_train.shape[1], activation='softmax'))

    # optimizer:
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

    return model

log.py

import os

import pandas as pd


def print_architecture(image_data_shape, label_data_shape, batch_size, dropout, epochs, conv_arch, dense):
    print(' image data shape: ', image_data_shape)  # (n_sample, 1, 48, 48)
    print(' label data shape: ', label_data_shape)  # (n_sample, n_categories)
    print('      img size: ', image_data_shape[2], image_data_shape[3])
    print('    batch size: ', batch_size)
    print('        epochs: ', epochs)
    print('       dropout: ', dropout)
    print('conv architect: ', conv_arch)
    print('neural network: ', dense)


def time_difference(start, end):
    return '{}_min_{}_sec'.format(end.time().minute - start.time().minute,
                                  end.time().second - start.time().second)


def save_config(formatted_val_acc, start_time, config, dirpath='../data/results/'):
    with open(dirpath + formatted_val_acc + '-' + 'config_log.txt', 'a') as f:
        f.write(start_time.isoformat() + '\n')
        f.write(str(config) + '\n')


def save_model(formatted_val_acc, start_time, json_string, dirpath='../data/results/'):
    with open(dirpath + formatted_val_acc + '-' + start_time.isoformat() + '_model.txt', 'w') as f:
        f.write(json_string)


def save_result(start_time, end_time, train_acc, val_acc, conv_arch, batch_size, epochs, dense, dropout, dirpath='../data/results/'):
    with open(dirpath + 'result_log.txt', 'a') as f:
        f.write(start_time.isoformat() + ' -> ' + end_time.isoformat() + '\n')
        f.write('  batch size: ' + str(batch_size) +
                '\n    epochs: ' + str(epochs) +
                '\n   dropout: ' + str(dropout) +
                '\n      conv: ' + str(conv_arch) +
                '\n     dense: ' + str(dense) +
                '\n  - Train acc: ' + str(train_acc[-1]) +
                '\n  - Val acc: ' + str(val_acc[-1]) +
                '\n  - Ratio: ' + str(val_acc[-1] / train_acc[-1]) + '\n\n')


# def append_to_result_log(text):
#     with open('../data/results/result_log.txt', 'a') as f:
#         f.write('\n' + text + '\n')


def my_log(model, start_time, end_time, batch_size, epochs, conv_arch, dense, dropout, image_data_shape, train_acc, val_acc, dirpath):
    if (val_acc[-1] > 0.5):
        formatted_val_acc = "{:.4f}".format(val_acc[-1])
        model.save_weights('../data/weights/{}-{}'.format(formatted_val_acc, start_time))
        save_model(formatted_val_acc, start_time, model.to_json(), dirpath)
        save_config(formatted_val_acc, start_time, model.get_config(), dirpath)
    save_result(start_time, end_time, train_acc, val_acc, conv_arch, batch_size, epochs, dense, dropout, dirpath)
    save_as_csv(start_time, end_time, train_acc, val_acc, conv_arch, batch_size, epochs, dense, dropout, image_data_shape, dirpath)


def save_as_csv(start_time, end_time, train_acc, val_acc, conv_arch, batch_size, epochs, dense, dropout, image_data_shape, dirpath):
    data = {
        'start_time': start_time,
        'end_time': end_time,
        'duration': time_difference(start_time, end_time),
        'batch_size': batch_size,
        'epochs': epochs,
        'conv_arch': conv_arch,
        'dense': dense,
        'dropout': dropout,
        'image_width': image_data_shape[2],
        'image_height': image_data_shape[3],
        'train_acc': train_acc,
        'val_acc': val_acc
    }
    df = pd.DataFrame(dict([(k, pd.Series(v)) for k, v in data.iteritems()]))

    filepath = dirpath + 'results.csv'
    if not os.path.isfile(filepath):
        df.to_csv(filepath, index=False, sep='#', escapechar='^', header='column_names')
    else:  # else it exists so append without writing the header
        df.to_csv(filepath, index=False, sep='#', escapechar='^', mode='a', header=False)

我有类似的问题。使用 TensorBoard 回调时出现此问题histogram_freq参数大于0。

在创建模型之前清除张量流会话修复了它

import keras.backend as K
K.clear_session()

(由此issue https://github.com/keras-team/keras/issues/4417#issuecomment-384502287在喀拉拉邦)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keras 回调导致错误:您必须使用 dtype float 为占位符张量“conv2d_1_input”提供一个值 的相关文章

随机推荐