Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 建立神经网络[TensorFlow 2.0]模型子分类-值错误/类型错误_Python 3.x_Keras_Neural Network_Tensorflow2.0 - Fatal编程技术网

Python 3.x 建立神经网络[TensorFlow 2.0]模型子分类-值错误/类型错误

Python 3.x 建立神经网络[TensorFlow 2.0]模型子分类-值错误/类型错误,python-3.x,keras,neural-network,tensorflow2.0,Python 3.x,Keras,Neural Network,Tensorflow2.0,我正在使用TensorFlow 2.0和Python 3.7.5构建一个使用模型子分类方法的虹膜分类神经网络 我的守则如下: import tensorflow as tf from tensorflow.keras import Sequential, Model from tensorflow.keras.layers import Dense, Input import pandas as pd import numpy as np # Read in data- data = pd.

我正在使用TensorFlow 2.0和Python 3.7.5构建一个使用模型子分类方法的虹膜分类神经网络

我的守则如下:

import tensorflow as tf
from tensorflow.keras import Sequential, Model
from tensorflow.keras.layers import Dense, Input
import pandas as pd
import numpy as np


# Read in data-
data = pd.read_csv("iris.csv")

# Get data types for different attributes-
data.dtypes
'''
sepallength    float64
sepalwidth     float64
petallength    float64
petalwidth     float64
class           object
dtype: object
'''


# Get shape of data-
data.shape
# (150, 5)


# Check for missing values-
data.isnull().values.any()
# False

# Perform label encoding for target variable-

# Initialize a label encoder-
le = LabelEncoder()

# Label encode target attribute-
data['class'] = le.fit_transform(data['class'])

# Get different classes which are label encoded-
le.classes_
# array(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], dtype=object)

# Split data into features (X) and target (y)-
X = data.drop('class', axis = 1)
y = data['class']


# Get training & testing sets using features and labels-
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# Convert from Pandas to numpy arrays-
X_train = X_train.to_numpy()
X_test = X_test.to_numpy()

y_train = y_train.to_numpy()
y_test = y_test.to_numpy()

print("\nTraining and Testing set dimensions:")
print("X_train.shape = {0}, y_train.shape = {1}".format(X_train.shape, y_train.shape))
print("X_test.shape = {0}, y_test.shape = {1}\n".format(X_test.shape, y_test.shape))
# Training and Testing set dimensions:
# X_train.shape = (105, 4), y_train.shape = (105,)
# X_test.shape = (45, 4), y_test.shape = (45,)



class IrisClassifier(Model):

    def __init__(self):
        super(IrisClassifier, self).__init__()

        '''
        self.layer1 = Dense(
            units = 4, activation = 'relu',
            kernel_initializer = tf.keras.initializers.GlorotNormal()
            )
        '''

        self.input_layer = Input(
            shape = (4,)
            )

        self.layer1 = Dense(
            units = 10, activation = 'relu',
            input_dim = 4,
            kernel_initializer = tf.keras.initializers.GlorotNormal()
            )

        self.layer2 = Dense(
            units = 10, activation = 'relu',
            kernel_initializer = tf.keras.initializers.GlorotNormal()
            )

        self.outputlayer = Dense(
            units = 3, activation = 'softmax'
            )


    def call(self, x):
        x = self.input_layer(x)
        x = self.layer1(x)
        x = self.layer2(x)
        # x = self.layer3(x)

        return self.outputlayer(x)


# Instantiate a model of defined neural network class-
model = IrisClassifier()

# Define EarlyStopping callback-
callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3)

# Compile defined model-
model.compile(
    optimizer=tf.keras.optimizers.Adam(lr = 0.001),
    loss = 'sparse_categorical_crossentropy',
    metrics = ['accuracy']
     )


# Train model-
history2 = model.fit(
    x = X_train, y = y_train,
    validation_data = [X_test, y_test],
    epochs = 50, batch_size = 16,
    callbacks = [callback]
    )
当我执行'history2'代码时,我得到以下错误:

---------------------------------------------------------------------------ValueError回溯(最近的调用 最后)在 3验证数据=[X检验,y检验], 4个时代=50,批次大小=16, ---->5回调=[回调] (六)

~/.local/lib/python3.7/site-packages/tensorflow\u core/python/keras/engine/training.py 适合(自我、x、y、批量大小、时代、详细、回调、, 验证分割、验证数据、洗牌、等级权重、, 样本重量、初始历元、每历元步骤、验证步骤、, 验证频率、最大队列大小、工人、使用多处理、, **kwargs) 726最大队列大小=最大队列大小, 727名工人=工人, -->728使用多处理=使用多处理) 729 730 def评估(自我

~/.local/lib/python3.7/site-packages/tensorflow\u core/python/keras/engine/training\u arrays.py 适合(自我、型号、x、y、批量大小、年代、详细、回调、, 验证分割、验证数据、洗牌、等级权重、, 样本重量、初始历元、每历元步骤、验证步骤、, 验证频率,**kwargs) 640步=每个历元的步数, 641验证分割=验证分割, -->642随机播放=随机播放) 643 644如果验证数据:

~/.local/lib/python3.7/site-packages/tensorflow\u core/python/keras/engine/training.py 标准化用户数据(自身、x、y、样本重量、类别重量、, 批量大小、检查步骤、步骤名称、步骤、验证、拆分、洗牌、, 从_数据集)2417中提取_张量#首先,我们构建模型 如有必要,随时准备。2418如果不是自输入: ->2419所有输入,y输入,dict输入=self。使用输入(x,y)2420构建模型称为构建= 真2421其他:

~/.local/lib/python3.7/site-packages/tensorflow\u core/python/keras/engine/training.py 输入(自身、输入、目标)为2580的内置模型;或 数组列表,并从传递的 2581#结构。 ->2582培训实用程序。验证输入类型(输入,原始输入)2583 2584如果存在(输入,(列表,元组)):

~/.local/lib/python3.7/site-packages/tensorflow\u core/python/keras/engine/training\u utils.py 在验证输入类型(输入、原始输入、允许输入、字段名称)1149中 raise VALUE ERROR(1150'请作为型号输入提供 单个数组或' ->1151'数组。您传递了:{}={}'。格式(字段名称,orig_inp))1152 1153

ValueError:请提供单个数组或 数组列表。您通过了:inputs=separalength separawidth 瓣长瓣宽117 7.7 3.8 6.7
2.2 7 5.0 3.4 1.5 0.2 73 6.1 2.8 4.7 1.2 92 5.8 2.6 4.0 1.2 87 6.3 2.3 4.4 1.3 .. ... ... ... ... 93 5.0 2.3.3 1.0 30 4.8 3.1 1.6 0.2 25 5.0 3.0 1.6 0.2 31 5.4 3.4 1.5 0.4 97 6.2 2 2.9 4.3 1.3

[105行x 4列]

将X_-train、y_-train、X_-test和y_-test转换为numpy数组后,当我执行history2来训练模型时,我得到以下错误:

TypeError:在转换的代码中:

改为“str”类型的“collections”

怎么了


谢谢

您的问题源于在将数据拟合到模型之前对数据进行预处理的方式

很可能是您从iris传递了整个csv数据集,包括列标题,从而导致了问题。您可以从中验证这一点

“您通过了:输入=separalength separalwidth petalalength petalwidth 117 7.7 3.8 6.7”


确保Xs和ys不包含列名,而只包含值。使用
X\u train=X\u train.to\u numpy()
确保转换工作正常。在旧版本中,您也可以使用
X\u train.values
,但后者已被弃用。

我解决了这个问题。根据Francois Chollet的说法:

子类模型是一段Python代码(调用方法)。有 这里没有图层图。我们无法知道层是如何连接到的 彼此(因为这是在调用体中定义的,而不是 显式数据结构),因此我们无法推断输入/输出形状

因此,以下代码运行良好(不指定输入训练数据形状):


谢谢

请至少投票,因为它解决了你的第一个问题。如果你有其他问题,请问另一个问题,而不是在一个问题中有一系列问题。谢谢,这不是一系列的问题。在我将培训和测试集转换为numpy(如您所建议)之后,我遇到了一个新错误,即TypeError。到目前为止,我还没有在上一期中运行过,我正在进行研究以帮助您。如果您注意的话,我会对您的其他问题给出类似的回答。很高兴你解决了这个问题DI正在寻找我在回答中引用的解释,因为这提供了清晰的解释。但是,谢谢D
<ipython-input-14-ae6111e00410>:34 call  *
    x = self.input_layer(x)
/home/arjun/.local/lib/python3.7/site-packages/tensorflow_core/python/autograph/impl/api.py:427
TypeError: Expected float32 passed to parameter 'y' of op 'Equal', got 'collections' of type 'str' instead. Error: Expected float32, got
# Define EarlyStopping callback-
callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3)

class IrisClassifier(Model):

    def __init__(self):
        super(IrisClassifier, self).__init__()

        self.layer1 = Dense(
            units = 10, activation = 'relu',
            # input_dim = 4,
            kernel_initializer = tf.keras.initializers.GlorotNormal()
            )

        self.layer2 = Dense(
            units = 10, activation = 'relu',
            kernel_initializer = tf.keras.initializers.GlorotNormal()
            )

        self.outputlayer = Dense(
            units = 3, activation = 'softmax'
            )


    def call(self, x):
        # x = self.input_layer(x)
        x = self.layer1(x)
        x = self.layer2(x)
        # x = self.layer3(x)
        return self.outputlayer(x)


# Instantiate a model of defined neural network class-
model2 = IrisClassifier()


# Compile defined model-
model2.compile(
    optimizer=tf.keras.optimizers.Adam(lr = 0.001),
    loss = 'sparse_categorical_crossentropy',
    metrics = ['accuracy']
     )


# Train model-
history2 = model2.fit(
    x = X_train, y = y_train,
    validation_data = [X_test, y_test],
    epochs = 50, batch_size = 16,
    callbacks = [callback]
    )