Keras Valueerror:从未调用过此模型

2024-05-13 23:25:29 发布

您现在位置:Python中文网/ 问答频道 /正文

这应该是非常简单的Keras程序。它一直工作到最后一行代码。但我称之为预测法。当然,我使用的输入数据和训练数据是一样的,但这不重要。

from keras.models import Sequential
import pandas as pd

url = 'https://raw.githubusercontent.com/werowe/logisticRegressionBestModel/master/KidCreative.csv'

data = pd.read_csv(url, delimiter=',')

labels=data['Buy']
features = data.iloc[:,2:16]

model = Sequential()
model.compile(optimizer='rmsprop' ,loss='binary_crossentropy',metrics=['accuracy'])
model.fit(data, labels, epochs=10, batch_size=32)
model.evaluate(labels, features, batch_size=128)
model.predict(labels)
model.summary()

但我有个错误:

model.summary()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/walker/tf3/lib/python3.4/site-packages/keras/engine/network.py", line 1263, in summary
    'This model has never been called, this its weights '
ValueError: This model has never been called, this its weights have not yet been created, so no summary can be displayed. Build the model first (e.g. by calling it on some test data).

Tags: csv数据importurldatasizelabelsmodel
3条回答

感谢Matias Valdenegro,我添加了一些输入层并更改了loss函数。现在可以了:

import tensorflow as tf
from keras.models import Sequential
import pandas as pd
from keras.layers import Dense

url = 'https://raw.githubusercontent.com/werowe/logisticRegressionBestModel/master/KidCreative.csv'

data = pd.read_csv(url, delimiter=',')

labels=data['Buy']
features = data.iloc[:,2:16]

model = Sequential()

model.add(Dense(units=64, activation='relu', input_dim=1))
model.add(Dense(units=14, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])

model.fit(labels, features,
          batch_size=12,
          epochs=10,
          verbose=1,
          validation_data=(labels, features))

model.evaluate(labels, features, verbose=0)

model.summary()

第一步应该是实际构建一个模型,而这不是你所做的;即在model = Sequential()之后,应该有一些model.add语句来构建模型,然后编译、拟合它,并使用它进行评估或获取其摘要。

与其从一些质量不明确的回购协议中获得指导,不如从官方示例和教程开始-例如,在这里复制的Keras MNIST CNN example;仅与模型相关的部分,我们得到:

model = Sequential()
# no model built, as in your case
model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])

这应该已经给出一个错误:

TypeError: Sequential model cannot be built: model is empty. Add some layers first.

我很惊讶你没有报告你的案子。

下面是我们应该做的事情(同样,请参阅链接了解详细信息):

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])

model.summary()
# works OK

正如@desertnaut所说,在调用mode.summary()之前,必须在模型中包含层。

编辑:我想添加这一点,即使您的模型具有层model.summary()可能无法工作,如果它在第一层中没有“input_shape”。

因为在顺序模型中,每一层的输入尺寸(因此参数的数量)是使用前一层的输出尺寸计算的,但是要开始第一层的链输入尺寸是需要的。因此,如果没有输入维度,就不可能生成模型的摘要。

注意:如果您没有显式地指定输入维度,那么当您第一次调用fit()时,keras会发现它。因此,如果不指定输入形状,则需要在model.summary()之前调用model.fit()

相关问题 更多 >